在Android Xamarin表单中使用警报管理器计划通知 [英] Schedule notification using alarm manager in xamarin forms for android

查看:70
本文介绍了在Android Xamarin表单中使用警报管理器计划通知的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  • 我已经创建了一个依赖项来显示通知

  • I have created a dependencie to show the notifications

在我的DeviceDetails_Droid.cs中,我将设置闹钟设置为30秒

In My DeviceDetails_Droid.cs I've set set alarm for 30 seconds

当应用程序处于运行状态时,本地通知功能可以完美运行 处于活动状态,但是当我杀死该应用程序(关闭应用程序)时,警报接收器 没有接到电话.

The functionality for local notification works perfectly when app is active but when I killed the app (close app) the alarm receiver not getting called.

public void ShowNotification(string message, string title)
{

Intent alarmIntent = new Intent(Forms.Context, typeof(AlarmReceiver));
alarmIntent.PutExtra ("message", message);
alarmIntent.PutExtra ("title", title);

    PendingIntent pendingIntent = PendingIntent.GetBroadcast(Forms.Context, 0, alarmIntent, PendingIntentFlags.UpdateCurrent);
    AlarmManager alarmManager = (AlarmManager) Forms.Context.GetSystemService(Context.AlarmService);

    //TODO: For demo set after 5 seconds.
    alarmManager.Set(AlarmType.RtcWakeup, DateTime.Now.Millisecond + 30000, pendingIntent);
}


  • 在Android的MainActivity中

    • In Androids MainActivity
    • [BroadcastReceiver]
      public class AlarmReceiver : BroadcastReceiver
      {
          public override void OnReceive (Context context, Intent intent)
          {
      
              var message = intent.GetStringExtra ("message");
              var title = intent.GetStringExtra ("title");
      
              var notIntent = new Intent (context, typeof(MainActivity));
              var contentIntent = PendingIntent.GetActivity (context, 0, notIntent, PendingIntentFlags.CancelCurrent);
              var manager = NotificationManagerCompat.From (context);
      
              var style = new NotificationCompat.BigTextStyle();
              style.BigText(message);
      
      
      
              //Generate a notification with just short text and small icon
              var builder = new NotificationCompat.Builder (context)
                  .SetContentIntent (contentIntent)
                  .SetSmallIcon (Resource.Drawable.Icon)
                  .SetContentTitle (title)
                  .SetContentText (message)
                  .SetStyle (style)
                  .SetWhen (Java.Lang.JavaSystem.CurrentTimeMillis ())
                  .SetAutoCancel (true);
      
              var notification = builder.Build();
              manager.Notify(0, notification);
          }
      }
      


      • 在清单文件中

        • And in manifest file
        • <receiver 
           android:name=".AlarmReceiver" 
           android:enabled="true" 
           android:exported="true" 
           android:process=":remote" 
           android:label="AlarmReceiver">
          


          • 当应用处于运行状态时,上述代码可以完美运行 但是当应用关闭或被终止时,通知不起作用

            • The above code is running perfectly when app is in running state But the notification is not working when app is closed or killed
            • 推荐答案

              1)如果有人杀死了您的应用程序,则注册到您的应用程序的警报将被取消.

              1) If someone kills your app, alarms registered to your app are cancelled.

              2)您可以在设备的Boot后台启动服务以注册警报,或运行设置通知的任何其他代码...

              2) You can start your service in the background on Boot of the device in order to register your alarms, or run any other code you need to setup your notifications...

              • 在您的BroadcastReceiver中添加"android.intent.action.BOOT_COMPLETED":
              [BroadcastReceiver]
              [IntentFilter(new string[]{"android.intent.action.BOOT_COMPLETED"}, Priority = (int)IntentFilterPriority.LowPriority)]
              public class AlarmReceiver : BroadcastReceiver
              


              • 在清单中添加启动完成权限:

                • In your manifest add in the boot complete permission:
                • <uses-permission android:name="android.permission.WAKE_LOCK"/>
                  <uses-permission android:name="com.android.alarm.permission.SET_ALARM"/>
                  <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>    
                  


                  对于Xamarin的股票价格示例,如果您将"RECEIVE_BOOT_COMPLETED"设置为自动",则会重启服务,并且您的手机重启后,您将开始接收通知,而无需先启动您的应用程序:


                  In the case of Xamarin's Stock Price example, if you set "RECEIVE_BOOT_COMPLETED" you are "auto" restart your service and the your will start receiving notifications upon reboot of their phone without first launching your app:

                  [BroadcastReceiver]
                  [IntentFilter(new string[]{StockService.StocksUpdatedAction,Boo "android.intent.action.BOOT_COMPLETED"}, Priority = (int)IntentFilterPriority.LowPriority)]
                  public class StockNotificationReceiver : BroadcastReceiver
                  

                  3)您可以将ServiceSeviceIntent相对使用,并覆盖StartCommandResult以返回Sticky

                  3) You can use a Service vs. a SeviceIntent and override the StartCommandResult to return Sticky

                  对于基于粘性的服务,如果被终止,它将重新启动.

                  With a Sticky-based Service, it is restarted if it gets terminated.

                  恒定从onStartCommand(Intent,int,int)返回:如果此服务的进程在启动时被杀死(从onStartCommand(Intent,int,int)返回之后),则将其保持在启动状态,但不要保留此交付意图.稍后,系统将尝试重新创建服务.因为它处于启动状态,所以它将保证在创建新服务实例后调用onStartCommand(Intent,int,int);如果没有任何待处理的启动命令要传递给服务,则将使用空的intent对象调用该命令,因此您必须注意进行检查.

                  Constant to return from onStartCommand(Intent, int, int): if this service's process is killed while it is started (after returning from onStartCommand(Intent, int, int)), then leave it in the started state but don't retain this delivered intent. Later the system will try to re-create the service. Because it is in the started state, it will guarantee to call onStartCommand(Intent, int, int) after creating the new service instance; if there are not any pending start commands to be delivered to the service, it will be called with a null intent object, so you must take care to check for this.

                      public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
                      {
                          return StartCommandResult.Sticky;
                      }
                  

                  这篇关于在Android Xamarin表单中使用警报管理器计划通知的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