【2014年3月5日】
android 四大组件之一的BroadcastReceiver。
注册分两种,一种是AndroidManifest.xml里注册,一种是java程序里动态注册。
一.AndroidManifest.xml里注册:
无论你的apk是否在运行,你都能收到这个广播。这样的话需要你的代码里处理这种情况,如果收到广播,你的程序没有运行,导致许多变量未赋值,可能会引起空指针,特别注意。
注册方法:AndroidManifest.xml里加上。
<receiver
android:name="com.hisense.multiscreen.Receiver.MyReceiver"android:label="@string/app_name">
<intent-filter>
<action android:name="are.you.ready" />
<!--你的广播名-->
</intent-filter></receiver>
二.动态注册
只有在你的程序在运行时才会接收到广播。
注册方法:
MyReceiver mReceiver = new MyReceiver();
IntentFilter mFilter = new IntentFilter"are.you.ready");
mContext.registerReceiver(mReceiver, mFilter);
当apk退出时,需要你手动注销掉,否则会报错。
mContext.unregisterReceiver(mReceiver);
mReceiver = null;
【注意】此处的mContext需要前后一致。即,假如你用的是application的context注册的,你就得用application的context注销;假如你用的是activity的context注册的,你就得用此activity的context注销掉。context不能混用,否则会报错。
三.一些特殊的系统广播,需要加上部分修饰。
如"android.intent.action.PACKAGE_ADDED"等通知应用变化的广播,需要如下注册:
PackageChangeReceiver pcReceiver = new PackageChangeReceiver();
IntentFilter pFilter = new IntentFilter();
pFilter.addAction("android.intent.action.PACKAGE_ADDED");
pFilter.addDataScheme("package");
mContext.registerReceiver(pcReceiver, pFilter);
四.定义的Receiver里不能做耗时的操作,否则会提示ANR。
五.如果你的apk动态注册了网络变化的广播:"android.net.conn.CONNECTIVITY_CHANGE"
那么【有网络情况下】每次启动的时候你都会收到3次这样的广播,之前两次是没网络的,第三次是有网络的。
在AndroidManifest.xml里好像没这事,没详查。