【问题标题】:Schedule notification using alarm manager in xamarin forms for android在 Android 的 xamarin 表单中使用警报管理器安排通知
【发布时间】:2016-04-18 05:13:33
【问题描述】:
  • 我创建了一个依赖项来显示通知

  • 在我的 DeviceDetails_Droid.cs 中,我设置了 30 秒的闹钟

  • 本地通知功能在应用程序启动时完美运行 活动但当我杀死应用程序(关闭应用程序)警报接收器 没有被调用。


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 中

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

  • 在清单文件中

<receiver 
 android:name=".AlarmReceiver" 
 android:enabled="true" 
 android:exported="true" 
 android:process=":remote" 
 android:label="AlarmReceiver">

  • 上述代码在app处于运行状态时完美运行 但是当应用程序关闭或终止时通知不起作用

【问题讨论】:

标签: android xamarin xamarin.android local


【解决方案1】:

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

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

  • 将“android.intent.action.BOOT_COMPLETED”添加到您的广播接收器:

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

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

<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 的 Stock Price example 的情况下,如果您设置“RECEIVE_BOOT_COMPLETED”,您将“自动”重新启动您的服务,并且您将在重新启动手机时开始接收通知,而无需先启动您的应用程序:

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

3) 您可以使用 ServiceSeviceIntent 并覆盖 StartCommandResult 以返回 Sticky

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

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

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

【讨论】:

  • 我查看了第一段here,听起来在这种情况下可能不需要SET_ALARM 权限,是这样吗?我正在尝试安排本地通知,并想知道是否应该添加该权限。似乎到目前为止没有它。谢谢。
  • @hvaughan3 如果您正在编写自己的闹钟应用程序,则需要设置该权限以接收意图。如果您从警报应用程序接收意图,则不需要。
  • 现在说得通了。谢谢
  • @SushiHangover,您能帮我们一个忙并编辑发布到您的答案的问题,因为我想知道我应该将哪个类放在 PCL 中的依赖项
  • @LutaayaHuzaifahIdris 你说的是基于Xamarin.Forms' 的依赖服务吗?如果是这样,请发布一个新问题,因为问题是关于 Xamarin.Android native 并且所有这些代码都编写在 Xamarin.Android 应用程序或库项目中
【解决方案2】:

AlarmManager 将在应用程序在前台或后台运行时工作。但是当应用程序退出/强制停止/杀死时,警报管理器也会被杀死。只有当 Android 重新启动或用户再次启动应用程序时,警报才会再次响起。检查这些答案也以供参考link1link2

【讨论】:

  • 还是这样吗?您分享的链接现在有点过时了。
  • 那么现有的警报应用程序是怎么做的呢?因为对他们来说,无论他们被杀死多少,它们仍然可以工作
猜你喜欢
  • 2016-07-27
  • 1970-01-01
  • 2017-04-25
  • 1970-01-01
  • 2017-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多