我正在我的应用程序中实施提醒(通知),到目前为止运行良好。
这是从片段触发的。它设置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());
}
一切正常。即使用户最小化/终止了该应用程序,通知仍会在设置的时间触发。
我面临的障碍是,如果电话已重启,请确保它们能够启动。我在这里阅读了许多问题,并在网上阅读了有关此的文章,还有一些问题。
主要由于堆栈溢出,我设法让广播接收器在电话重启时执行代码。
我的问题:
广播接收器在启动时被激发(考虑到应用本身未运行)是否能够从数据库中读取?
假设它可以并且在查询数据库后我得到了通知信息,我想我需要设置一个新的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();
}
}
...但未出现吐司。也似乎崩溃了SystemUI。我认为这与“上下文”不是我重启后的样子有关。
这里的任何帮助将不胜感激。
总而言之,我需要知道的是如何为重新启动后从SQliteDatabase,BroadcastReceiver中检索到的每个提醒设置AlarmManagers。
非常感谢, 亚历克斯