簡體   English   中英

當點擊通知應用程序在 Android [Xamarin.Forms] 中不運行 MainActivity

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM