代码之家  ›  专栏  ›  技术社区  ›  Paul Sinnema

状态通知如何获取数据或重新发送意图?

  •  12
  • Paul Sinnema  · 技术社区  · 8 年前

    1. 应用程序在后台
    2. 应用程序未运行

    只要点击抽屉中的通知,情况2和3就可以正常工作。 在情况2和3中,当点击应用程序图标而不是抽屉图标时,应用程序根本不会收到任何通知。我试图从状态栏获取活动通知,但我无法从附加程序中检索数据,也无法将通知重新发送到等待的推送通知服务。下面是获取通知的实验代码。

            NotificationManager notificationManager = (NotificationManager)Application.Context.GetSystemService(Context.NotificationService);
    
            var notifications = notificationManager.GetActiveNotifications()
                .Where(notif => notif.PackageName == Application.Context.PackageName);
    
            foreach (var notification in notifications)
            {
                Log.Info(TAG, "OnActivityResumed: Notification in active in Status Bar: {0}", notification.Notification.ToString());
    
                var data = notification.Notification.Extras.GetString("data");
    
                Log.Debug("Notifier", "Data received: {0}", data);
    
                //if (data != null)
                //{
                //    Settings.Notification = JsonConvert.DeserializeObject<LoginNotificationParameter>(data);
                //}
            }
    
            // Canceling all notifications
            notificationManager.CancelAll();
    

    1. 当抽屉中有通知时,应用程序没有收到任何意图,这是正确的行为吗?
    2. 如果是这样,当用户点击应用程序图标而不是抽屉通知时,我如何处理情况2和3?

    打印所有附加键值时,我在het通知中看到这些数据:

    06-28 16:34:13.174 20792 20792 I Notifier: OnActivityResumed: Notification is active in Status Bar: Notification(pri=0 contentView=null vibrate=null sound=content://settings/system/notification_sound defaults=0x0 flags=0x10 color=0x00000000 vis=PRIVATE semFlags=0x0 semPriority=0)
    06-28 16:34:13.191 20792 20792 I Notifier: KeyIn: Extras Key: android.title Data: Login
    06-28 16:34:13.191 20792 20792 I Notifier: KeyIn: Extras Key: android.subText Data:
    06-28 16:34:13.191 20792 20792 I Notifier: KeyIn: Extras Key: android.template Data: android.app.Notification$BigTextStyle
    06-28 16:34:13.192 20792 20792 I Notifier: KeyIn: Extras Key: android.showChronometer Data: false
    06-28 16:34:13.192 20792 20792 I Notifier: KeyIn: Extras Key: android.text Data: Er is een inlogverzoek voor u ontvangen.
    06-28 16:34:13.194 20792 20792 I Notifier: KeyIn: Extras Key: android.progress Data: 0
    06-28 16:34:13.194 20792 20792 I Notifier: KeyIn: Extras Key: android.progressMax Data: 0
    06-28 16:34:13.195 20792 20792 I Notifier: KeyIn: Extras Key: android.appInfo Data: ApplicationInfo{a27f281 nl.natuurnetwerk.notifier}
    06-28 16:34:13.195 20792 20792 I Notifier: KeyIn: Extras Key: android.showWhen Data: true
    06-28 16:34:13.195 20792 20792 I Notifier: KeyIn: Extras Key: android.largeIcon Data:
    06-28 16:34:13.195 20792 20792 I Notifier: KeyIn: Extras Key: android.bigText Data: Er is een inlogverzoek voor u ontvangen.
    06-28 16:34:13.195 20792 20792 I Notifier: KeyIn: Extras Key: android.infoText Data:
    06-28 16:34:13.195 20792 20792 I Notifier: KeyIn: Extras Key: android.originatingUserId Data: 0
    06-28 16:34:13.196 20792 20792 I Notifier: KeyIn: Extras Key: android.progressIndeterminate Data: false
    06-28 16:34:13.196 20792 20792 I Notifier: KeyIn: Extras Key: android.remoteInputHistory Data:
    
    3 回复  |  直到 8 年前
        1
  •  7
  •   AstroCB    8 年前

    好的,这适用于我能想到的所有应用程序状态:

    using Android.App;
    using Android.Content;
    using Android.OS;
    using MvvmCross.Droid.Platform;
    using MvvmCross.Droid.Support.V4;
    
    namespace Notifier.Android.Classes.Services
    {
        /// <summary>
        /// This class receives all Firebase intents.
        /// </summary>
        [BroadcastReceiver(Enabled = true, Permission = "com.google.android.c2dm.permission.SEND")]
        [IntentFilter(new[] { "com.google.android.c2dm.intent.RECEIVE" }, Categories = new string[] { "com.yourdomain.yourapp" })]
        public class FirebaseBroadcastReceiver : MvxWakefulBroadcastReceiver
        {
            public override void OnReceive(Context context, Intent intent)
            {
                var setup = MvxAndroidSetupSingleton.EnsureSingletonAvailable(context);
                setup.EnsureInitialized();
    
                var service = new Intent(context, typeof(FirebaseBroadcastReceiver));
    
                PowerManager.WakeLock sWakeLock;
                var pm = PowerManager.FromContext(context);
                sWakeLock = pm.NewWakeLock(WakeLockFlags.Full, "FirebaseBroadcastReceiver");
                sWakeLock.Acquire();
    
    
                if (intent.Extras != null)
                {
                    // Your code to handle the intent
                }
    
                sWakeLock.Release();
    
                StartWakefulService(context, service);
            }
        }
    }
    
        2
  •  1
  •   Paul Sinnema    8 年前

        private void HandlePendingNotifications()
        {
            NotificationManager notificationManager = (NotificationManager)Application.Context.GetSystemService(Context.NotificationService);
    
            var notifications = notificationManager.GetActiveNotifications()
                .OrderByDescending(notif => notif.PostTime)
                .Where(notif => notif.PackageName == Application.Context.PackageName);
    
            var notification = notifications.FirstOrDefault();
    
            if (notification != null)
            {
                Log.Debug(TAG, "OnActivityResumed: Notification is active in Status Bar: {0}", notification.Notification.ToString());
    
                NotificationManagerCompat nm = NotificationManagerCompat.From(this);
    
                notification.Notification.Sound = null;
                notification.Notification.Vibrate = null;
    
                // nm.Cancel(notification.Id);
                nm.Notify(0, notification.Notification);
            }
    
            //Timer timer = new Timer((state) =>
            //{
            //    // Canceling all notifications
            //    notificationManager.CancelAll();
            //    timer = null;
            //}, null, 2000, 2000);
        }
    

    但由于某些原因,通知已发送,但从未到达我的应用程序。

        3
  •  1
  •   Mahendra Liya    8 年前

    延伸 FirebaseMessagingService 并覆盖 onMessageReceived onDeletedMessages 回调。要在收到通知时自动打开应用程序/活动,您需要使用 data (类似于 {"data" : { "some_key" : "some_value"}} )属性,该属性保证始终调用 FirebaseMessagingService.onMessageReceived()

    请注意,在没有用户交互的情况下打开活动/应用程序是非常糟糕的,应该避免。