#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. Возможно, вы также захотите добавить дополнительное извлечение