我开发了一个应用程序,它启动一个自定义服务,触发一个倒计时。服务在计时器开始时运行一个通知,在计时器结束时运行另一个通知。在测试过程中,我发现通知和锁定屏幕有问题。我描述了我所做的测试:
1)如果我运行应用程序,不让手机关机或锁定,服务播放通知声音正确,如果主应用程序(活动)在前面,而不是。在这两种情况下,服务都可以完美地触发通知。
2)如果我锁定手机,并且在锁定前应用程序在前面,则服务会正确播放通知声音。
3)这是我的问题:如果我锁定手机,应用程序没有在锁定前,通知没有声音,但服务看起来像是在运行,因为当我按下手机中的"打开"按钮时,然后屏幕打开后立即播放通知(声音和图标),就在锁定屏幕之前我可以解锁手机。
我在服务中的代码取消先前的通知,这是定时器结束后运行通知的代码:
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次测试不能正确运行?
欢迎任何帮助。
提前谢谢。
注::我说的通知声音是指声音+图标
当你锁定屏幕时(通常在一到两分钟内),手机就会进入睡眠模式。你有三个选择,其中两个更好。
- 在服务中使用
startForeground
。这样,它就会在前面。但是它仍然会受到睡眠模式的影响。 - 使用WAKE_LOCK -这是我最喜欢的选项,但它需要在应用程序中获得额外的权限,无知的用户通常不理解。
- 用闹钟管理器设置一个闹钟-因为播放通知不需要处理时间,这可能是最好的方法,然后你会发送一个广播当警报触发时,这将导致
BroadcastReceiver
使通知声音。
如果你需要一个可视化的倒计时计时器,那么也运行服务,但是不要依赖一个没有WAKE_LOCK的服务来保持清醒。如果用户的手机不好,或者试图使用一个占用太多内存的应用程序,服务也会被破坏——我的手机可能会杀死它,因为我的手机很烂。
我喜欢唤醒锁,但闹钟管理器可能是最好的方法。
且无论手机是醒着还是睡着,Context
都将保持不变。上下文基于它所在的运行进程/类/代码块。如果上下文引起了问题,我希望它抛出异常并强制关闭。