android - 重新启动时从 SQLiteDatabase 重新创建通知
问题描述
我正在我的应用程序中实施提醒(通知),到目前为止效果很好。
这是从 Fragment 发射的。它设置了 AlarmManager 并将提醒添加到 SQLiteDatabase:
public void SendNotification (Reminders reminder, Context context)
{
Random rand = new Random();
db.AddReminderToDB(reminder); //adds all reminder fields to SQLite database
AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, NotificationCentre.class);
int id = rand.nextInt(100); //for testing
intent.putExtra("Title", reminder.getTitle());
intent.putExtra("Message", reminder.getMessage());
intent.putExtra("Channel", reminder.getChannel());
intent.putExtra("ID", id);
PendingIntent pI = PendingIntent.getBroadcast(context, id, intent, 0);
alarm.setExact(AlarmManager.RTC_WAKEUP, reminder.getTime(), pI);
}
这被发送到广播接收器:
public class NotificationCentre extends BroadcastReceiver
{
@Override
public void onReceive (Context context, Intent intent)
{
if("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
SendNotificationAfterReboot(context);
}
else
{
ActuallySendNotification(context,intent);
}
}
void ActuallySendNotification(Context context, Intent intent)
{
String action = intent.getAction();
Log.i("Receiver", "Broadcast received: " + action);
String Channel = intent.getExtras().getString("Channel");
String title = intent.getExtras().getString("Title");
String message = intent.getExtras().getString("Message");
int id = intent.getExtras().getInt("ID");
NotificationHelper nh = new NotificationHelper(context);
NotificationCompat.Builder nBuilder = nh.getChannel1Notification(title, message,Channel);
nh.getManager().notify(id, nBuilder.build());
}
这一切正常。即使用户最小化/终止应用程序,通知仍会在设置的时间触发。
我面临的障碍是确保如果手机重新启动它们会触发。我在这里阅读了很多问题和关于此的在线文章,还有几个问题。
当手机重新启动时,我设法让广播接收器执行代码,这主要归功于 Stack Overflow。
我的问题:
广播接收器在启动时是否能够读取数据库(考虑到应用程序本身没有运行)?
假设它可以并且在查询数据库后我得到通知信息,我想我需要设置一个新的 AlarmManager 并将通知数据传递给它。我是在广播接收器还是其他地方执行此操作?
到目前为止,如果意图操作是 BOOT_COMPLETED,我尝试了从 BroadcastReceiver 调用的方法:
void SendNotificationAfterReboot(Context context)
{
DatabaseHelper db = new DatabaseHelper(context);
ArrayList<Reminders> remindersList = new ArrayList<>();
remindersList.addAll(db.REMINDERS_ALL_TO_LIST());
for (Reminders reminder: remindersList) {
Toast.makeText(context,"Got a reminder",Toast.LENGTH_SHORT).show();
}
}
...但没有 Toast(s) 出现。此外,它似乎使 SystemUI 崩溃。我相信这与“上下文”不是我认为重启后的样子有关。
这里的任何帮助将不胜感激。
总而言之,我只需要知道如何在重新启动时从 BroadcastReceiver 为从 SQliteDatabase 检索到的每个 Reminder 设置 AlarmManagers。
非常感谢,亚历克斯
解决方案
推荐阅读
- css - :global 之前缺少空格
- html - 嵌套在 Anchor 中的 Div 被视为兄弟姐妹
- php - 无法通过 AJAX 检索发布的变量
- java - 为什么我的 alertDialog.setMessage() 上出现空值?
- javascript - 与 Canvas 合并图像后如何获取新合并图像的来源?
- ubuntu - 如何在 xampp Ubuntu 18.04 中安装/启用 GD?
- aws-lambda - 我无法通过 VPN 将 mysql 客户端连接到 RDS
- react-native - 每当屏幕加载时如何调用方法,就像总是应该在反应本机中调用方法一样
- swift - Swift 字典:-[__NSCFNumber objectForKey:]:无法识别的选择器发送到实例
- gatling - gatling-3.0.0:javax.net.ssl.SSLHandshakeException:收到致命警报:bad_certificate