2013年2月5日 星期二

[Android]Android四大元件之Broadcast Intent Receiver的生命週期(二)

(2)Broadcast Intent Receiver :
當你想要寫一個程式來對外部的事件做些處理時,可以使用Broadcast Intent Receiver。比如:當電話響時,網路資料可以使用時,或半夜來臨時。Broadcast Intent Receiver它並不能拿來顯示UI畫面,它必需利用NotificationManager來通知使用者他們感興趣的事件發生了。
Broadcast Intent Receiver同樣的可以被宣告定義在AndroidManifest.xml檔案中,但你也可以用寫Context.registerReceiver()程式的方式來註冊你自己的Broadcast Intent Receiver。你自己的程式並不會因為BroadcastReceivers被呼叫而被它執行起來。而是當BroadcastReceiver被觸發時系統會依需求來執行相對應的程式。
程式可以利用Context.sendBroadcast()來發出他們自己的intent broadcast給其它的程式。




BroadcastReceiver 的執行時間最好不要超過 5s,否則會讓 Android 系統判定為 Timeout,並顯示錯誤對話視窗。BroadcastReceiver 被註冊後並不會在背景執行,而是當事件觸發才會執行。所以過多的 BroadcastReceiver 並不會影響系統運作,但是仍會佔用一些記憶體,還是不要太多才好。

implement

public class BroadcastReceiverDemo extends BroadcastReceiver { @Override public void onReceive(Context arg0, Intent arg1) { } }

register

IntentFilter filter = new IntentFilter("NEW_BROADCAST"); BroadcastReceiverDemo receiver = new BroadcastReceiverDemo(); BroadcastReceiverDemoActivity.this.registerReceiver(receiver, filter);或是在 AndroidManifest.xml 的 application 標籤內加入下列程式碼<receiver android:name=".BroadcastReceiverDemo"> <intent-filter> <action android:name="NEW_BROADCAST"> </action></intent-filter> </receiver>
在 AndroidManifest.xml 內註冊必須是一個 public 的非 inner class,也就是單獨的 class file 且宣告成 public。

unregister

BroadcastReceiverDemoActivity.this.unregisterReceiver(receiver);
unregisterReceiver() 不可卸載一個空物件或是一個已卸載的 receiver,重覆卸載會產生錯誤。所以在 unregister 後把物件設成 null,在 register 前先判斷是否為 null 再註冊。




广播的生命周期:
广播接收器仅在它执行这个方法时处于活跃状态。当 onReceive() 返回后,它即为失活状态。
拥有一个活跃状态的广播接收器的进程被保护起来而不会被杀死,但仅拥有失活状态组件的进程则会在其它进程需要它所占有的内存的时候随时被杀掉。 所以,如果响应一个广播信息需要很长的一段时 间,我们一般会将其纳入一个衍生的线程中去完成,而不是在主线程内完成它,从而保证用户交互过程的流畅。
注册BroadcastReceiver两种方式:
    方式一,静态的在AndroidManifest.xml中用标签声明注册,并在标签内用标签设置过滤器。    
    方式二,动态地在代码中先定义并设置好一个 IntentFilter对象,然后在需要注册的地方调 Context.registerReceiver()方法,如果取消时就调用Context.unregisterReceiver()方法。如果用动 态方式注册的BroadcastReceiver的Context对象被销毁时,BroadcastReceiver也就自动取消注册了。
    另外,若在使用sendBroadcast()的方法是指定了接收权限,则只有在AndroidManifest.xml中用标签声明了拥有此权限的BroascastReceiver才会有可能接收到发送来的Broadcast。同样,若在注册 BroadcastReceiver时指定了可接收的Broadcast的权限,则只有在包内的AndroidManifest.xml中 用标签声明了,拥有此权限的Context对象所发送的Broadcast才能被这个 BroadcastReceiver所接收。
动态注册:
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction(String); 为BroadcastReceiver指定action,使之用于接收同action的广播 registerReceiver(BroadcastReceiver,intentFilter);
    一般在onStart中注册,onStop中取消unregisterReceiver 发送广播消息
 。指定广播目标Action:Intent Intent = new Intent(action-String)指定了此action的receiver会接收此广播。

沒有留言:

張貼留言