我们的Android应用的一个主要组成部分是使用AlarmManager
在特定时间向用户发送通知。
当用户创建新的“记录”时,我们会在现场排队。因此,如果下载应用程序,打开它并创建一个或多个记录,所有通知都排队等待。但是,这是最简单的用例。
另一个用例是用户已经创建了一条记录,并重新启动了他们的手机。在这种情况下,排队的警报将丢失。所有记录都存储在数据库中,事后可以解决正确的通知时间。那么,此处的解决方案是为BroadcastReceiver
事件添加android.intent.action.BOOT_COMPLETED
。当手机启动时,我们会为所有未完成的记录排队通知。
我的问题是这两个用例是否涵盖了所有内容?如果没有,我们需要考虑哪些其他案例以及可能有哪些解决方案?例如,当我们将更新推送到应用程序时,排队的警报会被摧毁吗?是否存在排队警报可能丢失的其他情况?
答案 0 :(得分:2)
你是对的,你需要收听BOOT_COMPLETED
个事件(你还需要添加android.permission.RECEIVE_BOOT_COMPLETED
权限才能真正接收它们。)
要处理应用程序更新,您可以使用清单中包含以下行的接收器:
<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方法说明中的更多详细信息)。