1. 程式人生 > >android跨應用發廣播

android跨應用發廣播

    最近寫的一個安卓專案裡用到了跨應用間廣播通訊技術,說白點就是在不同的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收到吐司。好了,程式碼已經上完了,大家拿去改改就可以直接用了,是不是很簡單呢!