BroadcastReceiver
也就是“广播接收者”的意思,顾名思义,它就是用来接收来自系统和应用中的广播。
广播能够实现,App与系统,ActivityA与ActivityB或者与服务之间进行交互、传递参数等动作。
两种注册方式:
广播有两种注册方式,动态注册和静态注册:静态注册为常驻型,动态不是常驻性。
静态注册:
首先创建一个类,该类继承与 BroadcastReceiver:
public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//接收到广播时触发
//不要超过10s
Toast.makeText(context,"boot ok",Toast.LENGTH_LONG).show();
Log.e("m_tag","====boot complete====");
}
}
然后在AndroidManifest.XML中注册:
<receiver
android:name=".BootReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.MEDIA_MOUNTED"/>
<action android:name="android.intent.action.MEDIA_EJECT"/>
<action android:name="abc123"/>
</intent-filter>
</receiver>
之后,我们就可以在MainActivity中对该广播发送广播通知,可根据 <intent-filter>拦截器里面的actvity属性指定发送到那个广播,也可以匿名发送,广播在接收到广播通知后,就会触发onReceive回调,我们可以通过Intent携带不同参数,然后根据参数的键值来判断,执行相应的操作。
动态注册
在Activity或Service中注册,能够动态控制其生命周期,相对静态常驻来说,减少内存和电量消耗等。
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
//本地广播管理器
private LocalBroadcastManager lm;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn1).setOnClickListener(this);
//初始化广播管理器
lm = LocalBroadcastManager.getInstance(this);
}
private MyReceiver receiver;
@Override
protected void onResume() {
super.onResume();
//声明一个广播,填写相关属性
receiver = new MyReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_TIME_TICK);
filter.addAction("hello");
// //注册广播
// registerReceiver(receiver,filter); //系统ActivityManager级别的:即系统其他App的拦截器也能拦截
//注册本地广播
lm.registerReceiver(receiver,filter);//LocalBroadcastManager App级别的:即只能本App里面能拦截
}
@Override
protected void onPause() {
super.onPause();
//取消注册
// unregisterReceiver(receiver);
lm.unregisterReceiver(receiver);
receiver = null;
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn1:
Intent it = new Intent("hello");
// sendBroadcast(it); //发送系统级别的广播
lm.sendBroadcast(it); //发送本地广播
break;
}
}
}
/**
* Created by Administrator on 2017/5/22.
*/广播
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.e("m_tag",""+intent.getAction());
}
}
其中:
registerReceiver(receiver,filter); 该注册方式为系统ActivityManager级别的:即系统其他App的拦截器也能拦截
lm.registerReceiver(receiver,filter); 本地(即本App能)级别:即只能拦截本App其他Activity或者Service发送的广播
动态注册一般在onResume 中声明属性注册,然后onPause()的时候注销。(这个Activity或Service被销毁时如果没有解除注册,系统会报一个异常,提示我们是否忘记解除注册了)。
同时,我们可以通过设置广播的优先级属性,优先接收广播,可以进行拦截,也可以向优先级低的继续传递
<intent-filter android:priority="998"> //注册时表明优先级属性
abortBroadcast();//广播接收后,可以进行终止向下传递
更多使用说明可参考微博:
http://blog.youkuaiyun.com/liuhe688/article/details/6955668
http://www.cnblogs.com/lwbqqyumidi/p/4168017.html