应用关闭后接收TIME_SET广播

时间:2016-10-10 09:26:58

标签: java android broadcastreceiver

当用户更改android系统时间时,我想在Preferences中存储一个布尔值。因此,我将广播操作ACTION_TIME_CHANGED添加到清单:

<receiver android:name="test.TimeChangedReceiver">
   <intent-filter>
      <action android:name="android.intent.action.TIME_SET" />
      <action android:name="android.intent.action.TIMEZONE_CHANGED" />
   </intent-filter>
</receiver>

TimeChangedReceiver扩展了BroadcastReceiver并覆盖了onReceive()。在这个类中,将存储布尔值并显示通知。

public class TimeChangedReceiver extends BroadcastReceiver {

private static final String TAG = "TimeChangedReceiver";

public TimeChangedReceiver() {
    super();
}

@Override
public void onReceive(Context context, Intent intent) {

    // store boolean to SharedPreferences
    PreferenceUtils.getInstance().storeBoolean(true, PreferenceUtils.CHECK_LICENSE);

    // build notification 
    int icon = android.R.drawable.ic_dialog_alert;
    String title = "changed time";
    String text = "user changed time";

    long when = System.currentTimeMillis();
    String timezone = intent.getStringExtra("time-zone");
    Notification notification = new Notification(icon, title, when);
    NotificationManager mgr = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    int notification_id = (int) System.currentTimeMillis();
    Intent notificationIntent = new Intent(context, MainView.class);
    notificationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    notificationIntent.putExtra("time-zone", timezone);
    PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_ONE_SHOT );
    notification.setLatestEventInfo(context, title, text, contentIntent);
    mgr.notify(notification_id, notification);
}

}

一切正常,直到应用程序关闭 - 不再在后台运行。

这里说:

我怎样才能收到广播并存储布尔值?

我不需要查看通知。

2 个答案:

答案 0 :(得分:2)

  

一切正常,直到应用程序关闭 - 不再在后台运行。

     

当我强行停止&#34>时没有日志。申请并在之后更改日期。

您的观察是正确的,并被认为是正常行为。在你做了一次强制停止后#34;通过系统设置,即使您在AndroidManifest.xml中声明了消息,BroadcastReceiver也将不再收到消息。通过执行&#34;强制停止&#34;你基本上会指导系统:&#34;现在停止这个应用程序,不要让它再次运行&#34;。这是一个管理操作,因此只能从系统设置访问。这有道理吗?新安装的应用程序也是如此。在至少开始一次之前,它不会收到任何广播意图。

这就是Android系统的设计方式。你无法对付它。

  

我怎样才能接收广播并存储布尔值?

强制停止&#34;后,您的应用(或其中一个组件)必须由用户至少再次手动(重新)启动 。在这种情况下,即使在完全重新启动系统之后,AndroidManifest.xml中声明的接收器也会按预期接收广播意图。

你不应该混淆一个强制停止&#34;系统破坏你的应用程序的情况(例如,由于缺乏记忆)。这些并不相同,因为&#34;强制停止&#34;为您的应用设置一个永久性标志,以防止它再次运行。

答案 1 :(得分:0)

来自docs

  

当前正在执行BroadcastReceiver的进程(即,   当前在其onReceive(Context,Intent)方法中运行代码)   被认为是一个前台进程,将继续运行   该系统除了极端记忆压力的情况外。

然后

  

这意味着对于长时间运行的操作,您通常会使用a   服务与BroadcastReceiver一起保持包含   在整个操作过程中处于活动状态。

所以我猜你需要实现一个注册接收器的服务,以确保接收者的进程具有高优先级,从而继续运行。