android跨應用發廣播
阿新 • • 發佈:2019-01-10
最近寫的一個安卓專案裡用到了跨應用間廣播通訊技術,說白點就是在不同的APP之間傳送廣播來接收訊息,我在做的時候也遇到了一些問題,不過最後都解決了,特在此把自己的遇到的問題分享出來,方便遇到同樣的問題的朋友能夠快速解決。
廣播註冊分為動態註冊和靜態註冊,如果有人不太明白的話,可以自行度娘一下。之前我使用的是靜態註冊的方式,但是很麻煩,而且還容易報錯。我就遇到MainActivity$MyReceiver; no empty constructor這種錯誤,後來在百度上看到這種錯誤,是因為要把自己寫的BroadcastReceiver前加上static,但是這樣加上的結果就是很多跨程序之間傳遞的變數就不好用了,所以後來又改成用動態方式註冊廣播,最後把問題解決了。然後自己寫了個小demo,老規矩,還是先上程式碼吧!
這是第一個APP的內容,其實內容很簡單,就只有一個發廣播的功能,可以使用Bundle傳遞很多資訊,我這裡就簡單的傳了一個String值。
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.button1).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //傳送廣播 Intent intent = new Intent(); intent.setAction("com.example.BroadCast");//這裡可以自己定義 Bundle bundle=new Bundle(); bundle.putString("aaa", "111"); intent.putExtras(bundle); MainActivity.this.sendBroadcast(intent); } }); } }
這是第二個APP,寫了一個Receiver,不過大家要注意廣播一定要登出,登出的位置可以根據你的實際情況來決定,我這裡是寫在onDestory()裡,程式碼如下:
public class MainActivity extends Activity { TestBroadReceiver testBroadReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); registerTestBroadReceiver();// 開啟APP的時候註冊廣播 } @Override protected void onDestroy() { // 關閉APP的時候登出廣播 unRegisterTestBroadReceiver(); super.onDestroy(); } private void unRegisterTestBroadReceiver(){ if(testBroadReceiver!=null){ unregisterReceiver(testBroadReceiver); } } private void registerTestBroadReceiver(){ testBroadReceiver=new TestBroadReceiver(); IntentFilter filter=new IntentFilter(); filter.addAction("com.example.BroadCast"); registerReceiver(testBroadReceiver, filter); } /*** * 寫一個廣播接收器 * @author blh * */ public class TestBroadReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub String action=intent.getAction(); if(action.equals("com.example.BroadCast")){ Bundle bundle=intent.getExtras(); if(bundle!=null){ String msg=bundle.getString("aaa"); Toast.makeText(context, "接收到了:"+msg, Toast.LENGTH_LONG); } } } } }
這樣子的話就會在第二個app收到吐司。好了,程式碼已經上完了,大家拿去改改就可以直接用了,是不是很簡單呢!