五:廣播android
Android開發中若是須要對兩個徹底不要緊的程序之間進行通訊就可使用發送廣播與接收廣播的機制來實現 ,例如程序A發送了一個廣播 程序B接受到 作一些事情 這樣就達到了相互的通信。 ide
public class BroadcastActivity extends Activity { this
Button mButton0 = null; code
Button mButton1 = null; xml
@Override 開發
protected void onCreate(Bundle savedInstanceState) { get
setContentView(R.layout.broadcast); it
mButton0 = (Button)findViewById(R.id.button0); io
mButton0.setOnClickListener(new OnClickListener() { ast
@Override
public void onClick(View arg0) {
Intent intent = new Intent(MyService.SEND_OK_MESSAGE);
intent.putExtra("name", "您發送了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", "您發送了Cancle這條廣播哦");
sendBroadcast(intent);
}
});
//啓動Service
Intent i = new Intent(this, MyService.class);
startService(i);
super.onCreate(savedInstanceState);
}
}
接收廣播的話 咱們開啓一個service 在service中經過BroadcastReceiver 來接收廣播 前提是需要接收的廣播需要在onStart()中註冊一下 在AndroidManifest.xml中能夠過濾只接收需要接收的廣播、
<service android:name=".MyService">
<intent-filter>
<action android:name="cn.boweifeng.abc.MyService"></action>
</intent-filter>
<intent-filter>
<action android:name="send.ok.message" />
<action android:name="send.cancle.message" />
</intent-filter>
</service>
在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時開啓的 可是若是用戶把手機關掉而後在開機 , 這樣的話service就不是打開狀態 這樣就很是危險了由於這時scrvice就接收不到任何消息了除非用戶再次進activity 纔會幫他打開scrvice 因此咱們能夠在用戶開機後就直接將scrvice打開,具體的實現方式以下
在AndroidManifest.xml中註冊一個開機廣播 這個廣播系統只會在開機發出並且只會發出一次 因此咱們接收這個廣播就能夠知道手機是否爲開機狀態
<receiver android:name=".MyBootReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
注意加入權限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
在BroadcastRecevier中接收開機廣播 而後打開service 就能夠實現開機啓動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);
}
}
}