从一个BroadcastReceiver更新一个活动(Updating an Activity fr

2019-06-25 08:40发布

这个问题提出了一个有趣的问题。

的OP具有显示的地图应用程序,并需要与通过SMS消息接收的位置标记来更新该映射。 的各个步骤是相当简单:将SMS消息可以由接收BroadcastReceiver ,由一个标记可显示ItemizedOverlay上的顶部MapView 。 棘手的部分是具有与应用程序的主要部分的接收部分连通。

  • 如果应用程序有一个活跃的,会发生什么MapActivity ,然后将其BroadcastReceiver被调用,以传入SMS回应? 是MapActivity而暂停BroadcastReceiver代码在同一过程中执行? 如果是这样,它是安全的BroadcastReceiver来访问MapActivity通过静态引用(这是由活动的设置onCreate方法?

  • 相反,在一个应用程序的BroadcastReceiver在一个单独的进程中执行,因此需要一些其他的方式与该应用的activty沟通?

Answer 1:

阅读文档,它看起来像一个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意图。 而后者则坚持它,首先更新地图,尽管我只是猜测什么,我会尝试。



Answer 2:

BroadcastReceiver应该在同一个进程中运行。 BroadcastReceiver的设计是短暂的。 因此它可以在不暂停有关前景的任何真正令人担心的执行Activity 。 你可能会访问该Activity通过静态参考直接假设你检查了其中的情况下Activity尚未建立。 但是,它可能会更有意义通过意图进行沟通。



Answer 3:

最好的办法,正如其他人所指出的,似乎是创建一个单独的意图是私有的应用程序。 代替在清单中宣告它的,活动将其登记时,它是活动的。 这样的回答解释了如何这一点。

公共BroadcastReceiver (这是在清单中声明并处理android.provider.Telephony.SMS_RECEIVED当时)应该调用该应用程序特定的意图。



文章来源: Updating an Activity from a BroadcastReceiver