Должен ли я использовать BroadcastReceiver или Service с диспетчером аварийных сигналов? - PullRequest
0 голосов
/ 01 января 2019

Должен ли я позвонить в службу через широковещательный приемник или напрямую позвонить в диспетчер тревог.В настоящее время я использую сервис напрямую, но иногда тревога не срабатывает.

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 ]

0 голосов
/ 01 января 2019

BroadcastReceiver не предназначен для каких-либо длительных операций (синхронных или асинхронных, ожидающих некоторого обратного вызова).Он просто используется для получения какого-либо события (широковещания), а затем для передачи любого более продолжительного действия соответствующему компоненту (например, Activity или Service).

IntentService для длительной синхронной операции, которая обрабатываетсядругая нить.Служба (на переднем плане) позволяет вам более или менее действовать как невидимая активность.Вы можете ожидать асинхронные обратные вызовы (то есть, пользователь отклоняет сигнал тревоги).

Вы можете использовать эту библиотеку, которую я создал. служба в фоновом режиме и на переднем плане с ее помощью вы запускаете службу, а затем принимаете звонок с широковещательной передачей

с простым кодом, когда вы начинаете звонить или запускаете свою службу, как это

RunService service = new RunService(this);
service.call(5);

и выполните свои действия в этом методе

  BroadcastReceiver alarm_receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            // your logic here
            Log.i("alarm_received", "success");

        }
    };

не забудьте зарегистрировать сервис и удалить сервис по уничтожению так же, как вы видите в документации.

0 голосов
/ 01 января 2019

Я предлагаю использовать Вещательный приемник , и когда onReceive вы можете запустить службу или сделать что-либо, это также полезно, особенно когда вам нужно получить android.intent.action.BOOT_COMPLETED для переназначения ожидающих сигналов тревоги, потому что, когда устройство перезапускаетОС удалит все ожидающие тревоги, для получения дополнительной информации проверьте эту ссылку

0 голосов
/ 01 января 2019
namespace Diabetes.Droid

{[Приложение] открытый класс MainApplication: Application {ISetAlarm alarmService;public static Context AppContext;

    public MainApplication()
    {

    }
    public MainApplication(IntPtr handle, JniHandleOwnership transer) : base(handle, transer)
    {
    }


    public override void OnCreate()
    {

        base.OnCreate();
        AppContext = this.ApplicationContext;
        alarmService = new SetAlarmImplementation();
        alarmService.SetAlarm(13,58,"hello","great work ");
    }



    public void SetAlarm(int hour, int minute, string title, string message)
    {

        AppContext.StartService(new Intent(AppContext, typeof(AppStickyService)));
        Intent myintent = new Intent(Android.App.Application.Context, typeof(AppStickyService));
        myintent.PutExtra("message", message);
        myintent.PutExtra("title", title);
        //PendingIntent pendingintent = PendingIntent.GetBroadcast(Android.App.Application.Context, 0, myintent, PendingIntentFlags.UpdateCurrent);
        PendingIntent pintent = PendingIntent.GetService(AppContext, 0, new Intent(AppContext, typeof(AppStickyService)), 0);

        Java.Util.Date date = new Java.Util.Date();
        Java.Util.Calendar cal = Java.Util.Calendar.Instance;
        cal.TimeInMillis = Java.Lang.JavaSystem.CurrentTimeMillis();
        cal.Set(Java.Util.CalendarField.HourOfDay, hour);
        cal.Set(Java.Util.CalendarField.Minute, minute);
        cal.Set(Java.Util.CalendarField.Second, 0);
        AlarmManager alarmManager = Android.App.Application.Context.GetSystemService(Android.Content.Context.AlarmService) as AlarmManager;
        alarmManager.Set(AlarmType.RtcWakeup, cal.TimeInMillis, pintent);
        // alarmManager.Cancel(pintent);

    }





    public void StartService()
    {

        AppContext.StartService(new Intent(AppContext, typeof(AppStickyService)));
        if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.Kitkat)
        {

            PendingIntent pintent = PendingIntent.GetService(AppContext, 0, new Intent(AppContext, typeof(AppStickyService)), 0);
            //AlarmManager alarm = (AlarmManager)AppContext.GetSystemService(Context.AlarmService);
            Toast.MakeText(this, "Service started", ToastLength.Long).Show();
            //alarm.Cancel(pintent);
        }
    }

