Android - BroadcastReceiver
在 Android - Intent与IntentFilter 一文的开头,我们提到,一个Intent是对将要被执行的一个操作的一种抽象的描述,结合Context类中定义的下列几个方法 ——
public abstract void startActivity(Intent intent); public abstract void sendBroadcast(Intent intent); public abstract ComponentName startService(Intent service); public abstract boolean bindService(Intent service, ServiceConnection conn, int flags);
Intent被用作一种组件之间进行通信的媒介。
public class myBroadcastReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub ... ... } }
public void registerStorageChangeReceiver() { IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_MEDIA_SHARED); filter.addAction(Intent.ACTION_MEDIA_UNMOUNTED); filter.addAction(UPDATE_LISTVIEW_STRING); filter.addDataScheme("file"); storageChangeReceiver = new StorageChangeReceiver(); getActivity().registerReceiver(storageChangeReceiver, filter); }
第二种:在AndroidManifest.xml文件中的<application>节点里进行订阅(静态订阅):
<receiver android:name=".autotask.AutoTaskReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.DATE_CHANGED" /> </intent-filter> </receiver>
两种订阅方式的区别:
静态订阅广播又叫常驻型广播,当应用程序关闭了,如果有广播intent到来,广播接收者同样能接收到。
动态订阅广播又叫非常驻型广播,当应用程序结束了,广播接收者也就被销毁了。
三、发送广播
发送广播的方法定义在Context类中,主要有:
public abstract void sendBroadcast(Intent intent); public abstract void sendBroadcast(Intent intent, String receiverPermission); public abstract void sendOrderedBroadcast(Intent intent, String receiverPermission); public abstract void sendOrderedBroadcast(Intent intent, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras);
其中,sendBroadcast()用来发送“普通广播(Normal broadcasts)”
每次广播消息到来时都会创建BroadcastReceiver实例并执行onReceive() 方法,
onReceive() 方法执行完后,BroadcastReceiver 的实例就会被销毁。
当onReceive() 方法在10秒内没有执行完毕,Android会认为该程序无响应。所以在BroadcastReceiver里不能做一些比较耗时的操作,否侧会弹出ANR(Application No Response)对话框。
如果需要完成一项比较耗时的工作,应该通过发送Intent给Service,由Service来完成。这里不能使用子线程来解决,因为 BroadcastReceiver 的生命周期很短,子线程可能还没有结束BroadcastReceiver就先结束了。
BroadcastReceiver一旦结束,此时BroadcastReceiver所在的进程很容易在系统需要内存时被优先杀死,因为它属于空进程(没有任何活动组件的进程)。如果它的宿主进程被杀死,那么正在工作的子线程也会被杀死。所以采用子线程来解决是不可靠的。
Android将进程分为6个等级,它们按优先级顺序由高到低依次是:
1.前台进程( FOREGROUND_APP)
2.可视进程(VISIBLE_APP )
3. 次要服务进程(SECONDARY_SERVER )
4.后台进程 (HIDDEN_APP)
5.内容供应节点(CONTENT_PROVIDER)
6.空进程(EMPTY_APP)
所以,Intent是组件(主要是Activity和Service)之间进行通信的媒介。广播接收者通过订阅并处理Intent则是组件(主要是Activity和Service)间进行通信的一种方式。
... ... (未完待续)