我使用这些说明将Azure Notification Hub基于FCM的远程通知添加到我的Xamarin.Forms Android应用程序中。
当应用程序在后台打开或运行时,我可以收到远程通知,但是当我关闭应用程序或停止应用程序时,我不再收到远程通知。
我的测试设备正在运行API级别22,因此我使用以下方法在设备上构建通知。
Android.Support.V4.App.NotificationCompat.Builder builder = new Android.Support.V4.App.NotificationCompat.Builder(this)
对于API级别26+,我使用follow方法和通道在设备上构建通知。
var builder = new Android.App.Notification.Builder(this)
我想我必须使用BroadcastReceiver来实现这一点,但在阅读了很多关于这个主题的评论后我真的不知道。我的应用程序使用API 27编译,目标是API 27。
方法1
我正在尝试创建一个BroadcastReceiver,它将在Notification到达时使用Explicit Intent启动MyService。不幸的是,这不适用于我的API Level 22测试设备。
//[BroadcastReceiver]
//[IntentFilter(new[] { Android.Content.Intent.ActionBootCompleted })]
[BroadcastReceiver(Enabled = true, Exported = true)]
[IntentFilter(new[] { "com.xamarin.example.TEST" })]
public class MyBroadcastReceiver : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
string message = intent.GetStringExtra("message");
string title = intent.GetStringExtra("title");
string id = intent.GetStringExtra("id");
//Explicit Intent to launch MyService
Intent intent2 = new Intent(Application.Context, typeof(MyService));
intent2.PutExtra("message", message);
intent2.PutExtra("title", title);
intent2.PutExtra("id", id);
Application.Context.StartService(intent2);
}
}
// Service is exported and given a name so other applications can use it
[Service(Exported = true, Name = "com.mycompany.myapp.MyService")]
// Intent filter only needed for Implicit Intents
//[IntentFilter(new string[] { "com.xamarin.example.TEST" })]
public class MyService : Service
{
public static string PRIMARY_NOTIF_CHANNEL = "default";
public override IBinder OnBind(Intent intent)
{
return null;
}
[return: GeneratedEnum]
public override StartCommandResult OnStartCommand(Intent intent, [GeneratedEnum] StartCommandFlags flags, int startId)
{
var pm = PowerManager.FromContext(this);
var wakeLock = pm.NewWakeLock(WakeLockFlags.Partial, "Notification");
wakeLock.Acquire();
string message = intent.GetStringExtra("message");
string title = intent.GetStringExtra("title");
string id = intent.GetStringExtra("id");
var intent2 = new Intent(this, typeof(MainActivity));
intent2.PutExtra("id", id);
intent2.AddFlags(ActivityFlags.ClearTop);
var pendingIntent = PendingIntent.GetActivity(this, 0, intent, PendingIntentFlags.OneShot);
NotificationManager notificationManager = (NotificationManager)GetSystemService(Context.NotificationService);
Android.Support.V4.App.NotificationCompat.Builder builder = new Android.Support.V4.App.NotificationCompat.Builder(this)
.SetAutoCancel(true)
.SetContentIntent(pendingIntent)
.SetContentTitle(title)
.SetContentText(message)
.SetSound(RingtoneManager.GetDefaultUri(RingtoneType.Notification))
.SetVibrate(new long[1])
//1 is Hi
.SetPriority(1)
.SetLargeIcon(BitmapFactory.DecodeResource(Resources, SalesFlash.Droid.Resource.Drawable.Icon_lg))
.SetSmallIcon(MyApp.Droid.Resource.Drawable.icon)
.SetChannelId(PRIMARY_NOTIF_CHANNEL);
notificationManager = NotificationManager.FromContext(this);
notificationManager.Notify(0, builder.Build());
wakeLock.Release();
//return StartCommandResult.Sticky;
return base.OnStartCommand(intent, flags, startId);
}
public override void OnDestroy()
{
base.OnDestroy();
}
}
根据这篇文章,BroadCastReceiver不适用于FCM通知。 https://stackoverflow.com/a/44287962/5360237
这篇文章似乎显示BroadcastReceiver接受通知。 https://stackoverflow.com/a/45616014/5360237
任何帮助深表感谢。提前致谢!
这是我读过的最好的帖子,解释了这个问题。它还为受影响的设备提供手动解决方案。 https://medium.freecodecamp.org/why-your-push-notifications-never-see-the-light-of-day-3fa297520793我可以通过导航到“设置” - “应用”然后再向“限制”选项卡滑动,在我的阿尔卡特One Touch Pop上获取通知工作(当应用关闭,停止或未运行时)。从这里,我可以取消选中我的应用程序。
注意:使用数据有效负载将消息传递到我的Android应用程序。即使我在前台和后台收到通知,我也继续向AndroidManifest添加以下权限。
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
此权限用于自动启动。我还使用Azure App Center将签名的APK分发给我的测试设备。希望这有助于其他人。
更新:我删除了RECEIVE_BOOT_COMPLETE
权限并执行了Debug Build。我通过从屏幕上滑动将应用程序从调试(连接到Visual Studio)中关闭。然后我发送了通知,但没有显示。然后我重新打开了应用程序(没有被Visual Studio调试)并通过在屏幕上滑动关闭它,发送通知并且它有效。因此,它与RECEIVE_BOOT_COMPLETE
权限没有任何关系,它不一定是发布版本/签名APK。