AlarmManager 从不运行
AlarmManager never runs
我对 Android 非常缺乏经验,并且无法尝试将 AlarmManager
基本上 运行 一个每小时产生一个通知的小 activity(对于出于测试目的,我将其降低为每 10 秒一次。
但是 activity 似乎根本没有被调用。 Logcat 什么都不显示,也没有 Toast
出现,更不用说创建通知了。
Context
可能是问题所在,我并不完全理解我要经过那里的意思,所以我可能在传递 MainActivity.this
时犯了一个错误,但我想不通当我尝试 Google 时找出更合适的方法。
此代码包含在我的 MainActivity
的 OnCreate
方法中
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()
(从首选项开始)放入 BroadcastReceiver
的 onReceive()
。
如果您真的想要定期启动activity,并且您不介意您的用户威胁要对您做不幸的事情,请使用getActivity()
而不是 getBroadcast()
在创建 PendingIntent
.
时
我对 Android 非常缺乏经验,并且无法尝试将 AlarmManager
基本上 运行 一个每小时产生一个通知的小 activity(对于出于测试目的,我将其降低为每 10 秒一次。
但是 activity 似乎根本没有被调用。 Logcat 什么都不显示,也没有 Toast
出现,更不用说创建通知了。
Context
可能是问题所在,我并不完全理解我要经过那里的意思,所以我可能在传递 MainActivity.this
时犯了一个错误,但我想不通当我尝试 Google 时找出更合适的方法。
此代码包含在我的 MainActivity
的 OnCreate
方法中
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()
(从首选项开始)放入 BroadcastReceiver
的 onReceive()
。
如果您真的想要定期启动activity,并且您不介意您的用户威胁要对您做不幸的事情,请使用getActivity()
而不是 getBroadcast()
在创建 PendingIntent
.