質問編集履歴

3 解決方法の追加。

VEX

VEX score 88

2019/01/17 15:54  投稿

【Xamarin】Push通知を受け取った際に画面遷移を行いたい【Android】
#開発環境
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)を用いて通知を受け取った際に画面を遷移させたい。
#コード
[こちらの質問](https://teratail.com/questions/168287)を参照して頂きたいです。
#知りたいこと
上記コードの「OnMessageReceived」内に入ってきたときに、Xamarinの共通コードで書かれたページに遷移する方法が知りたいです。
その際にデータも渡したいのですがその方法も知りたいです。
Xamarin.Formsで実装したいため、Intentでの画面遷移は考えていません。
#試したこと
~~グローバルな変数を作成し、そこに現在のページを代入させ、その変数からPushAsyncを呼ぼうとしましたがエラーになりました。
(現在スマートフォンからの投稿のため、詳細なコードは後程追記します。)
データを渡す際にグローバルな変数に入れて渡そうと思いましたが、Xamarinの共通コードとAndroidではインスタンスが異なるのか、代入しても値は反映しませんでした。~~
上記方法のコードを紛失してしまったため、別の試したことを書きます。
FCMのコードを下記のように修正。
```C#
public override void OnMessageReceived(RemoteMessage message)
{
   GetDataNotification(message.Data);
}
void GetDataNotification(IDictionary<string, string> keyValues)
{
   if (keyValues.ContainsKey("data"))
   {
       var intent = new Intent(this, typeof(MainActivity));
       intent.PutExtra("data", keyValues["data"]);
       StartActivity(intent);
   }
}
```
MainActivityのコードを下記のように修正しました。
```C#
protected override void OnCreate(Bundle savedInstanceState)
{
   // 初期化処理等
   var data = this.Intent.GetStringExtra("data");
   LoadApplication(new App(data));
}
```
Appは下記のように修正しました。
```C#
public App(string data = null)
{
   if (data != null)
   {
       MainPage = new Page1(data);
   }
   else
   {
       MainPage = new Page2();
   }
}
```
Page1の初期化コードは下記の様になっています。
```C#
public Page1(string data = null)
{
   InitializeComponent();
   this.data.Text = data;
}
```
上記のように修正した後、FCMからdataを含むデータを送信したとき、アプリが異常終了してしまいました。
~~またタスクキルされた状態ではOnMessageReceivedにすら入って来ませんでした。
どのように修正すれば画面を表示出来るでしょうか?
出来ればタスクキルされた状態からでも表示させたいのですが出来ますでしょうか?~~
#追記
`intent.AddFlags(ActivityFlags.NewTask);`
上記行をStartActivityを行う前に追加することで表示出来ました。
OnMessageReceivedに入ってこなかったのは実際に送信されるまでにかなり時間を要していたからのようです。
1時間後くらいに通知が来ました。
この方法を使うと一応動くのですが、アプリの上にアプリが起動しているような状態になります。
これで開いたページでバックボタンを押すと前に開いていた画面が出てきてしまいます。
出来れば新規でページを開きたいのですが、どのようなフラグをつければよいのでしょうか?
SingleTopフラグでは異常終了してしまい、上手く動作しませんでした。
SingleTopフラグでは異常終了してしまい、上手く動作しませんでした。
#解決方法
`intent.AddFlags(ActivityFlags.NewTask | ActivityFlags.ClearTop);`
このようにすることで意図した動作になりました。
  • C#

    10459 questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Android

    8002 questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Xamarin

    694 questions

    Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

2 追記を追加。

VEX

VEX score 88

2019/01/17 15:32  投稿

【Xamarin】Push通知を受け取った際に画面遷移を行いたい【Android】
#開発環境
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)を用いて通知を受け取った際に画面を遷移させたい。
#コード
[こちらの質問](https://teratail.com/questions/168287)を参照して頂きたいです。
#知りたいこと
上記コードの「OnMessageReceived」内に入ってきたときに、Xamarinの共通コードで書かれたページに遷移する方法が知りたいです。
その際にデータも渡したいのですがその方法も知りたいです。
Xamarin.Formsで実装したいため、Intentでの画面遷移は考えていません。
#試したこと
~~グローバルな変数を作成し、そこに現在のページを代入させ、その変数からPushAsyncを呼ぼうとしましたがエラーになりました。
(現在スマートフォンからの投稿のため、詳細なコードは後程追記します。)
データを渡す際にグローバルな変数に入れて渡そうと思いましたが、Xamarinの共通コードとAndroidではインスタンスが異なるのか、代入しても値は反映しませんでした。~~
上記方法のコードを紛失してしまったため、別の試したことを書きます。
FCMのコードを下記のように修正。
```C#
public override void OnMessageReceived(RemoteMessage message)
{
   GetDataNotification(message.Data);
}
void GetDataNotification(IDictionary<string, string> keyValues)
{
   if (keyValues.ContainsKey("data"))
   {
       var intent = new Intent(this, typeof(MainActivity));
       intent.PutExtra("data", keyValues["data"]);
       StartActivity(intent);
   }
}
```
MainActivityのコードを下記のように修正しました。
```C#
protected override void OnCreate(Bundle savedInstanceState)
{
   // 初期化処理等
   var data = this.Intent.GetStringExtra("data");
   LoadApplication(new App(data));
}
```
Appは下記のように修正しました。
```C#
public App(string data = null)
{
   if (data != null)
   {
       MainPage = new Page1(data);
   }
   else
   {
       MainPage = new Page2();
   }
}
```
Page1の初期化コードは下記の様になっています。
```C#
public Page1(string data = null)
{
   InitializeComponent();
   this.data.Text = data;
}
```
上記のように修正した後、FCMからdataを含むデータを送信したとき、アプリが異常終了してしまいました。
またタスクキルされた状態ではOnMessageReceivedにすら入って来ませんでした。
~~またタスクキルされた状態ではOnMessageReceivedにすら入って来ませんでした。
どのように修正すれば画面を表示出来るでしょうか?
出来ればタスクキルされた状態からでも表示させたいのですが出来ますでしょうか?
出来ればタスクキルされた状態からでも表示させたいのですが出来ますでしょうか?~~
#追記
`intent.AddFlags(ActivityFlags.NewTask);`
上記行をStartActivityを行う前に追加することで表示出来ました。
OnMessageReceivedに入ってこなかったのは実際に送信されるまでにかなり時間を要していたからのようです。
1時間後くらいに通知が来ました。
この方法を使うと一応動くのですが、アプリの上にアプリが起動しているような状態になります。
これで開いたページでバックボタンを押すと前に開いていた画面が出てきてしまいます。
出来れば新規でページを開きたいのですが、どのようなフラグをつければよいのでしょうか?
SingleTopフラグでは異常終了してしまい、上手く動作しませんでした。
  • C#

    10459 questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Android

    8002 questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Xamarin

    694 questions

    Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

1 試したことの追記。

VEX

VEX score 88

2019/01/16 15:33  投稿

【Xamarin】Push通知を受け取った際に画面遷移を行いたい【Android】
#開発環境
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を用いて通知を受け取った際に画面を遷移させたい。
Firebase Cloud Messaging(以下FCM)を用いて通知を受け取った際に画面を遷移させたい。
#コード
[こちらの質問](https://teratail.com/questions/168287)を参照して頂きたいです。
#知りたいこと
上記コードの「OnMessageReceived」内に入ってきたときに、Xamarinの共通コードで書かれたページに遷移する方法が知りたいです。
その際にデータも渡したいのですがその方法も知りたいです。
Xamarin.Formsで実装したいため、Intentでの画面遷移は考えていません。
#試したこと
グローバルな変数を作成し、そこに現在のページを代入させ、その変数からPushAsyncを呼ぼうとしましたがエラーになりました。
~~グローバルな変数を作成し、そこに現在のページを代入させ、その変数からPushAsyncを呼ぼうとしましたがエラーになりました。
(現在スマートフォンからの投稿のため、詳細なコードは後程追記します。)
データを渡す際にグローバルな変数に入れて渡そうと思いましたが、Xamarinの共通コードとAndroidではインスタンスが異なるのか、代入しても値は反映しませんでした。
データを渡す際にグローバルな変数に入れて渡そうと思いましたが、Xamarinの共通コードとAndroidではインスタンスが異なるのか、代入しても値は反映しませんでした。~~
上記方法のコードを紛失してしまったため、別の試したことを書きます。
FCMのコードを下記のように修正。
```C#
public override void OnMessageReceived(RemoteMessage message)
{
   GetDataNotification(message.Data);
}
void GetDataNotification(IDictionary<string, string> keyValues)
{
   if (keyValues.ContainsKey("data"))
   {
       var intent = new Intent(this, typeof(MainActivity));
       intent.PutExtra("data", keyValues["data"]);
       StartActivity(intent);
   }
}
```
MainActivityのコードを下記のように修正しました。
```C#
protected override void OnCreate(Bundle savedInstanceState)
{
   // 初期化処理等
   var data = this.Intent.GetStringExtra("data");
   LoadApplication(new App(data));
}
```
Appは下記のように修正しました。
```C#
public App(string data = null)
{
   if (data != null)
   {
       MainPage = new Page1(data);
   }
   else
   {
       MainPage = new Page2();
   }
}
```
Page1の初期化コードは下記の様になっています。
```C#
public Page1(string data = null)
{
   InitializeComponent();
   this.data.Text = data;
}
```
上記のように修正した後、FCMからdataを含むデータを送信したとき、アプリが異常終了してしまいました。
またタスクキルされた状態ではOnMessageReceivedにすら入って来ませんでした。
どのように修正すれば画面を表示出来るでしょうか?
出来ればタスクキルされた状態からでも表示させたいのですが出来ますでしょうか?
  • C#

    10459 questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Android

    8002 questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Xamarin

    694 questions

    Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る