1. 程式人生 > >Android 應用內資料傳遞

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之間通訊。當然,也是比較常見的傳遞資料的方式。

當然廣播作為四大元件有很多技巧點,這裡只是簡單的貼出動態廣播

在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");

呼叫過後,接收頁面繼承回撥介面所實現的方法就會自動觸發了。