    public static void StopService()
    {
        AppContext.StopService(new Intent(AppContext, typeof(AppStickyService)));
        if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.Kitkat)
        {
            // Toast.MakeText(this,"Service started", ToastLength.Long).Show();

            //PendingIntent pintent = PendingIntent.GetService(AppContext, 0, new Intent(AppContext, typeof(AppStickyService)), 0);
            // AlarmManager alarm = (AlarmManager)AppContext.GetSystemService(Context.AlarmService);
            //alarm.Cancel(pintent);
        }
    }
}

Это AlarmImplementation.class

public class SetAlarmImplementation : ISetAlarm
{

    public SetAlarmImplementation(){}


    public void SetAlarm(int hour, int minute, string title, string message)
    {


        Intent myintent = new Intent(Android.App.Application.Context, typeof(AlarmReceiver));
        myintent.PutExtra("message", message);
        myintent.PutExtra("title", title);
        PendingIntent pendingintent = PendingIntent.GetBroadcast(Android.App.Application.Context, 0, myintent, PendingIntentFlags.UpdateCurrent);

        Java.Util.Date date = new Java.Util.Date();
        Java.Util.Calendar cal = Java.Util.Calendar.Instance;
        cal.TimeInMillis = Java.Lang.JavaSystem.CurrentTimeMillis();
        cal.Set(Java.Util.CalendarField.HourOfDay, hour);
        cal.Set(Java.Util.CalendarField.Minute, minute);
        cal.Set(Java.Util.CalendarField.Second, 0);

        AlarmManager alarmManager = Android.App.Application.Context.GetSystemService(Android.Content.Context.AlarmService) as AlarmManager;
        alarmManager.Set(AlarmType.RtcWakeup, cal.TimeInMillis, pendingintent);
    }
}
This is BroadcastReceiver.class
[BroadcastReceiver]
[IntentFilter(new string[] { "android.intent.action.BOOT_COMPLETED" }, Priority = (int)IntentFilterPriority.LowPriority)]
public class AlarmReceiver : BroadcastReceiver
{

    public override void OnReceive(Context context, Intent intent)
    {

        var message = intent.GetStringExtra("message");
        var title = intent.GetStringExtra("title");

        //Show toast here
        //Toast.MakeText(context, "Hello it's me ", ToastLength.Short).Show();
        var extras = intent.Extras;

        if (extras != null && !extras.IsEmpty)
        {
            NotificationManager manager_ = context.GetSystemService(Context.NotificationService) as NotificationManager;
            var notificationId = extras.GetInt("NotificationIdKey", -1);
            if (notificationId != -1)
            {
                manager_.Cancel(notificationId);
            }
        }

        //Create intent for action 1 (TAKE)
        var actionIntent1 = new Intent();
        actionIntent1.SetAction("ARCHIVE");
        var pIntent1 = PendingIntent.GetBroadcast(context, 0, actionIntent1, PendingIntentFlags.CancelCurrent);

        //Create intent for action 2 (REPLY)
        var actionIntent2 = new Intent();
        actionIntent2.SetAction("REPLY");
        var pIntent2 = PendingIntent.GetBroadcast(context, 0, actionIntent2, PendingIntentFlags.CancelCurrent);

        Intent resultIntent = context.PackageManager.GetLaunchIntentForPackage(context.PackageName);

        var contentIntent = PendingIntent.GetActivity(context, 0, resultIntent, PendingIntentFlags.CancelCurrent);

        var pending = PendingIntent.GetActivity(context, 0,
            resultIntent,
            PendingIntentFlags.CancelCurrent);
        //seting an alarm
        MedicationDatabase db = new MedicationDatabase();
        var alarm_list = db.GetAlarmList();
        //Debug.WriteLine(" Time -- : "+ m.ToString());


        // Instantiate the Big Text style:
        Notification.BigTextStyle textStyle = new Notification.BigTextStyle();


        var builder =
            new Notification.Builder(context)
                            .AddAction(Resource.Drawable.tick_notify, "ARCHIVE", pIntent1)
                            .AddAction(Resource.Drawable.cancel_notify, "REPLY", pIntent2)
                            .SetSmallIcon(Resource.Drawable.ic_launcher)
                            .SetContentTitle("Diabetics Reminder")
                            .SetDefaults(NotificationDefaults.Sound)
                            .SetStyle(new Notification
                            .BigTextStyle()
                            .SetSummaryText("")
                            .SetBigContentTitle(title)
                            .BigText(message)
         ).SetDefaults(NotificationDefaults.All);

        builder.SetContentIntent(pending);

        var notification = builder.Build();


        var manager = NotificationManager.FromContext(context);
        manager.Notify(10010, notification);

    }
}

, и это окончательный класс обслуживания

[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();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...