Android元件之間 資料傳遞資料
自:http://blog.csdn.net/buaaroid/article/details/49665455
1 基於訊息的通訊機制 Intent--------bundle,extra
用這種簡單的形式,一般而言傳遞一些簡單的型別是比較容易的,如int、string等
詳細介紹下Intent機制
Intent包含兩部分:
1 目的【action】-------要去到哪裡去
2 內容【category、data】----------路上帶些什麼,區分性資料和內容性資料
簡單資料傳遞:
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
intent.putExtra("flag", flag);
startActivity(intent);
////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////
String flag = " ";
Intent intent1 = this.getIntent();
flag = intent1.getStringExtra("flag");
////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////
資料型別有限,遇到不可序列化的資料Bitmap,Inputstream,或者是LinkList連結串列等資料型別就不太好用了
2 基於靜態變數,static靜態資料,public static成員變數
我們千萬不要以為Davlik虛擬機器的垃圾回收器會幫助我們回收不需要的記憶體垃圾。事實上,回收器並不可靠,
尤其是手機上,是更加的不可靠。 因此,除非我們要使自己的程式變得越來越糟糕,否則儘量遠離static。
注:如果經常使用static的Bitmap、Drawable等變數。可能就會丟擲一個在Android系統中非常著名的異常(
以前budget這個單詞一直記不住什麼意思,自從經常丟擲這個異常後,這個單詞終於爛熟於心了,)
ERROR/AndroidRuntime(4958): Caused by: java.lang.OutOfMemoryError:bitmap size exceeds VM budget 注:如果經常使用static的Bitmap、Drawable等變數。可能就會丟擲一個在Android系統中非常著名的異常(以前budget這個單詞一直記不住什麼意思,自從經常丟擲這個異常後,這個單詞終於爛熟於心了,)
3 基於儲存資料的傳輸 ,File/Preference/Sqlite/網路等,如果要針對第三方應用需要Content provider
作為一個完成的應用程式,資料儲存操作是必不可少的。因此,Android系統一共提供了四種資料儲存方式。
分別是:SharePreference、SQLite、Content Provider和File。由於Android系統中,資料基本都是私有的的
,都是存放於“data/data/程式包名”目錄下,所以要實現資料共享,正確方式是使用Content Provider。
SQLite: SQLite是一個輕量級的資料庫,支援基本SQL語法,是常被採用的一種資料儲存方式。Android
為此資料庫提供了一個名為SQLiteDatabase的類,封裝了一些操作資料庫的API。
SharedPreference: 除SQLite資料庫外,另一種常用的資料儲存方式,其本質就是一個xml檔案,常用於
儲存較簡單的引數設定。
File: 即常說的檔案(I/O)儲存方法,常用語儲存大數量的資料,但是缺點是更新資料將是一件困難的
事情。
ContentProvider: ContentProvider是安卓平臺中,在不同應用程式之間實現資料共享的一種機制。一個
應用程式如果需要讓別的程式可以操作自己的資料,即可採用這種機制。並且此種方式忽略了底層的資料儲存
實現,ContentProvider提供了一種統一的通過Uri實現資料操作的方式。
詳細介紹使用過程
File 通過檔案內容的讀取傳遞資料
Preference: SharedPreferences也是一種輕型的資料儲存方式,它的本質是基於XML檔案儲存key-value鍵值
對資料,通常用來儲存一些簡單的配置資訊
SharedPreferences物件本身只能獲取資料而不支援儲存和修改,儲存修改是通過Editor物件實現。實現
SharedPreferences儲存的步驟如下:
一、根據Context獲取SharedPreferences物件
二、利用edit()方法獲取Editor物件。
三、通過Editor物件儲存key-value鍵值對資料。
四、通過commit()方法提交資料。
SharedPreferences sp=getSharedPreferences("login",0);//login儲存檔名 SharedPreferences.Editor se=sp.edit();; se.putString("server", logEdit.getText().toString()); se.putString("port", portEdit.getText().toString()); se.commit();////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////
SharedPreferences ps=getSharedPreferences("login",0);//login是儲存檔案 server=ps.getString("server", ""); port=ps.getString("port", ""); logEdit.setText(server); portEdit.setText(port);////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////
ContentProvider
其步驟為:
1. 在當前應用程式中定義一個ContentProvider。
2. 在當前應用程式的AndroidManifest.xml中註冊此ContentProvider
3. 其他應用程式通過ContentResolver和Uri來獲取此ContentProvider的資料。
在程式A中,繼承ContProvider類,並重寫其中的方法
public class MyProvider extends ContentProvider{ @Override public int delete(Uri uri, String selection, String[] selectionArgs) { // TODO Auto-generated method stub return 0; } @Override public String getType(Uri uri) { // TODO Auto-generated method stub return null; } @Override public Uri insert(Uri uri, ContentValues values) { return null; } //在Create中初始化一個數據庫 @Override public boolean onCreate() { SQLiteDatabase db = this.getContext().openOrCreateDatabase("test_db.db3", Context.MODE_PRIVATE, null); db.execSQL("create table tab(_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL)"); ContentValues values = new ContentValues(); values.put("name", "test"); db.insert("tab", "_id", values); db.close(); return true; } //實現query方法 @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { SQLiteDatabase db = this.getContext().openOrCreateDatabase("test_db.db3", Context.MODE_PRIVATE, null); Cursor c = db.query("tab", null, null, null, null, null,null); return c; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { // TODO Auto-generated method stub return 0; } }在其AndroidManifest.xml中宣告此ContentProvider,其中authorities屬性定義了此ContentProvider的Uri
標識。
<provider android:name=".MyProvider" android:authorities="com.test.MyProvider"/>
在應用程式B中,通過ContentResolver獲取程式A的ContentProvider中的資料。
public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //獲取上下文 Context ctx = MainActivity.this; //獲取ContentResolver物件 ContentResolver resolver = ctx.getContentResolver(); //獲取Uri物件 Uri uri = Uri.parse("content://com.test.MyProvider"); //獲取資料 Cursor c = resolver.query(uri, null, null, null, null); c.moveToFirst(); for(int i=0; i<c.getCount(); i++){ int index = c.getColumnIndexOrThrow("name"); String src = c.getString(index); Log.d("", src); c.moveToNext(); } } }再觀察兩個應用程式的結構,A的程式結構,可以清楚看到其有一個名為“test_db.db3”的資料庫,B的程
序結構,其並沒有任何資料庫用於儲存資料。由此圖,可以確定應用程式B中查詢出來的資料結果是來自於應
用程式A。
以上就是ContentProvider的使用方式,這種儲存方式相比SQLite和SharedPreferences,其複雜性是顯而易見
的,但是在處處可見“雲”的今天,程式間的資料互動需求令ContentProvider儲存機制變成必不可少的一部
分。
4 基於Ipc的通訊機制context與service之間的傳輸,如Activity與Service之間的通訊
5 基於Application ,Application Context------在Application中定義變數或相應的方法
在一個activity初始化一個ArrayList<HashMap<Sting,Map>>物件,然後經過一個tableactivity,在傳遞到另
外一個activity,一開始直接考慮用putExtra,測試發現數據只能傳遞一次,就考慮用Application傳遞 Java裡面通常是用一個static的變數(例如singleton之類的)來同步activity之間(程式裡面類之間)的狀態。在android裡面比較靠譜的做法是用application context來關聯這些狀態。 每個activity都是context,裡面包含了執行時的狀態。同樣application也有一個context,android會保證這個context是唯一的例項。package net.blogjava.mobile1;
import android.app.Application; import android.graphics.Bitmap; public class MyApp extends Application { private Bitmap mBitmap; public Bitmap getBitmap() { return mBitmap; } public void setBitmap(Bitmap bitmap) { this.mBitmap = bitmap; } } <application android:name=".MyApp" android:icon="@drawable/icon" android:label="@string/app_name"> </application> 獲得Bitmap物件的程式碼: ImageView imageview = (ImageView)findViewById(R.id.ivImageView); MyApp myApp = (MyApp)getApplication(); imageview.setImageBitmap(myApp.getBitmap());上面兩段程式碼可以在任何的Service、Activity中使用。全域性的
相關推薦
Android Acitivity之間如何傳遞資料
【IT168技術】任何控制類程式都有一個入口,彙編程式的入口由處理器內部的復位(Reset)中斷向量表決定;C程式的入口是main()函式,一個C程式只能有一個main()函式;Java程式的入口必須是某個類的靜態成員函式main()。 對於依賴於作業系統的程式,客
Android元件之間 資料傳遞資料
自:http://blog.csdn.net/buaaroid/article/details/49665455 1 基於訊息的通訊機制 Intent--------bundle,extra 用這種簡單的形式,一般而言傳遞一些簡單的型別是比較容易的,如int、st
綜述種類:Android元件之間 資料傳遞方法
部落格時間:2012-06-06 18:27 ------------------------------------------- 思路 1通過共享appication做處理 2 先轉換成json,第二個activity再轉換回list3 Parcelable S
React從0到1--元件向外傳遞資料
通過props向外傳遞資料 在父元件ClickCounter檔案裡面 constructor(props){ super(props); this.onCounterUpdate = this.onCounterUpdate.bind(this); this.initValues = [
activity與fragment之間的傳遞資料
首先activity之間的資料傳遞就是 用intent和intent+bundle intent 傳遞 Intent i= new Intent(MainActivity.this,TheAty.class); i.putExtra("date","Hello
Vue 中父元件和子元件之間獲取對方資料和方法
父元件獲取子元件的資料和方法 one 在父元件中呼叫子元件時,定義一個ref(其實和選擇器類似): <Common ref="commonChild" :pathologyId="form.pathologyId" /> 在父元件中獲取子元件屬性和方
Android介面回撥傳遞資料
一 、回撥函式回撥函式就是一個通過函式指標呼叫的函式。如果你把函式的指標(地址)作為引數傳遞給另一個函式,當這個指標被用為呼叫它所指向的函式時,我們就說這是回撥函式。回撥函式不是由該函式的實現方直接呼叫,而是在特定的事件或條件發生時由另外的一方呼叫的,用於對該事件或條件進行
多級元件巢狀傳遞資料,$attrs和inheritAttrs用法
我們在vue的父子元件傳值的時候,我們先在需要的子元件上用props註冊一些屬性,然後父元件呼叫的時候當屬性來傳值。 如果我們給child傳props沒有註冊的屬性,我們就要用$attrs來取了。 現有父元件A和子元件B: 元件A的內容如下: <template>
兩個Fragment之間如何傳遞資料
FragmentA啟動FragmentB,做一些選擇操作後,返回FragmentA,需要把FragmentB裡面選擇的資料傳回來。有什麼辦法? Fragment之間不能直接通訊,必須通過Activity來完成,具體步驟。 1. 在FragmentA中定義通訊介面,通過該介面向Activity傳送資料。
Android網路程式設計之傳遞資料給伺服器(二)
我曾在《Android網路程式設計之傳遞資料給伺服器(一) 》一文中介紹瞭如何通過GET方式傳遞資料給伺服器,通過GET方式傳遞資料主要適用於資料大小不超過2KB,且對安全性要求不高的情況下。下面就介紹通過POST方式傳遞資料主到伺服器。 一、通過P
android利用廣播(BroadcastReceiver)傳遞資料
利用廣播傳遞資料,肯定需要用Intent或者bundle,那首先第一步: 一、註冊廣播接收器 public class MainActivity extends AppCompatActivity { MyReceiver myReceiver; @Overrid
Android 最全 Intent 傳遞資料姿勢
點選上面藍色字型關注“IT大飛說” 置頂公眾號(ID:ITBigFly)第一時間收到推送 作為一個 Android 開發人員,我們都是用過 Intent,用它來在元件之間傳遞資料,所以說 Intent 是元件之間通訊的使者,一般情況下,我們傳遞的都
ViewPager + Fragment處理兩個Fragment的點選跳轉以及之間的傳遞資料
處理兩個Fragment的點選跳轉與在自定義元件中設定監聽的處理方式差不多,由於兩個Fragment都有一個共同的Activity而Activity通過其Viewpager的setCurrentItem(int position)可以設定顯示第幾個Fragmen
Android -- 啟動Service並傳遞資料
本文主要記錄Activity傳遞資料到Service。 原始碼與上一篇基本是保持一致的,只是在跳轉過程中增加了引數的傳遞。 我們先來看效果。 1、效果圖 2、通過以上效果圖,可以看出
3. 呼叫另一個Activity,並兩個Activity之間相互傳遞資料
一,在一個Activity中呼叫另一個Activity 利用 android.content.Intent 物件實現從一個Activity跳轉到另一個Activity 例如:從FirstActivity跳轉到SecondActivity /* 關鍵程式碼
Android activity與service傳遞資料
方式一:Activity向Service傳遞資料 在activity中,設定要傳遞的值。 Intent intent = new Intent(Main.this, DownloadS
android訊息廣播Intent傳遞資料
1.建立佈局檔案activity_broadcast.xml<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/a
如何在小程式頁面之間,傳遞資料和變數?
最近組裡開發小程式,遇到了一個困擾前端很長時間的話題:頁面之間,如何傳遞資料和變數? 剛開始,我們選擇使用路徑傳參解決。但是眾所周知,各瀏覽器 HTTP Get 請求 URL 最大長度並不相同,大部分瀏覽器只能接受 7000 個字元的資料。 所以,我們覺得這個方式並不靠譜。
兩個dialog之間如何傳遞資料
CDlg1::OnButton1() { CDlg2 dlg2; dlg2.m_str = _T( "你好 "; ) dlg2.m_bJudge = TRUE; dlg2.DoModal(); } //Dlg2.h public: CString m_str; BOOL
訊息傳遞機制之元件之間訊息傳遞
通常在元件之間傳遞訊息,我們會採用廣播形式 , 自定義介面形式 , EventBus來實現BroadCastReceiver建立廣播private BroadcastReceiver receiver = new BroadcastReceiver() { @Over