• BroadcastReceiver的简介


    BroadcastReceiver本质上属于一个监听器,因此实现BroadcastReceiver的方法只要重写BroadcastReceiver的onReceive(Context  context ,Intent  intent)方法即可。

    一旦实现了BroadcastReceiver,接下来就应该指定BroadcastReceiver能匹配的Intent,此时有两种方式:

    1.使用代码进行指定,调用BroadcastReceiver的Context的registerReceiver(BroadcastReceiver  receiver  ,IntentFilter  filter)方法指定。例如如下代码:

        IntentFilter  filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");

        IncomingSMSReceiver  receiver = new IncomingSMSReceiver();

        registerReceiver(receiver , filter);

    2.在AndroidManifest.xml文件中配置。例如如下代码:

        <receiver android:name=".IncomingSMSReceiver">
          <intent-filter >
            <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
          </intent-filter>
        </receiver>

    每次系统Broadcast事件发生后,系统就会创建对应的BroadcastReceiver的实例,并自动触发它的onReceive()方法,onReceive()方法执行完后,BroadcastReceiver的实例就会被销毁。

    如果BroadcastReceiver的onReceive()方法不能在10秒内执行完成,Android会认为该程序无响应。所以不要在BroadcastReceiver的onReceive()方法里执行一些耗时的操作,否则会弹出ANR(Application  No  Respose)的对话框。

    如果确实需要根据Broadcast来完成一项比较耗时的操作,则可以考虑通过Intent启动一个Service来完成该操作,不应该考虑使用新线程去完成耗时的操作,因为BroadcastReceiver本身的生命周期很短,可能出现的情况是子线程可能还没有结束,BroadcastReceiver就已经推出了。

    如果BroadcastReceiver所在的进程结束,虽然该进程内还有用户启动的新线程,但由于该进程内不包含任何活动组件,因此系统可能在内存紧张时优先结束该进程,这样就可能导致BroadcastReceiver启动的子线程不能执行完成。

  • 相关阅读:
    关于Python虚拟环境与包管理你应该知道的事
    你是否真的了解全局解析锁(GIL)
    谈谈装饰器的实现原理
    快速了解Python并发编程的工程实现(下)
    快速了解Python并发编程的工程实现(上)
    简单了解一下事件循环(Event Loop)
    为何你还不懂得如何使用Python协程
    一文搞懂Python可迭代、迭代器和生成器的概念
    源码分析Retrofit请求流程
    一份程序猿单词列表(updating)
  • 原文地址:https://www.cnblogs.com/jiww/p/5612082.html
Copyright © 2020-2023  润新知