2011-11-21 27 views
3

我开发了一个应用程序,启动一个自定义服务,启动一个倒计时器。该服务在计时器的开始和结束时的其他时间运行通知。 在测试过程中,我看到有关通知和锁定屏幕的问题。我描述了我所做的测试:安卓锁定设备通知不听起来

1)如果我运行该应用程序,并且不让手机关闭或锁定,则该服务将正确播放通知声音,就好像主应用程序(活动)在前面一样。在这两种情况下,服务都会完美地发出通知。

2)如果我锁定了手机,并且应用程序在锁定之前位于前面,则该服务会正确播放通知声音。

3)这里是我的问题:如果我锁定手机,并且在锁定之前应用程序没有在前面,通知不会响起,但服务看起来像正在运行,因为当我按下“on”按钮时我的手机,然后在屏幕打开之后连续播放,它会播放通知(声音和图标),只需在锁定屏幕中解锁手机即可。

我的服务代码将取消先前的通知,这是定时器运行后通知代码结束:

private void notificacion_fin() { 
    NotificationManager notificationManager = 
      (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
    notificationManager.cancel(0); 
    Notification not = new Notification(); 
    // Ponemos la nueva notificacion de que hemos acabado 
    SharedPreferences preferences = this.getSharedPreferences("com.fsp.mypref", 0); 
    String not_sound = preferences.getString("notification_tone",""); 
    not.audioStreamType = AudioManager.STREAM_NOTIFICATION; 
    not.sound = Uri.parse(not_sound); 
    if (tipo_cronometro == 1) { 
     not.icon = R.drawable.ic_stat_notify_time; 
     not.tickerText = "Task has finished"; 
    } else { 
     not.icon = R.drawable.ic_stat_notify_complete; 
     not.tickerText = "Type 2 task has finished"; 
    } 
    not.when = System.currentTimeMillis(); 
    not.defaults |= Notification.DEFAULT_VIBRATE; 
    not.vibrate = new long[] {300,300,300,300,300}; 
    not.flags |= Notification.FLAG_AUTO_CANCEL; 
    Intent notificationIntent = new Intent(this, MyActivity.class); 
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); 
    not.setLatestEventInfo(this, "My app", not.tickerText, contentIntent); 
    notificationManager.notify(0, not); 
    notificacion = true; 
} 

我怀疑我的问题可能是一些相对而言, 会这样?有谁知道会发生什么? 为什么我的第3次测试不能正确运行?
任何帮助将是很好的。
在此先感谢。

P.S:当我说通知声音我的意思是声音+图标

+0

可以使用desrcibe如何解决您的问题我也面临同样的问题...你可以发表你的正确的代码 – user3233280

回答

1

好吧,只要你锁定屏幕(一两分钟内,通常情况下)手机进入睡眠模式。你有三个选择,其中两个更好。

  1. 对您的服务使用startForeground。这样,它将基本上在前面。但它仍然会受到睡眠模式的影响。
  2. 使用WAKE_LOCK - 这是我最喜欢的选项,但它需要应用程序的额外权限,这是无知的用户通常无法理解的。
  3. 使用Alarm Manager设置闹钟 - 由于播放通知不需要花费时间,因此这可能是最好的方法,然后当闹铃触发时会发出广播,导致BroadcastReceiver发出通知声音。

如果你需要一个可视倒数计时器,那么也运行该服务,但不要依赖服务保持唤醒而不使用WAKE_LOCK。如果用户手机坏了,或者尝试使用太多内存的应用程序,服务也可能被破坏 - 我的手机可能会因为我的手机太烂而杀死它。

我喜欢唤醒锁,但报警管理器可能是最好的方法。

而且Context将保持不变,不管手机是醒着还是睡着。上下文基于正在运行的进程/类/代码块。如果上下文导致问题,我希望它会抛出异常并强制关闭。

+0

我正在调查wake_lock,这对我来说更容易。如果我这样做,我必须在我的通知之前放置wakeLock.acquire,在我的例程中第一行,并在最后一行wakeLock.release()?或者我必须做到与众不同?此外,wakeLock.acquire()是否会打开屏幕,还是只在屏幕先前打开时才会运行,以便不会关闭?我的目的是什么是四旗中最好的?谢谢 – Tibor

+0

你想要一个可以在屏幕上打开或关闭的部分唤醒锁。它只是让CPU保持清醒。您将在服务创建时获得并在服务的销售中发布。 – Jakar

+0

谢谢。我已经用这个解决方案解决了这个问题 – Tibor