问题 我可以在Android上使用带有LocalBroadcastManager的AlarmManager吗?


我有这个代码:

private AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
private PendingIntent alarmIntent = PendingIntent.getBroadcast(this, 0, new Intent("my action-name"), 0);

alarmManager.setInexactRepeating((int)AlarmManager.ELAPSED_REALTIME_WAKEUP,     SystemClock.elapsedRealtime() + autoUpdateIntervalInMinutes * 60 * 1000,  autoUpdateIntervalInMinutes * 60 * 1000, alarmIntent);

但是我想为LocalBroadcastManager更改它。这可能吗?


5318
2017-08-24 16:19


起源



答案:


不,这是不可能的,因为 LocalBroadcastManager 仅适用于您自己的流程,并且 AlarmManager后端运行的过程不同。这就是为什么没有办法创造一个 PendingIntent 适用于 LocalBroadcastManager


9
2017-08-24 16:36



有没有办法让意图更加私密,以便其他应用程序无法使用它? - android developer
总之,没有。但是,任何其他希望收听广播的应用都需要知道完整的操作字符串。这至少通过默默无闻(这不是真正的安全性)给你一些安全性。 - Doge


答案:


不,这是不可能的,因为 LocalBroadcastManager 仅适用于您自己的流程,并且 AlarmManager后端运行的过程不同。这就是为什么没有办法创造一个 PendingIntent 适用于 LocalBroadcastManager


9
2017-08-24 16:36



有没有办法让意图更加私密,以便其他应用程序无法使用它? - android developer
总之,没有。但是,任何其他希望收听广播的应用都需要知道完整的操作字符串。这至少通过默默无闻(这不是真正的安全性)给你一些安全性。 - Doge


但是您可以注册一个BroadcastReceiver,它基本上将“全局”广播转换为LocalBroadcast:

public class AutoUpdateBroadcastReceiver extends BroadcastReceiver {

  private static final String TAG = AutoUpdateBroadcastReceiver.class.getSimpleName();

  @Override
  public void onReceive(Context context, Intent intent) {
    Log.d(TAG, ".onReceive");
    LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(context);
    lbm.sendBroadcast(intent);
  }
}

4
2018-06-17 19:47



是的,就是你 能够 但这并不意味着你 应该。整点 LocalBroadcastManager 是出于安全考虑,它只能从应用程序内接收广播。如果您创建一个从外部接收广播并在本地管理器上重新广播它们的接收器,它就会破坏整个目的 LocalBroadcastManager。您也可以只在本地注册接收器,而不是危及可能在其上注册的所有其他内容 LocalBroadcastManager。 - spaaarky21