Android 應用內資料傳遞
Android開發過程中,經常遇到APP內部(例如不同頁面間)資料傳遞的問題,簡單整理記錄這些資料傳輸的方式。貼上上程式碼,方便以後複製貼上。
一 SharePrefences
其實,把SharePrefence放到這裡不合適。SharePrefence是用來儲存少量資料的方式,如儲存程式配置資訊等。基本上應用內任何地方均能獲取到已經儲存到的資料。SharePrefences的原始碼如下所示:
/** * 儲存資訊 */ private void setMessage() { SharedPreferences sp = this.getPreferences(MODE_PRIVATE); SharedPreferences.Editor editor = sp.edit(); editor.putString("id", et_input.getText().toString()); editor.commit(); } /** * 獲取資訊 */ private void getMessage() { SharedPreferences sp = this.getPreferences(MODE_PRIVATE); String id = sp.getString("id", "error"); tv_result.setText(id); }
注意一下獲取SharePrefence物件的一個引數,支援三種模式:
- MODE_PRIVATE:只支援本程式讀寫
- MODE_WORLD_READABLE:允許其它應用程式讀
- MODE_WORLD_WRITEABLE :允許其它應用程式寫
editor物件可以插入一個鍵值對,值可以是大部分資料型別。
SharePrefences物件可以獲取要相應資料型別,第2個引數為獲取不到資料時的DefaultValues。
這種方式比較簡單,不再做解釋。
二 廣播
廣播是四大元件之一,可以同一個app或者多個app之間通訊。當然,也是比較常見的傳遞資料的方式。
當然廣播作為四大元件有很多技巧點,這裡只是簡單的貼出動態廣播
簡單來說,就是在一個頁面通過Intent傳送廣播,在另一個頁面註冊廣播接收器實時監聽傳送的內容。倆部分程式碼如下。
public class MyStaticBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //監聽廣播 switch (intent.getAction()) { case "ACTION": String message = intent.getStringExtra("ID"); tv_result.setText(message); break; } } } /** * 註冊廣播接收器 */ private void registerBroad() { IntentFilter filter = new IntentFilter(); filter.addAction("ACTION"); MyStaticBroadcastReceiver myStaticBroadcastReceiver = new MyStaticBroadcastReceiver(); registerReceiver(myStaticBroadcastReceiver, filter); } /** * 傳送訊息 */ private void setMessage() { Intent intent = new Intent(); intent.setAction("ACTION"); intent.putExtra("ID", et_input.getText().toString()); sendBroadcast(intent); }
一個接收器可以IntentFilter 的addAction動作新增多個廣播的監聽,同時也是通過Action區別不同廣播發送的訊息。
三 回撥介面
回撥介面也是一個比較經典的資料傳遞方式了,比如fragement,activity之間進行資料傳遞,當然,上面倆種方式也能完成目標。但是,廣播的頻繁與大量註冊勢必會影響應用的效能(我就被坑的比較深),所以還是需要使用回撥介面。
1 建立一個回撥介面。定義一個
public interface CallBack {
void doSomething(String message);
}
2 建立一個介面工具類。
這個類需要一個CallBack型別的引數變數,定義一個set方法傳入這個變數。為了實現CallBack回撥介面的transMessage方法。
package com.heima.transinapp.TestCallBack;
public class CallBackUtil {
private static CallBack mCallBack;
public static CallBack getmCallBack() {
return mCallBack;
}
/**
* 註冊回撥介面
* @param callBack 一個繼承回撥介面的物件
*/
public static void setCallBack(CallBack callBack) {
mCallBack = callBack;
}
/**
* @param message 傳遞的資訊
*/
public static void doCallBack(String message){
mCallBack.transMessage(message);
}
}
3 資料接收頁面實現CallBack介面
在回撥介面被呼叫的時候,這個被實現的介面所實現的方法會接收到傳送值。
4 註冊回撥介面
簡單來說就是給CallBackUtil傳入一個CallBack物件。這個CallBack物件就是實現CallBack介面的資料接收頁面。
@ContentView(R.layout.activity_test_call_back)
public class TestCallBackActivity extends AppCompatActivity implements CallBack {
@ViewInject(R.id.btn_start_service)
Button btn_start_service;
@ViewInject(R.id.tv_result)
TextView tv_result;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
x.view().inject(this);
//註冊監聽
CallBackUtil.setCallBack(this);
}
@Event(value = {R.id.btn_start_service})
private void onClick(View view) {
switch (view.getId()) {
case R.id.btn_start_service:
startService(new Intent(TestCallBackActivity.this, SendService.class));
break;
}
}
/**
* @param message 接收到的訊息
*/
@Override
public void transMessage(String message) {
tv_result.setText(message);
}
}
5 呼叫回撥方法傳送訊息。
因為前面已經為CallBackUtil傳入了CallBack物件,所以這裡可以直接呼叫工具類中的方法,簡潔呼叫CallBack方法傳送訊息了。
CallBackUtil.doCallBack("1");
呼叫過後,接收頁面繼承回撥介面所實現的方法就會自動觸發了。