这个问题提出了一个有趣的问题。
的OP具有显示的地图应用程序,并需要与通过SMS消息接收的位置标记来更新该映射。 的各个步骤是相当简单:将SMS消息可以由接收BroadcastReceiver
,由一个标记可显示ItemizedOverlay
上的顶部MapView
。 棘手的部分是具有与应用程序的主要部分的接收部分连通。
如果应用程序有一个活跃的,会发生什么MapActivity
,然后将其BroadcastReceiver
被调用,以传入SMS回应? 是MapActivity
而暂停BroadcastReceiver
代码在同一过程中执行? 如果是这样,它是安全的BroadcastReceiver
来访问MapActivity
通过静态引用(这是由活动的设置onCreate
方法?
相反,在一个应用程序的BroadcastReceiver
在一个单独的进程中执行,因此需要一些其他的方式与该应用的activty沟通?
阅读文档,它看起来像一个BroadcastReceiver是在一个不同的进程中执行,尽管我不是100%确定( BroadcastReceiver的生命周期 )
当前正在执行一个BroadcastReceiver(即,当前运行在其的onReceive(上下文代码,意图)方法)被认为是一个过程是一个前台进程
这就是说,我不会考虑安全距离的onReceive访问活动,因为它是一个不同的过程,它可能会崩溃。
考虑到该活动也可以作为广播接收器,寿你要控制的时候在其生命周期是积极侦听事件。 这样一来,就可以在认购的onResume(从斑马线项目中提取代码)
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();
}
}
}
}
}
因此,广播接收器应该始终坚持的新标志(通过服务,从不内的onReceive),并应提前告知用户新的标志物已被添加一个潜在的积极MapActivity,这将被监听,如果它是积极的。
或者,更简单,活动和广播接收器监听同一SMS意图。 而后者则坚持它,首先更新地图,尽管我只是猜测什么,我会尝试。
该BroadcastReceiver
应该在同一个进程中运行。 BroadcastReceiver
的设计是短暂的。 因此它可以在不暂停有关前景的任何真正令人担心的执行Activity
。 你可能会访问该Activity
通过静态参考直接假设你检查了其中的情况下Activity
尚未建立。 但是,它可能会更有意义通过意图进行沟通。
最好的办法,正如其他人所指出的,似乎是创建一个单独的意图是私有的应用程序。 代替在清单中宣告它的,活动将其登记时,它是活动的。 这样的回答解释了如何这一点。
公共BroadcastReceiver
(这是在清单中声明并处理android.provider.Telephony.SMS_RECEIVED
当时)应该调用该应用程序特定的意图。