Приложение Xamarin для Android с сбоем FCM после завершения работы и повторного открытия

#c# #android #xamarin #xamarin.android #firebase-cloud-messaging

#c# #Android #xamarin #xamarin.android #firebase-облако-обмен сообщениями

Вопрос:

Я успешно внедрил push-уведомления Firebase Cloud Messaging (FCM) в своем приложении. Приложение может получать уведомления, когда оно находится на переднем плане, и переходить к соответствующему действию. Однако, когда я завершаю работу приложения и пытаюсь открыть его снова, приложение выходит из строя.

Вот мой код первого действия, то есть действия Splash:

   protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        Thread.Sleep(3000);
        Intent intent;

        if (string.IsNullOrEmpty(oStaticVariables.MembershipID))
        {
            intent = new Intent(this, typeof(LoginView));
        } 
        else
        {
            oStaticVariables.NewsListPreviousPosition = "";
            oStaticVariables.PTRShown = false;
            oStaticVariables.UpdateMsgShown = false;
            intent = new Intent(this, typeof(MainActivity));
        }

            StartActivity(intent);
            Finish();
        CheckForBackgroundFCMNotifications();

    }


   *Fired when app is in background and the app receives notification*
    private void CheckForBackgroundFCMNotifications()
    {
        if (Intent.Extras != null)
        {
            foreach (var key in Intent.Extras.KeySet())
            {
                var value = Intent.Extras.GetString(key);
                //Log.Debug("", "Key: {0} Value: {1}", key, value);
                if (key == "NotifyId")
                {
                    oStaticVariables.GCMID = value;
                }
                if (key == "Header")
                {
                    oStaticVariables.GCMSubject = value;
                }
            }

            Intent nextActivity = new Intent(this, typeof(NewsNotifications));
            StartActivity(nextActivity);

        }

    }
  

Если я удалю метод CheckForBackgroundFCMNotifications (), приложение не завершит работу после завершения работы и повторного открытия. Но мне действительно нужен этот метод для получения сведений об уведомлении и перехода к соответствующему действию, когда приложение работает в фоновом режиме.

Пожалуйста, помогите

Комментарии:

1. Что это за исключение / трассировка стека, которое вы получаете?

Ответ №1:

Без трассировки стека мы не можем сказать наверняка, но я почти уверен, что это либо потому, что вы запускаете действие из действия, которое уже завершено, либо потому, что вы запускаете два действия. В любом случае, вы вызываете logic неправильно.

Сначала проверьте намерение на наличие дополнительных функций. затем, если есть дополнительные функции, обработайте их и запустите соответствующее действие (в вашем случае NewsNotifications — КСТАТИ, вам действительно следует вызвать это NewsNotificationsActivity для согласованности именования), а если нет, запустите обычное действие (в вашем случае MainActivity).

     protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);    
        if (Intent.Extras == null)
        {   
            if (string.IsNullOrEmpty(oStaticVariables.MembershipID))
            {
                var intent = new Intent(this, typeof(LoginView));
                StartActivity(intent);
            } 
            else
            {
                intent.PutExtra("NewsListPreviousPosition", "");
                intent.PutExtra("PTRShown", false);
                intent.PutExtra("UpdateMsgShown", false);
                var intent = new Intent(this, typeof(MainActivity));
                StartActivity(intent);
            }
            Finish();
        }
        else
        {
            CheckForBackgroundFCMNotifications();
        } 
    }

   // Called when app is in background and the app receives notification
    private void CheckForBackgroundFCMNotifications()
    {
         Intent nextActivity = new Intent(this, typeof(NewsNotificationsActivity));
         foreach (var key in Intent.Extras.KeySet())
         {
                try  // just in case the value is not a string
                {
                    var value = Intent.Extras.GetString(key);
                    //Log.Debug("", "Key: {0} Value: {1}", key, value);
                    if (key == "NotifyId")
                        nextActivity.PutExtra("NotifyId", value);
                    if (key == "Header")
                        nextActivity.PutExtra("Header", value);
                catch {}
        }
        StartActivity(nextActivity);
    }
  

Затем извлеките дополнительные значения из intent в MainActivity и NewsNotificationsActivity вместо статической переменной в другом activity. Возможно, вы также захотите добавить дополнительное извлечение