Dois-je appeler mon service via un récepteur de diffusion ou l'appeler directement à l'aide du gestionnaire d'alarmes. Actuellement, j'utilise le service directement, mais parfois l'alarme n'est pas déclenchée.
PendingIntent pendingIntent = PendingIntent.getService(getContext().getApplicationContext(), 1, myIntent,PendingIntent.FLAG_UPDATE_CURRENT); AlarmManager alarmMgr = (AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE); alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),AlarmManager.INTERVAL_DAY, pendingIntent);
3 Réponses :
[Service] public class AppStickyService : Service { public override void OnCreate() { base.OnCreate(); // Toast.MakeText(this, "Service started Habiibi", ToastLength.Long).Show(); //WireAlarm(); System.Diagnostics.Debug.WriteLine("Sticky Service - Created"); } public override StartCommandResult OnStartCommand(Android.Content.Intent intent, StartCommandFlags flags, int startId) { SetAlarm(12,39,"Try","Start Service"); return StartCommandResult.Sticky; } public override Android.OS.IBinder OnBind(Android.Content.Intent intent) { System.Diagnostics.Debug.WriteLine("Sticky Service - Binded"); //WireAlarm(); return null; } public override void OnDestroy() { System.Diagnostics.Debug.WriteLine("Sticky Service - Destroyed"); base.OnDestroy(); WireAlarm(); }
pouvez-vous élaborer plus sur la réponse?
ce code doit avoir un service permanent comme lorsque l'application est inactive ou en veille, elle fait une notification.
BroadcastReceiver n'est destiné à aucun type d'opérations de longue durée (qu'elles soient synchrones ou asynchrones en attente d'un rappel). Il est simplement utilisé pour recevoir un événement (diffusion), puis pour transférer toute action de plus longue durée au composant approprié (c'est-à-dire Activité ou Service).
IntentService est destiné à une opération synchrone de longue durée qui est gérée sur un autre thread. Un service (au premier plan) vous permet d'agir plus ou moins comme une activité invisible. Vous pouvez attendre les rappels asynchrones (c'est-à-dire l'utilisateur rejetant l'alarme).
Vous pouvez utiliser cette bibliothèque que j'ai créée. service en arrière-plan et au premier plan avec lui, vous exécutez le service et que vous recevez l'appel avec diffusion
avec un code simple, vous démarrez l'appel ou démarrez votre service comme ceci
BroadcastReceiver alarm_receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // your logic here Log.i("alarm_received", "success"); } };
et faites votre action dans cette méthode
RunService service = new RunService(this); service.call(5);
n'oubliez pas d'enregistrer le service et de supprimer le service lors de la destruction comme vous le voyez dans la documentation.
Mais cela ne répond pas à ma question.
Ce que je demande, c'est de démarrer un service depuis un BroadcastReciver ou de l'appeler directement depuis un gestionnaire d'alarmes. Généralement, la plupart des gens appellent le service depuis BroadcastReciver. Je veux savoir quelle est la bonne pratique.
il n'y a aucune raison de l'appeler depuis la diffusion, vous devez l'appeler directement
Je suggère d'utiliser Récepteur de diffusion et lorsque onReceive
vous pouvez tirer le service ou faire quoi que ce soit, cela est également utile surtout lorsque vous avez besoin de recevoir android.intent.action .BOOT_COMPLETED
pour replanifier vos alarmes en attente car lorsque l'appareil redémarrera, le système d'exploitation supprimera toutes les alarmes en attente, pour plus d'informations, vérifiez ceci lien
honnêtement, je ne vois aucune différence si votre
Intent
pointe vers unService
ouBroadcastReceiver
- mais vous pouvez vérifier WorkManager sources et voyez comment ils font celacelui-ci
androidx / work / impl / background / systemalarm / SystemAlarmService .java
en particulier - il est exécuté depuisandroidx / work / impl / background / systemalarm / Alarms.java