[英]Android push notification from xamarin.forms button click hangs
[英]When click on notification app does not run MainActivity in Android [Xamarin.Forms]
我一直在尝试在我的 android 应用程序中实现重复的本地通知,并且我已经很好地实现了这一点(我相信)但是当我想单击我的通知并在其中执行逻辑时 1. 不启动 MainActivity(不启动我到应用程序) 2. 不执行任何逻辑
在我的 MainActivity.cs 文件中,我也将 LaunchMode 设置为 SingleTop 我有方法 OnNewIntent() 的相应覆盖,当我点击它时会收到我的通知,但它只是根本不执行该方法,即使
由于我实现了与我的共享代码项目通信的接口,我使用 BroadcastReceiver 发送我的通知,我在其他类中调用它而不是 MainActivity.cs(因为我看到很多人这样做)。
调用通知的方法:
public void ScheduleNotification(string title, string message, long seconds)
{
if (!channelInitialized)
CreateNotificationChannel();
NotificationReciever.title = title;
NotificationReciever.message = message;
AlarmManager alarmManager = (AlarmManager)AndroidApp.Context.GetSystemService(Context.AlarmService);
Intent intent = new Intent(AndroidApp.Context, typeof(NotificationReciever));
intent.PutExtra(TitleKey, title);
intent.PutExtra(MessageKey, message);
intent.AddFlags(ActivityFlags.ClearTop);
PendingIntent pendingIntent = PendingIntent.GetBroadcast(AndroidApp.Context, 0, intent, PendingIntentFlags.UpdateCurrent);
alarmManager.SetRepeating(AlarmType.ElapsedRealtimeWakeup, SystemClock.ElapsedRealtime() + seconds * 1000, 2000, pendingIntent);
}
我的广播接收器:
[BroadcastReceiver(Enabled =true)]
public class NotificationReciever : BroadcastReceiver
{
const string channelId = "default";
public static string title = "";
public static string message = "";
const string channelName = "Default";
const string channelDescription = "The default channel for notifications.";
const int pendingIntentId = 0;
public const string TitleKey = "title";
public const string MessageKey = "message";
int messageId = -1;
NotificationManager manager;
public override void OnReceive(Context context, Intent intent)
{
PendingIntent pendingIntent = PendingIntent.GetActivity(AndroidApp.Context, pendingIntentId, intent, PendingIntentFlags.OneShot);
NotificationCompat.Builder builder = new NotificationCompat.Builder(AndroidApp.Context, channelId)
.SetContentIntent(pendingIntent)
.SetContentTitle(title)
.SetContentText(message)
.SetLargeIcon(BitmapFactory.DecodeResource(AndroidApp.Context.Resources, Resource.Drawable.OlympiaLogo))
.SetSmallIcon(Resource.Drawable.OlympiaLogo)
.SetDefaults((int)NotificationDefaults.Sound | (int)NotificationDefaults.Vibrate);
manager = (NotificationManager)context.GetSystemService(AndroidApp.NotificationService);
var notification = builder.Build();
manager.Notify(messageId, notification);
}
}
最后是我的 MainActivity.cs(当我点击通知时不会被执行的那个):
[Activity(Label = "LocalNotificationsApp", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation, LaunchMode = LaunchMode.SingleTop)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
protected override void OnCreate(Bundle savedInstanceState)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
CrossCurrentActivity.Current.Init(this, savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
CreateNotificationFromIntent(Intent);
LoadApplication(new App());
//
//AndroidNotificationManager.alarmManager = (AlarmManager)GetSystemService(Context.AlarmService);
}
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
protected override void OnNewIntent(Intent intent)
{
CreateNotificationFromIntent(intent);
}
void CreateNotificationFromIntent(Intent intent)
{
if (intent?.Extras != null)
{
string title = intent.Extras.GetString(AndroidNotificationManager.TitleKey);
string message = intent.Extras.GetString(AndroidNotificationManager.MessageKey);
if(title != null && message != null)
DependencyService.Get<INotificationManager>().ReceiveNotification(title, message);
}
}
}
尝试创建一个全新的意图并使用主活动,而不是重用传递给OnReceived
的活动
[BroadcastReceiver(Enabled =true)]
public class NotificationReciever : BroadcastReceiver
{
const string channelId = "default";
public static string title = "";
public static string message = "";
const string channelName = "Default";
const string channelDescription = "The default channel for notifications.";
const int pendingIntentId = 0;
public const string TitleKey = "title";
public const string MessageKey = "message";
int messageId = -1;
NotificationManager manager;
public override void OnReceive(Context context, Intent intent)
{
// pull stuff from old intent.
string title = intent.Extras.GetString(TitleKey);
string message = intent.Extras.GetString(MessageKey);
// Instead of using intent that is passed in. Create a new one.
Intent mainIntent = new Intent(AndroidApp.Context, typeof(MainActivity));
var bundle = new Bundle();
bundle.PutString(TitleKey, title);
bundle.PutString(MessageKey, message);
mainIntent.PutExtras(bundle);
mainIntent.AddFlags(ActivityFlags.ClearTop);
PendingIntent pendingIntent = PendingIntent.GetActivity(AndroidApp.Context, pendingIntentId, intent, PendingIntentFlags.UpdateCurrent);
NotificationCompat.Builder builder = new NotificationCompat.Builder(AndroidApp.Context, channelId)
.SetContentIntent(pendingIntent)
.SetContentTitle(title)
.SetContentText(message)
.SetLargeIcon(BitmapFactory.DecodeResource(AndroidApp.Context.Resources, Resource.Drawable.OlympiaLogo))
.SetSmallIcon(Resource.Drawable.OlympiaLogo)
.SetDefaults((int)NotificationDefaults.Sound | (int)NotificationDefaults.Vibrate);
manager = (NotificationManager)context.GetSystemService(AndroidApp.NotificationService);
var notification = builder.Build();
manager.Notify(messageId, notification);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.