通常情況下安卓下數據的傳遞有下面幾種方法:
1.通過intent傳遞,包括顯式意圖和隱式意圖,廣播(Broadcast)和服務都能通過Intent傳遞
傳遞的數據類型包括8大基本數據類型 實現Parcelable或Serializable接口的類型 以及集合數組類型
2.靜態變量傳遞 在工具類下 聲明一個Object類型的靜態變量 在A中將要傳遞的值,在B中通過這個靜態變量取出來
3.通過handle在不同的線程中傳遞Object類型的數據
4.通過構造方法傳遞Object類型的數據
5.通過SharedPreferences傳遞八大基本數據類型
6.通過ContentProvider在進程間共享數據
7.通過aidl在進程進程傳遞數據
8.通過流(本地文件)傳遞八大基本數據類型和實現Serializable接口的數據類型
9.通過基類中的屬性或者方法
屬性: 基類公有屬性 在某個子類中賦值 其他子類中都能使用
方法: 子類調用父類的某個方法給父類某個屬性賦值 另外一個子類通過父類的另一個公有方法獲取這個值(這個方法把值返回)
10.通過上下文對象Context傳遞
先說, activity和adapter或者activity和fragment
1.將這個Context強轉成MainActivity對象
他們之間數據傳遞的橋梁是context這個上下文對象,這個context對象就是我們的Activity,
那么這個context就是MainActivity的實例化對象,我們可以將這個Context強轉成MainActivity對象,再和MainActivity進行通信
2.如果是adapter,我們就在MainActivity中添加一個帶參數的方法,在adapter通過剛剛強轉的MainActivity對象,調剛剛創建的這個方法,參數就是我們要傳遞的數據
如果是fragment,我們通過上邊的方法可以與MainActivity傳遞數據
再說, 在fragment間傳遞數據
1.在MainActivity中創建一個方法能夠將所有的Fragment返回(一般fragment放在一個集合中)
在 Fragment2(接受數據)中創建一個帶參數(要傳遞的數據)的方法
2.傳遞數據:在某個fragment中1(傳遞數據)獲取到強轉的MainActivity對象,根據這個對象獲取的需要傳遞數據的Fragment2的實例化對象,再根據Fragment2的實例化對象,調那個帶參數的方法,把數據傳遞過去
11.通過EventBus傳遞Object類型的數據
簡單地介紹下EventBus的使用
EventBus在在使用的時候有點像廣播,使用步驟如下:
1.在接收信息的類中需要注冊EventBus在不需要的時候將EventBus注銷掉.
2.發送消息的地方傳遞兩個參數,第一個參數是Object,第二個參數是一個任意類型的標記
3.在接受數據的地方創建一個方法,並加上注解,注解的標記和上邊的標記相同 這個方法的參數類型也必須和第2步中第一個參數的類型相同
EventBus與廣播相比,優點在於:EventBus在基類中注冊,那么所有繼承基類的子類相當於都注冊了EventBus,舉個例子:我在BaseActivity的onCreat中
注冊了EventBus,那么只要繼承的EventBus的Activity都注冊了EventBus,這一點我感覺非常方便,還有一點發送數據的時候不需要上下文對象(Context)
下邊看代碼:
1.在MainActivity中注冊EventBus
- public class MainActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- EventBus.getDefault().register(this);//注冊事件
- findViewById(R.id.button).setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- startActivity(new Intent(MainActivity.this,
- SecondActivity.class));
- }
- });
- }
- @Subscriber(tag = "zheng") //標記和發送消息的標記一樣的,包括類型和值都必須一樣
- public void onRecieve(String result) {//這個參數是傳遞過來的數據 類型亦必須一樣
- Toast.makeText(this, result, Toast.LENGTH_SHORT).show();
- }
- @Override
- protected void onDestroy() {
- super.onDestroy();
- EventBus.getDefault().unregister(this);//注銷事件
- }
- }
2.在SecondActivity中發消息
- public class SecondActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_second);
- findViewById(R.id.button).setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {// 發送消息
- EventBus.getDefault().post("zhengjiao", "zheng");//第一個是要傳遞的數據 第二個參數是標記
- }
- });
- }
- }
注意
1.常見問題:消息接受不到,一般情況下 必須在發送消息之前先注冊 注冊的話就必須先開啟這個界面,才能執行到onCreate中的方法,這樣才相當於注冊了
2.點擊這里下載源碼