搜尋此網誌

2013-10-23

Speed Broadcasting -- LocalBroadcastManager

我想不少人都透過 Intent 來傳送資料,並用 BroadcastReceiver 來接收該 Intent ,這是 Android 提供相當好用的一個機制。但是請注意下列兩點:

1、 Intent 是透過 Binder 來實作用來進行 inter-process commumnication,已經是和系統層面相關,所以效能上不是很好。

2、任何 app 只要知道你的 intent key (字串),每個人都可以收送我們 app 所需特別 Intent ,這延伸出來的就是安全問題了。

但是有時候,我們只是想要在自己的 application (process) 內傳遞資料,若是用 BroadcastReceiver 的方法來進行,就會遇到上述所說的2個缺點。在這時候,改用新的 Android Support Library 中所提供的 LocalBroadcastManager 來傳遞資料是比較好的選擇。因為 LocalBroadcastManager 是透過 HashMap 來實作 sending/receiving intent,所以效能會比較好,而且有最好的安全性。


相關的使用方法很簡單,下列我用了一個 Intent Service 和 Activity 來作簡單的範例。


ApaulIntentService.java:

 
package com.apaulstudio.localbroadcast;
import android.app.IntentService;
import android.content.Intent;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;

public class ApaulIntentService extends IntentService{
    public static final String ACTION="mycustomaction";
    private static final String AUTHOR = "Apaul";
    
    public ApaulIntentService() {
        super("ApaulIntentService");
       Log.d(AUTHOR,"service started");
    }

    @Override
    protected void onHandleIntent(Intent arg0) {
        Intent in=new Intent(ACTION);
        Log.d(AUTHOR,"sending broadcast");
        // Start to send local intent 
        LocalBroadcastManager.getInstance(this).sendBroadcast(in);
    }
}


MyLocalBroadcastManager.java:

package com.apaulstudio.localbroadcast;
… import android.support.v4.content.LocalBroadcastManager;

public class MyLocalBroadcastActivity extends Activity implements OnClickListener{
    TextView tv;
    Button bt;
    @Override
    protected void onPause() {
        super.onPause();
        // Unregister the local receiver
        LocalBroadcastManager.getInstance(this).unregisterReceiver(onNotice);
    }
    @Override
    protected void onResume() {
        super.onResume();
        // Register a local receiver
        IntentFilter iff= new IntentFilter(ApaulIntentService.ACTION);
        LocalBroadcastManager.getInstance(this).registerReceiver(onNotice, iff);
    }
    
    // Prepare a BroadcastReceiver
    private BroadcastReceiver onNotice= new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            tv.setText(new Date().toString());
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        tv=(TextView)findViewById(R.id.tvResults);
        bt= (Button)findViewById(R.id.btStart);
        bt.setOnClickListener(this);
    }
    
    @Override
    public void onClick(View v) {
        if(v.getId()==R.id.btStart){
            Intent i= new Intent(this, ApaulIntentService.class);
            startService(i);
        }
    }
}

沒有留言 :

張貼留言