Android 8.0 Oreo AlarmManager avec récepteur de radiodiffusion ou implicite de la diffusion de l'interdiction
J'ai critique des rappels qui sont définies par l'intermédiaire de l'Alarme Manager (Il doit fonctionner de la même façon qu'un réveil demande).
Auparavant, j'avais de la suite dans mon Manifeste Android:
<receiver android:name="com.example.app.AlarmReceiver" >
<intent-filter>
<action android:name="${packageName}.alarm.action.trigger"/>
</intent-filter>
</receiver>
Le récepteur de radiodiffusion:
public class AlarmReceiver extends BroadcastReceiver {
@Override public void onReceive(
final Context context,
final Intent intent) {
//WAKE LOCK
//BUILD NOTIFICATION etc...
}
}
Comment l'alarme est activée:
final PendingIntent operation = PendingIntent.getBroadcast(
mContext,
requestCode,
intent,
PendingIntent.FLAG_CANCEL_CURRENT);
if (PlatformUtils.hasMarshmallow()) {
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, triggerAtMillis, operation);
} else {
alarmManager.setExact(AlarmManager.RTC_WAKEUP, triggerAtMillis, operation);
}
}
Avec Android 8.0 je ne peux plus utiliser implicite de diffusion tel que défini dans le Manifeste. C'est bien, l'alternative est donné pour enregistrer manuellement comme suit:
final BroadcastReceiver receiver = new AlarmReceiver();
final IntentFilter intentFilter = new IntentFilter(ALARM_RECEIVER_INTENT_TRIGGER);
context.registerReceiver(receiver, intentFilter);
Cela ne semble pas logique pour moi.
-
Le récepteur d'alarme sera liée à la durée de vie du contexte. Cela provoque un problème lorsque dire que l'application est tué à cause de la pression de mémoire ou lorsque l'appareil est redémarré. J'ai besoin de mon alarmes à feu à chaque fois qu'ils sont essentiels pour la santé de l'utilisateur.
-
Même si j'écoute de la "android.l'intention.d'action.BOOT_COMPLETED" et enregistrer mon récepteur d'alarme de l'application est tué peu de temps après, et aucune alarme n'est déclenchée. Aussi, je ne vois pas mon alarme via
adb shell dumpsys alarme
Comment puis-je créer un récepteur de radiodiffusion qui reçoit un implicite de diffusion pour déclencher une alarme tout en ciblant Android O (8.0)? Quelqu'un peut-il m'éclairer avec un exemple de code ou un lien vers la documentation. Comment en temps Opportun ou de tout autre réveil application de la fonction tout en ciblant O?
Vous devez vous connecter pour publier un commentaire.
Réviser votre code légèrement pour faire de la diffusion explicite plutôt qu'implicite et vous serez amende (en supposant que
this
est unActivity
de référence ou de certains autresContext
):La restriction prévue à l'Oreo est sur implicite diffusion
Intent
d'inscription, qui est de dire qu'il vous envoi les émissions seule une action, d'une catégorie ou de données spécifié. Vous faire un explicite diffusées par la spécification de la classe, qui est de recevoir la diffusion.ALARM_RECEIVER_INTENT_TRIGGER
est la chaînecom.example.app.alarm.action.trigger
de votre manifeste), mais vous devriez probablement ajouter unandroid:export="false"
dans l'entrée pour empêcher les autres applications d'essayer d'envoyer votre récepteur de diffusion qui pourrait mess pour vous.Intent
spécifie exactement qui package d'application et des composants (instance de classe) le recevra. Une application ne peut pas être explicitementIntent
objet qui sont envoyés à une autre application.Intent
, je suis d'accord. Mais pas un mot sur le expliciteIntent
par Google, pour moi, ça sonne il n'y a aucune nouvelle restriction. Mais je ne suis pas capable de le faire fonctionner avec api26. Quand vous avez écrit: il n'est pas possible, vous ne pouvez dire api 26 (parce que api25 fonctionne) mais Google n'écrit que sur les nouvelles implicite diffusion de restrictionIntent
. ExpliciteIntent
s ont été dans Android depuis la 1.0, il n'y a rien de nouveau là. La seule chose qui est nouveau, c'est la restriction implicite intentions.Si vous les gars sont utilisés pour vérifier si l'alarme a déjà été enregistré, n'oubliez pas de faire la même chose sur cette vérification: