gpt4 book ai didi

java - Android AlertManager 通过重启、更新等

转载 作者:行者123 更新时间:2023-11-29 21:26:44 26 4
gpt4 key购买 nike

我们 Android 应用程序的一个主要组件是在特定时间使用 AlarmManager 向用户发送通知。 .

当用户创建新的“记录”时,我们会在现场排队发出警报。因此,如果下载应用程序、打开它并创建一条或多条记录,所有通知都可以正常排队。然而,这是最简单的用例。

另一个用例是当用户已经创建记录并重新启动他们的手机时。在这种情况下,排队的警报将丢失。所有记录都存储在数据库中,正确的通知时间可以在事后解决。那么这里的解决方案是为 android.intent.action.BOOT_COMPLETED 事件添加一个 BroadcastReceiver。当手机启动时,我们会为所有未完成的记录排队通知。

我的问题是这两个用例是否涵盖所有内容?如果不是,我们还需要考虑哪些其他情况以及可能的解决方案是什么?例如,当我们向应用程序推送更新时,排队的警报是否会被消除?是否存在其他可能丢失排队警报的情况?

最佳答案

你是对的,你需要监听 BOOT_COMPLETED 事件(你还需要添加 android.permission.RECEIVE_BOOT_COMPLETED 权限才能实际接收它们)。

要处理应用程序更新,您可以使用 list 中包含以下行的接收器:

<receiver android:name=".OnUpdadeReceiver">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_REPLACED" />
<data android:scheme="package" />
</intent-filter>
</receiver>

还有代码:

public class OnUpdadeReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
if (Intent.ACTION_PACKAGE_REPLACED.equals(intent.getAction()))
{
if (intent.getData().getSchemeSpecificPart().equals(context.getPackageName())) // check if event is about our app
{
// ...
}
}
}
}

如果您的 minSdkVersion 是 12 或以上,您可以使用 MY_PACKAGE_REPLACED 操作,它只通知您的包被替换,与使用 PACKAGE_REPLACED 时的所有包不同。因此,对于 MY_PACKAGE_REPLACED,您将不需要 intent.getData().getSchemeSpecificPart().equals(context.getPackageName()) 检查。

类似应用中的其他常见问题是如何确保应用收到实际的通知事件并将其显示给用户:

  • 如果您的事件发生在事先已知的特定时间,那么通过带有 RTC_WAKEUP 标志的 AlarmManager 设置警报就足够了。

  • 否则,可能需要让服务在后台运行以监控事件 - 为了可靠地做到这一点,您必须在通知区域保持通知可见,或要求用户安装小部件在主屏幕上,以确保操作系统不会终止服务(更多详细信息请参见 startForeground 方法说明)。

关于java - Android AlertManager 通过重启、更新等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20180954/

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