首页 > 解决方案 > 重新启动时从 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。

我的问题:

  1. 广播接收器在启动时是否能够读取数据库(考虑到应用程序本身没有运行)?

  2. 假设它可以并且在查询数据库后我得到通知信息,我想我需要设置一个新的 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。

非常感谢,亚历克斯

标签: androidandroid-studioalarmmanagerandroid-broadcastreceiver

解决方案


推荐阅读