本文共 3301 字,大约阅读时间需要 11 分钟。
静态注册(常驻广播)
在 AndroidManifest.xml中注册
动态注册(非常驻广播)
两者的区别
静态注册:一开始就注册进去了,它是一直有效
优点 : 不受其他组件生命周期影响,即使应用程序被关闭,也可以接收广播
缺点 : 耗电大,占内存
适用场景 : 该广播需要时刻监听时可使用
动态注册:注册完成后还要销毁掉,否则它会在内存中不断的消耗内存
优点 : 耗电小,省内存,灵活高
缺点 : 需要手动销毁
适用场景 : 在特定的时间段监听的广播
public class SendBroadcastActivity extends AppCompatActivity { public static final String COM_EXAMPLE_TEST_BROADCAST = "com.example.test.broadcast"; private TestBroadcastReceiver mTestBroadcastReceiver = new TestBroadcastReceiver(); private Button mSendBroadcastBtn; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_text_broadcast); mSendBroadcastBtn = findViewById(R.id.send_broadcastBtn); mSendBroadcastBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 发送广播 Intent intent = new Intent(); intent.setAction(COM_EXAMPLE_TEST_BROADCAST); intent.putExtra("toast", "this is my toast of broadcast"); sendBroadcast(intent); } }); } @Override protected void onStart() { super.onStart(); // 动态注册广播 IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(COM_EXAMPLE_TEST_BROADCAST); registerReceiver(mTestBroadcastReceiver, intentFilter); } @Override protected void onStop() { super.onStop(); unregisterReceiver(mTestBroadcastReceiver); }}
onReceive() 方法
public class TestBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 接收广播,处理数据 if (intent != null) { if (TextUtils.equals(intent.getAction(), SendBroadcastActivity.COM_EXAMPLE_TEST_BROADCAST)) { String toastString = intent.getStringExtra("toast"); Toast.makeText(context, toastString, Toast.LENGTH_SHORT).show(); } } }}
如果在onReceive方法中执行耗时操作会怎样?
答:在工作线程 > 10 就会ANR application not response
如何解决?
在工作线程 new thread 去做
Ordered broadcasts
是一种同步执行的广播,在广播发出之后(使用sendOrderedBroadcast方法发送广播),同一时刻只会有一个广播接收者能够接收到这条广播消息,当这个广播接收者的逻辑执行完毕之后,广播才会继续传递,因此这种方式时有先后顺序的。
Normal broadcasts
也称标准广播,是一种完全异步执行的广播,在广播发出后(使用sendBroadcast发送广播),所有的广播接收器几乎都会在同一时刻接收到这条广播消息,因此它们之间没有先后顺序。
有何区别
常见的广播接收者:
短信拦截器广播接收者 (有序,拦截,有优先级,4.4版本以后,广播无法拦截,有序 —>无序,有些定制手机不遵循规范)
SD卡状态监听广播接收者 (无序)
安装,卸载的广播接收者 (无序)
电量低的广播接收者 (无序 )
BroadcastReceiver的生命周期从对象调用它开始,到onReceiver() 方法执行完成之后结束。每次广播被接收后会重新创建BroadcastReceiver对象,并在onReceiver() 方法中执行完就销毁,如果BroadcastReceiver的onReceiver() 方法中不能在10秒内执行完成,Android会出现ANR异常。所以不要在BroadcastReceiver的onReceiver() 方法中执行耗时的操作。
如果需要在BroadcastReceiver中执行耗时的操作,可以通过Intent启动Service来完成。但不能绑定Service。 如果我们在Activity中注册了BroadcastReceiver,当这个Activity销毁的时候要主动撤销注册否则会出现异常。
转载地址:http://ukiwi.baihongyu.com/