2
votes

Dois-je utiliser BroadcastReceiver ou Service avec le gestionnaire d'alarmes?

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);


2 commentaires

honnêtement, je ne vois aucune différence si votre Intent pointe vers un Service ou BroadcastReceiver - mais vous pouvez vérifier WorkManager sources et voyez comment ils font cela


celui-ci androidx / work / impl / background / systemalarm / SystemAlarmService‌ .java en particulier - il est exécuté depuis androidx / work / impl / background / systemalarm / Alarms.java


3 Réponses :


-1
votes
[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();
    }

2 commentaires

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.



1
votes

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.


3 commentaires

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



0
votes

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


0 commentaires