五:廣播
Android開發(fā)中如果需要對兩個完全沒關(guān)系的程序之間進行通信就可以使用發(fā)送廣播與接收廣播的機制來實現(xiàn),例如程序A發(fā)送了一個廣播 程序B接受到 做一些事情 這樣就達到了相互的通訊。
public?class?BroadcastActivity?extends?Activity?{
Button?mButton0?=?null;
Button?mButton1?=?null;
@Override
protected?void?onCreate(Bundle?savedInstanceState)?{
setContentView(R.layout.broadcast);
mButton0?=?(Button)findViewById(R.id.button0);
mButton0.setOnClickListener(new?OnClickListener()?{
@Override
public?void?onClick(View?arg0)?{
Intent?intent?=?new?Intent(MyService.SEND_OK_MESSAGE);
intent.putExtra("name",?"您發(fā)送了OK這條廣播");
sendBroadcast(intent);
}
});
mButton1?=?(Button)findViewById(R.id.button1);
mButton1.setOnClickListener(new?OnClickListener()?{
@Override
public?void?onClick(View?arg0)?{
Intent?intent?=?new?Intent(MyService.SEND_CANCLE_MESSAGE);
intent.putExtra("name",?"您發(fā)送了Cancle這條廣播哦");
sendBroadcast(intent);
}
});
//啟動Service
Intent?i?=?new?Intent(this,?MyService.class);
startService(i);
super.onCreate(savedInstanceState);
}
}
接收廣播的話我們開啟一個service?在service中通過BroadcastReceiver?來接收廣播?前提是須要接收的廣播須要在onStart()中注冊一下?在AndroidManifest.xml中可以過濾只接收須要接收的廣播、
在onStart()中注冊了程序中所需要的兩個廣播
public?class?MyService?extends?Service?{
public?final?static?String?SEND_OK_MESSAGE?=?"send.ok.message";
public?final?static?String?SEND_CANCLE_MESSAGE?=?"send.cancle.message";
private?BroadcastReceiver?myBroadCast?=?new?BroadcastReceiver()?{
@Override
public?void?onReceive(Context?context,?Intent?intent)?{
String?action?=?intent.getAction();
if?(action.equals(SEND_OK_MESSAGE))?{
Toast.makeText(context,?"接收到了一條廣播為"?+?SEND_OK_MESSAGE,?Toast.LENGTH_LONG).show();
}else?if(action.equals(SEND_CANCLE_MESSAGE))?{
Toast.makeText(context,?"接收到了一條廣播為"?+?SEND_CANCLE_MESSAGE,?Toast.LENGTH_LONG).show();
}
}
};
@Override
public?void?onCreate()?{
super.onCreate();
}
@Override
public?void?onStart(Intent?intent,?int?startId)?{
//注冊這兩個廣播
IntentFilter?myFilter?=?new?IntentFilter();
myFilter.addAction(SEND_OK_MESSAGE);
myFilter.addAction(SEND_CANCLE_MESSAGE);
this.registerReceiver(myBroadCast,?myFilter);
super.onStart(intent,?startId);
}
@Override
public?IBinder?onBind(Intent?arg0)?{
return?null;
}
}
這里注意一下?service如果沒有起來?我們是接收不到廣播的?所以一定要保證接收的時候service是開啟的,上例中的service是在打開activity時開啟的?但是如果用戶把手機關(guān)掉然后在開機?,?這樣的話service就不是打開狀態(tài)?這樣就非常危險了因為這時scrvice就接收不到任何消息了除非用戶再次進activity?才會幫他打開scrvice?所以我們可以在用戶開機后就直接將scrvice打開,具體的實現(xiàn)方式如下
在AndroidManifest.xml中注冊一個開機廣播??這個廣播系統(tǒng)只會在開機發(fā)出而且只會發(fā)出一次?所以我們接收這個廣播就可以知道手機是否為開機狀態(tài)
注意加入權(quán)限
在BroadcastRecevier中接收開機廣播??然后打開service?就可以實現(xiàn)開機啟動service。
public?class?MyBootReceiver?extends?BroadcastReceiver?{
/**開機廣播**/
static?final?String?BOOT_COMPLETED?=?"android.intent.action.BOOT_COMPLETED";
@Override
public?void?onReceive(Context?context,?Intent?intent)?{
/**如果為開機廣播則開啟service**/
if?(intent.getAction().equals(BOOT_COMPLETED))?{
Intent?i?=?new?Intent(context,?MyService.class);
context.startService(i);
}
}
}