gpt4 book ai didi

java - 应用关闭时接收 TIME_SET 广播

转载 作者:太空宇宙 更新时间:2023-11-03 13:47:07 26 4
gpt4 key购买 nike

当用户更改 android 系统时间时,我想在首选项中存储一个 boolean 值。因此,我将广播操作 ACTION_TIME_CHANGED 添加到 list 中:

<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()。在此类中,将存储 boolean 值并显示通知。

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);
}

在应用程序关闭之前一切正常 - 不再在后台运行。

这里说:


无论如何我怎样才能接收广播并存储 boolean 值?

我不需要看到通知。

最佳答案

Everything is working fine until the app is closed - not runnning in the background anymore.

There are no logs when I "force stop" the application and changing the date afterwards.

您的观察是正确的,被认为是正常行为。通过系统设置执行“强制停止”后,您的 BroadcastReceiver 将不再接收消息,即使您在 AndroidManifest.xml 中声明了它们。通过执行“强制停止”,您基本上是在指示系统:“立即停止此应用程序,不要让它再次运行”。这是一项管理操作,因此只能通过系统设置访问。这是有道理的不是吗?新安装的应用程序也是如此。在至少启动一次之前,它不会收到任何广播 Intent 。

Android系统就是这么设计的。你不能对它做任何事情。

How can I receive the broadcast anyway and store the boolean?

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

您不应将“强制停止”与系统破坏您的应用程序的情况(例如,由于内存不足)混淆。它们并不相同,因为“强制停止”会为您的应用设置一个永久标志,以防止它再次运行。

关于java - 应用关闭时接收 TIME_SET 广播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39955185/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com