gestionnaire de notification Android ne fonctionne pas avec l'écran est éteint
-
09-10-2019 - |
Question
J'ai un compte à rebours que quand il se déclenche (à zéro), il vérifie si l'application a le focus. Dans le cas contraire, il lance une notification dans la barre de notification. Lorsque vous cliquez sur la notification est réouvre l'application. Maintenant, tout cela fonctionne bien, mais si l'écran arrive à partir, la minuterie continue à aller et la notification est disponible au bon moment, mais jamais réellement sonne ou vibre jusqu'à ce que je tourne le dos d'écran. Ensuite, il affiche la notification comme il a été en attente dans une file d'attente ou quelque chose.
Comment puis-je obtenir pour que le gestionnaire de notification avertit l'utilisateur en fait lorsque l'écran est éteint?
Mise à jour: Si je mets la minuterie pendant 2 minutes, il faut encore 2-3 minutes pour la notification à fait le travail. Donc, il ne fonctionne pas, mais il est sur un retard énorme!
code: Donc, la configuration I le service de notification lorsque l'application perd le focus, et quand est vérifie la MyCount1 est terminée si l'application a le focus et sinon il montre la notification. Tout cela fonctionne lorsque le rétroéclairage de l'écran est allumé. Une fois éteint, il est peu fiable.
@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);
}
}
}
La solution
Maintenant, tout cela fonctionne très bien, mais si l'écran arrive à partir, la minuterie continue à aller et la notification est disponible au bon moment, mais jamais réellement sonne ou vibre jusqu'à ce que je tourne le dos d'écran. Ensuite, il affiche la notification comme il a été en attente dans une file d'attente ou quelque chose.
Comment puis-je obtenir pour que le gestionnaire de notification avertit l'utilisateur en fait lorsque l'écran est éteint?
Lorsque l'écran est éteint, la CPU cessera de fonctionner peu après, à moins que quelque chose tient un WakeLock
.
Ce signifie deux choses:
-
Vous comprenez tout cela et tenez un
WakeLock
. Cela peut ou peut ne pas être une bonne idée, du point de vue de ce que les utilisateurs comme avec leurs appareils (par exemple, une bonne autonomie de la batterie). Quoi qu'il en soit, vous devrez peut-être tenir uneWakeLock
plus forte, qui maintient l'écran au moins faible. Je ne l'ai pas essayé élever unNotification
alors sous unWakeLock
, donc je ne suis pas certain que les règles sont. -
Tu ne comprends pas tout cela, et sont donc penser que votre minuterie va quand, en réalité, l'appareil est tombé endormi et le CPU est désactivé. Lorsque les tours CPU rallumé, votre minuterie sera immédiatement.
Utilisation AlarmManager
vous permet de faire des événements en fonction timer qui éveillent l'appareil et ne nécessitent pas votre code à traîner en mémoire dans l'intervalle. Je ne sais pas ce que vous essayez de faire ici (semble assez bizarre de votre description), mais AlarmManager
peut être utile de quelque chose d'instruction en remplacement de votre minuterie.
Autres conseils
Il va probablement lorsque le téléphone est réveillé par une autre application, par exemple l'application de messagerie passe périodiquement pour vérifier les nouveaux e-mails. Vous devez définir votre propre alarme incendie au moment où vous avez besoin. http://developer.android.com/reference/android/app/AlarmManager.html
NotificationManager n'a pas la notion du temps. Il doit être déclenché en quelque sorte. Le problème dans votre cas est que, si vous laissez le sommeil de téléphone, il fera tout cela. Les alarmes sont existent spécifiquement pour vous permettre de réveiller l'appareil lorsque vous avez besoin.