收到 BOOT_COMPLETE 后访问 MainActivity

Accessing MainActivity once BOOT_COMPLETE is received

我有一个提醒应用程序,当来自一组对象的下一个提醒到期时,它会在给定时间通知我。

我正在尝试让它在启动时再次设置通知。

我在清单中设置了我的启动接收器,但是如果 phone 已经启动,我如何从 MainActivity 访问任何信息,假设应用程序尚未打开?

我希望用这个 -

public class BootReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("RegularReminders","onReceive");
        new MainActivity().setNotifications();
    }
}

但是一旦它尝试 运行 MainActivity 中的方法,它 returns 来自该通知的空错误,应用程序在模拟器启动时崩溃,我在 logcat-

java.lang.RuntimeException: Unable to start receiver com.androidandyuk.regularreminders.BootReceiver: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference

这指向一条线 -

if (reminders.size() >= 0) {

我确实想知道是否可以将通知消息保存到 SharedPrefs 并在接收器中调用它,但是这样做时我也遇到了空对象引用错误。

我尝试发回另一个添加额外信息的广播,但我猜想在 MainActivity 中设置的接收器没有监听,因为应用程序没有被监听 运行?

我知道 Google 正在保护我们免受恶意软件的侵害,不会让他们在预订后做太多事情,但是有什么办法可以解决这个问题,以便我可以在重启后设置通知?

谢谢。

问题是您收到 ACTION_BOOT_COMPLETED 时未创建您的 activity。

你可以做的是在引导完成后启动你的 activity 并传递参数告诉它做一些工作。

public class BootReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("RegularReminders","onReceive");
        if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
            Intent i = new Intent(context, YourActivity.class);
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

            Bundle args = new Bundle();
            //put some args inside the bundle
            //attach the bundle
            i.putExtras(args);
            //start the activity
            context.startActivity(i);
        }
    }
}

如果您不知道如何开始并展示您的 activity。您可以使用 Android Services.

尽管您无法从 MainActivity 访问变量,但您可以访问应用程序中使用的 SharedPreferences 和 SQLite 数据库,因此在这种情况下,我创建了一个新数组并将数据库读入其中并进行了处理。