Android Notification Manager不使用屏幕
-
09-10-2019 - |
题
我有一个计数计时器,即(零),它会检查该应用程序是否有焦点。如果没有,它将在通知栏中启动通知。当您单击通知时,将重新打开应用程序。现在所有这些都可以正常工作,但是如果屏幕恰好熄灭,计时器会继续下去,并且通知在正确的时间可用,但是直到我重新打开屏幕之前,就永远不会振动或戒指。然后,它显示通知,就像在队列中等待一样。
如何获得它,以便在关闭屏幕时,通知管理器实际上会提醒用户?
更新:如果我将计时器设置2分钟,则需要另外2-3分钟的通知才能实际工作。因此,它确实有效,但延迟很大!
代码:因此,当应用程序失去焦点时,我设置了通知服务,并且完成MyCount1完成后,请检查应用程序是否有焦点,如果不是,则显示通知。当屏幕背光打开时,这一切都起作用。一旦脱落,它就不可靠。
@Override
public void onWindowFocusChanged(boolean hasFocus){
if(hasFocus == false){
mFocusFlag = false;
ns = Context.NOTIFICATION_SERVICE;
mNotificationManager = (NotificationManager) getSystemService(ns);
icon = R.drawable.statusbar;
tickerText = "Check the timer!!!";
when = System.currentTimeMillis();
notification = new Notification(icon, tickerText, when);
context = getApplicationContext();
contentTitle = "Countdown Timer";
contentText = "Click to Check the Timer";
notification.defaults |= Notification.DEFAULT_SOUND;
notification.defaults |= Notification.DEFAULT_VIBRATE;
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notificationIntent = new Intent(this, StartTimer.class);
contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
}else{
mFocusFlag = true;
}
}
public class MyCount1 extends CountDownTimer {
public MyCount1(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
public void onFinish() {
if(mFocusFlag == false){
mNotificationManager.notify(HELLO_ID, notification);
}else{
mVib.vibrate(1000);
}
}
public void onTick(long millisUntilFinished) {
if((millisUntilFinished/1000%60) < 10){
mTime.setText("1st Side = " + millisUntilFinished/60000 + ":0" + (millisUntilFinished / 1000)%60);
}else{
mTime.setText("1st Side = " + millisUntilFinished/60000 + ":" + (millisUntilFinished / 1000)%60);
}
}
}
解决方案
现在所有这些都可以正常工作,但是如果屏幕恰好熄灭,计时器会继续下去,并且通知在正确的时间可用,但是直到我重新打开屏幕之前,就永远不会振动或戒指。然后,它显示通知,就像在队列中等待一样。
如何获得它,以便在关闭屏幕时,通知管理器实际上会提醒用户?
当屏幕关闭时,CPU此后不久将停止运行,除非有东西持有 WakeLock
.
这意味着两件事之一:
您了解所有这些,并持有
WakeLock
. 。从用户使用设备(例如电池寿命)的角度来看,这可能是一个好主意。无论如何,您可能需要更强大WakeLock
, ,一个使屏幕至少保持昏暗。我没有尝试抚养Notification
在一个WakeLock
, ,所以我不确定规则是什么。您不了解所有这些,因此认为您的计时器正在进行,而实际上该设备已经入睡并且CPU已关闭。当CPU再次打开时,您的计时器将立即熄灭。
使用 AlarmManager
允许您进行基于计时器的事件,以唤醒设备,并且不需要您的代码在此期间挂在内存中。我不知道您在这里要做什么(从您的描述来看似乎很奇怪),但是 AlarmManager
可能是值得调查的事情,以替代您的计时器。
其他提示
当手机被其他某些应用程序唤醒时,它可能会熄灭,例如,电子邮件应用程序定期检查新电子邮件。您需要在需要时设置自己的警报以发射。 http://developer.android.com/reference/android/app/alarmmanager.html
NotificationManager没有时间的概念。它必须以某种方式触发。在您的情况下,问题是,如果您让手机入睡,它将做到这一点。警报是专门存在的,因此您可以在需要时唤醒设备。