Android通知管理器无法使用屏幕关闭

时间:2010-11-12 22:16:25

标签: android notificationmanager screen-off

我有一个倒计时器,当它关闭时(为零)它会检查应用程序是否有焦点。如果没有,它会在通知栏中启动通知。当您单击该通知时,将重新打开该应用程序。现在所有这一切都运行良好,但如果屏幕正好关闭,计时器继续运行,通知在正确的时间可用,但实际上从未振动或响铃,直到我重新打开屏幕。然后它会显示通知,就像它在队列中等待一样。

如何获取它以便通知管理器在屏幕关闭时实际提醒用户?

更新:如果我将计时器设置为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);
            }
        }
       }

2 个答案:

答案 0 :(得分:2)

当手机被其他一些应用程序唤醒时,它可能会消失,例如电子邮件应用程序会定期检查新电子邮件。您需要在需要时设置自己的闹钟。 http://developer.android.com/reference/android/app/AlarmManager.html

NotificationManager没有时间概念。它必须以某种方式触发。在你的情况下,问题是,如果你让手机睡觉,它就会这样做。警报是专门存在的,因此您可以在需要时唤醒设备。

答案 1 :(得分:2)

  

现在所有这一切都运行良好但是如果屏幕发生了关闭,计时器会继续运行并且通知在正确的时间可用,但在我重新打开屏幕之前从未实际振动或响铃。然后它会显示通知,就像它在队列中等待一样。

     

如何获取它以便通知管理器在屏幕关闭时实际提醒用户?

当屏幕关闭时,CPU将在此后不久停止运行,除非某些东西持有WakeLock

这意味着以下两件事之一:

  1. 您了解所有这些并持有WakeLock。从用户喜欢他们的设备(例如,良好的电池寿命)的观点来看,这可能是或可能不是一个好主意。尽管如此,你可能需要保持一个更强大的WakeLock,一个让屏幕保持至少昏暗的Notification。我没有尝试在WakeLock下提出AlarmManager,所以我不确定规则是什么。

  2. 你不明白这一切,因此在实际上,当设备已经睡着并且CPU已经关闭时,你会想到计时器正在运行。当CPU再次打开时,您的计时器将立即关闭。

  3. 使用AlarmManager可以让您执行唤醒设备的基于计时器的事件,同时不要求您的代码在内存中闲置。我不知道你在这里要做什么(从你的描述中看起来很奇怪),但{{1}}可能值得调查,作为你的计时器的替代品。