android中的broadcastreceiver不可以做耗时操作

转载 2015年11月18日 15:06:19

注意:由于BroadcastService一样,都运行在主线程中,所以在这两个里面我们无法做一些长时间的耗时操作

广播接收者( BroadcastReceiver )用于接收广播 Intent ,广播 Intent 的发送是通过调用Context.sendBroadcast() 、 Context.sendOrderedBroadcast() 来实现的。通常一个广播 Intent 可以被订阅了此Intent 的多个广播接收者所接收。


广播是一种广泛运用的在应用程序之间传输信息的机制 。而 BroadcastReceiver 是对发送出来的广播进行过滤接收并响应的一类组件;

来自普通应用程序,如一个应用程序通知其他应用程序某些数据已经下载完毕。
BroadcastReceiver 自身并不实现图形用户界面,但是当它收到某个通知后, BroadcastReceiver 可以启动Activity 作为响应,或者通过 NotificationMananger 提醒用户,或者启动 Service 等等。
BroadCastReceiver 的机制
1. 机制
在 Android 里面有各种各样的广播,比如电池的使用状态,电话的接收和短信的接收都会产生一个广播,应用程序开发者也可以监听这些广播并做出程序逻辑的处理。如图:

2. 实现
用接收短信举例:

第一种方式 :
实现
public class MyBroadcastReceiver extends BroadcastReceiver {
// action 名称
String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED" ;

public void onReceive(Context context, Intent intent) {

if (intent.getAction().equals( SMS_RECEIVED )) {
// 相关处理 : 地域变换、电量不足、来电来信;
}
}
}
系统注册:在 AndroidManifest.xml 中注册
< receiver android:name = ".MyBroadcastReceiver" >
< intent-filter android:priority = "1000" >
< action android:name = " android.provider.Telephony.SMS_RECEIVED" />
</ intent-filter >

</ receiver > 

当然了需要权限 :

< uses-permission android:name = "android.permission.RECEIVE_SMS" />
< uses-permission android:name = "android.permission.SEND_SMS" />

第二种方式:
// 广播接收者 - 广播的接收
private BroadcastReceiver myBroadcastReceiver = new BroadcastReceiver() {

@Override
public void onReceive(Context context, Intent intent) {
// 相关处理,如收短信,监听电量变化信息
}

};

代码中注册:
IntentFilter intentFilter = new IntentFilter( "android.provider.Telephony.SMS_RECEIVED " );
registerReceiver( mBatteryInfoReceiver , intentFilter);

3. 生命周期

描述了 Android 中广播的生命周期,其次它并不像 Activity 一样复杂,运行原理很简单如下图:

生命周期只有十秒左右,如果在 onReceive() 内做超过十秒内的事情,就会报错 。

每次广播到来时 , 会重新创建 BroadcastReceiver 对象 , 并且调用 onReceive() 方法 , 执行完以后 , 该对象即被销毁 . 当 onReceive() 方法在 10 秒内没有执行完毕, Android 会认为该程序无响应 . 所以在
BroadcastReceiver 里不能做一些比较耗时的操作 , 否侧会弹出 ANR(Application No
Response) 的对话框 

相关文章推荐

Broadcast Receiver开启服务而不是子线程处理耗时操作

Broadcast Receiver用于接收并处理广播通知(broadcast announcements)。多数的广播是系统发起的,如地域变换、电量不足、来电来信等。程序也可以播放一个广播。程序可以...

如何在 BroadcastReceiver 中执行耗时操作?

一、BroadcastReceiver 注册方式     BroadcastReceiver 有两种注册方式,一是使用 { Context.registerReceiver()} 动态注册,另一种是...

Broadcast Receiver开启服务而不是子线程处理耗时操作

转自:http://blog.csdn.net/cquwentao/article/details/27419217 Broadcast Receiver用于接收并处理广播通知(broadc...

android Intent启动flag

FLAG_GRANT_READ_URI_PERMISSION 如果设置这个标记,Intent的接受者将会被赋予读取Intent中URI数据的权限和lipData中的URIs的权限。当应用与Intent...

android 解决广播接收延时问题:前台广播

android 解决广播接收延时问题:前台广播 。   Intent mIntent = new Intent("android.i...

android.view.ViewRootImpl$CalledFromWrongThreadException:Android2.3后耗时线程不可以在UI线程中执行

当应用程序启动,创建了一个叫“main”的线程,用于管理UI相关,又叫UI线程。其他线程叫工作线程(Work Thread)。 Single Thread Model   一个组件的创建并不会...

BroadcastReceiver处理耗时操作

Long-Running Receivers and Services  So far, we have covered the happy path of broadcast receiv...

Android中Service中是否能做耗时操作,两种启动模式与服务不被杀死的方法

1.在Service中,一般情况下都是不能在Service中耗时操作的,但是可以在mainifest中设置属性progress,这样我们就可以做耗时操作了。 2.Service的两种启动模式: 第一种...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)