AlarmManager 从不运行

AlarmManager never runs

我对 Android 非常缺乏经验,并且无法尝试将 AlarmManager 基本上 运行 一个每小时产生一个通知的小 activity(对于出于测试目的,我将其降低为每 10 秒一次。

但是 activity 似乎根本没有被调用。 Logcat 什么都不显示,也没有 Toast 出现,更不用说创建通知了。

Context 可能是问题所在,我并不完全理解我要经过那里的意思,所以我可能在传递 MainActivity.this 时犯了一个错误,但我想不通当我尝试 Google 时找出更合适的方法。

此代码包含在我的 MainActivityOnCreate 方法中

button.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        task = enterTask.getText().toString();
        if (!task.equals("Enter task here...") &&
                !task.equals("")) {
            Toast.makeText(getApplicationContext(),
                    "Saved task " + task,
                    Toast.LENGTH_LONG).show();

            SharedPreferences.Editor editor = prefs.edit();
            editor.putString("Current_Task", task);
            editor.commit();

            Context context = MainActivity.this;
            AlarmManager mgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

            Intent i = new Intent(context, Notify.class);
            PendingIntent pi=PendingIntent.getBroadcast(context, 0, i, 0);

            mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                    SystemClock.elapsedRealtime(),
                    //AlarmManager.INTERVAL_HOUR,
                    10000,
                    pi);
        }
    }
});

这是我的 Notify activity:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //setContentView(R.layout.activity_notify);

    Toast.makeText(getApplicationContext(),
            "Notifying",
            Toast.LENGTH_LONG).show();

    prefs = PreferenceManager.getDefaultSharedPreferences(this);
    try {
        task = prefs.getString("Current_Task", "");
    } catch (Exception e) {
        e.printStackTrace();
    }

    if (!task.equals("")){
        mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        mBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("Current task")
                .setContentText("Hey! Have you " + task + "?");

        mNotificationManager.notify(1, mBuilder.build());
    }
}

任何人都可以帮助我理解我的错误吗?

for testing purposes I lowered it to every 10 seconds

请注意,根据您的 Android 版本,它可能不会经常发生。从Android 5.1开始,最短时间为一分钟。

However it doesn't seem like the activity gets called at all.

通过 AlarmManager 定期启动 activity 类似于用霰弹枪射击用户的脸:是的,它引起了他们的注意,但不是一个很好的方式。

事实上,您设置警报的代码是正确的:您正在使用 getBroadcast() 作为 PendingIntent。这将触发 BroadcastReceiver,而不是 Activity。使用 BroadcastReceiver 是提高 Notification 的更好解决方案,因为 BroadcastReceiver 本身没有任何 UI,因此不会通过接管前台来打扰用户.

我建议您设置清单注册 BroadcastReceiver 并将您的代码从 onCreate()(从首选项开始)放入 BroadcastReceiveronReceive()

如果您真的想要定期启动activity,并且您不介意您的用户威胁要对您做不幸的事情,请使用getActivity() 而不是 getBroadcast() 在创建 PendingIntent.