标签:android android-activity broadcastreceiver
This question提出了一个有趣的问题.
OP有一个显示地图的应用程序,此地图需要使用通过SMS消息接收的位置标记进行更新.各个步骤相当简单:可以通过BroadcastReceiver接收SMS消息,标记可以通过MapView顶部的ItemizedOverlay显示.棘手的部分是让接收部分与应用程序的主要部分进行通信.
>如果应用程序具有活动的MapActivity,然后调用其BroadcastReceiver作为对传入SMS的响应,会发生什么?在同一进程中执行BroadcastReceiver代码时,MapActivity是否被挂起?如果是这样,BroadcastReceiver通过静态引用(由活动的onCreate方法设置)访问MapActivity是否安全?
>相反,应用程序的BroadcastReceiver是在一个单独的进程中执行的,因此需要一些其他方式与应用程序的活动进行通信?
解决方法:
阅读文档,它看起来像一个BroadcastReceiver在不同的进程上执行,所以我不是100%肯定(BroadcastReceiver lifecycle)
当前正在执行BroadcastReceiver的进程(即,当前在其onReceive(Context,Intent)方法中运行代码)被认为是前台进程
这就是说,我认为从onReceive访问活动是不安全的,因为它是一个不同的过程,它可能会崩溃.
考虑到Activity也可以充当BroadcastReceiver,你必须控制它在生命周期中何时主动监听事件.这样,您可以订阅onResume(从ZXing项目中提取的代码)
public void onResume(){
activity.registerReceiver(powerStatusReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
[...]
}
public void onPause() {
[...]
activity.unregisterReceiver(powerStatusReceiver);
}
并且您将BroadcastReceiver定义为公共类中的私有类
final class InactivityTimer {
[onResume, onPause, rest of the stuff ...]
private final class PowerStatusReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent){
if (Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())) {
// 0 indicates that we're on battery
// In Android 2.0+, use BatteryManager.EXTRA_PLUGGED
int batteryPlugged = intent.getIntExtra("plugged", -1);
if (batteryPlugged > 0) {
InactivityTimer.this.cancel();
}
}
}
}
}
因此,BroadcastReceiver应该始终保留新标记(通过服务,永远不会在onReceive中)并且它应该通知可能活动的MapActivity已经添加了新标记,如果它是活动的,它将会监听.
或者,更简单的是,Activity和BroadcastReceiver监听相同的SMS Intent.虽然后者持续存在,但第一个更新地图,所以我只是猜测我会尝试什么.
标签:android,android-activity,broadcastreceiver 来源: https://codeday.me/bug/20190902/1789531.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。