Alarm Manager ne fonctionne pas en arrière-plan sur Android 6.0
C'est mon Activity
code,
Long time = new GregorianCalendar().getTimeInMillis()+20000;//Setting alarm after 20 sec
Intent intentAlarm = new Intent("alarm");
intentAlarm.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intentAlarm.putExtra("req_code",10);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context,10, intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, time, pendingIntent);
Ce sont toutes les autorisations que j'ai dans mon application,
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<uses-permission android:name="com.myapp.pack.permission.SET_ALARM"/>
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
C'est mon BroadcastReceiver
code,
@Override
public void onReceive(Context context, Intent intent) {
SharedPreferences sharedPreferences =
context.getSharedPreferences( "mydata", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean("elligible",true);
editor.apply();
}
J'ai enregistré mon BroadcastReceiver
dans le manifeste,
<receiver android:name="com.myapp.pack.AlarmReciever" android:enabled="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="alarm" />
</intent-filter>
</receiver>
Le code ci-dessus s'exécute correctement la BroadcastReceiver
sur la pré-Guimauve périphériques dans le fond ,mais sur une Guimauve à l'appareil ,le BroadcastReceiver
ne soit pas exécutée. Personne ne sait ce qui pourrait se passer ici? Merci.
source d'informationauteur Parag Kadam
Vous devez vous connecter pour publier un commentaire.
Il ya un couple de choses que vous pouvez essayer qui, lorsqu'il est utilisé de concert, devrait être en mesure de couper à travers l'ensemble de la veille/veille/doze modes (indépendamment de la version de l'OS).
1. Utiliser un
WakefulBroadcastReceiver
au lieu d'un simpleBroadcastReceiver
. Assurez-vous d'inclure lesWAKE_LOCK
l'autorisation de l'utiliser correctement.2. Utiliser le
setExactAndAllowWhileIdle()
méthode (API 23 & ci-dessus) pour programmer leIntent
pour le récepteur:Références:
1. Alarme gestionnaire de services d'arrière-plan.
2. Un organigramme pour le travail de fond, les alarmes, et votre application Android.
La raison peut être Doze mode introduit dans Android 6.0 Guimauve. Utilisation setAlarmclock() au lieu de
set()
. Il est spécialement conçu pour les réveils, pendules et peut être en mesure de couper à travers doze. Il y a quelques bad commandes que vous pouvez utiliser pour mettre manuellement un téléphone dans somnoler ou de l'application en mode veille:https://developer.android.com/preview/features/power-mgmt.html
Si ce n'est pas en mesure de se réveiller de votre application, il est la méthode infaillible setExactAndAllowWhileIdle() est conçu pour réveiller le téléphone de doze n'importe quoi. Le pire scénario, vous pouvez sortir de votre application avec cette méthode et d'utiliser la fonction de réveil à l'annexe de la prochaine alarme.
Référence:
Comment faire Alarm Manager de travail quand Android 6.0 dans Doze mode?