#開発環境
Visual Studio 2017 Community 15.9.4
Xamarin.Forms 3.4.0.1009999
Xamarin.GooglePlayServices.Base 60.1142.1
Xamarin.GooglePlayServices.Tasks 60.1142.1
Xamarin.Firebase.Messaging 60.1142.1
#やりたいこと
Firebase Cloud Messaging(以下FCM)を用いて通知を受け取った際に画面を遷移させたい。
#コード
こちらの質問を参照して頂きたいです。
#知りたいこと
上記コードの「OnMessageReceived」内に入ってきたときに、Xamarinの共通コードで書かれたページに遷移する方法が知りたいです。
その際にデータも渡したいのですがその方法も知りたいです。
Xamarin.Formsで実装したいため、Intentでの画面遷移は考えていません。
#試したこと
グローバルな変数を作成し、そこに現在のページを代入させ、その変数からPushAsyncを呼ぼうとしましたがエラーになりました。
(現在スマートフォンからの投稿のため、詳細なコードは後程追記します。)
データを渡す際にグローバルな変数に入れて渡そうと思いましたが、Xamarinの共通コードとAndroidではインスタンスが異なるのか、代入しても値は反映しませんでした。
上記方法のコードを紛失してしまったため、別の試したことを書きます。
FCMのコードを下記のように修正。
C#
1public override void OnMessageReceived(RemoteMessage message) 2{ 3 GetDataNotification(message.Data); 4} 5 6void GetDataNotification(IDictionary<string, string> keyValues) 7{ 8 if (keyValues.ContainsKey("data")) 9 { 10 var intent = new Intent(this, typeof(MainActivity)); 11 intent.PutExtra("data", keyValues["data"]); 12 StartActivity(intent); 13 } 14}
MainActivityのコードを下記のように修正しました。
C#
1protected override void OnCreate(Bundle savedInstanceState) 2{ 3 // 初期化処理等 4 var data = this.Intent.GetStringExtra("data"); 5 LoadApplication(new App(data)); 6}
Appは下記のように修正しました。
C#
1public App(string data = null) 2{ 3 if (data != null) 4 { 5 MainPage = new Page1(data); 6 } 7 else 8 { 9 MainPage = new Page2(); 10 } 11}
Page1の初期化コードは下記の様になっています。
C#
1public Page1(string data = null) 2{ 3 InitializeComponent(); 4 this.data.Text = data; 5}
上記のように修正した後、FCMからdataを含むデータを送信したとき、アプリが異常終了してしまいました。
またタスクキルされた状態ではOnMessageReceivedにすら入って来ませんでした。
どのように修正すれば画面を表示出来るでしょうか?
出来ればタスクキルされた状態からでも表示させたいのですが出来ますでしょうか?
#追記
intent.AddFlags(ActivityFlags.NewTask);
上記行をStartActivityを行う前に追加することで表示出来ました。
OnMessageReceivedに入ってこなかったのは実際に送信されるまでにかなり時間を要していたからのようです。
1時間後くらいに通知が来ました。
この方法を使うと一応動くのですが、アプリの上にアプリが起動しているような状態になります。
これで開いたページでバックボタンを押すと前に開いていた画面が出てきてしまいます。
出来れば新規でページを開きたいのですが、どのようなフラグをつければよいのでしょうか?
SingleTopフラグでは異常終了してしまい、上手く動作しませんでした。
#解決方法
intent.AddFlags(ActivityFlags.NewTask | ActivityFlags.ClearTop);
このようにすることで意図した動作になりました。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/01/16 06:35
2019/01/17 03:33
退会済みユーザー
2019/01/17 06:38
2019/01/17 08:33