Android 里的各種通信方式(四)

五:廣播

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);

}

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容