質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

0回答

4846閲覧

IntentのFlagにFLAG_ACTIVITY_NEW_TASK|FLAG_ACTIVITY_CLEAR_TOP をセットしたがonNewIntent()が呼ばれない

RIRI99

総合スコア9

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2020/05/11 14:50

編集2020/05/11 14:57

前提・実現したいこと

下記のサイトの通りのIntentフラグをセットして、既存アクティビティへ遷移するかどうか確認したい。

https://developer.android.com/guide/components/activities/tasks-and-back-stack

FLAG_ACTIVITY_NEW_TASK
新しいタスクでアクティビティを開始します。開始しようとしているアクティビティに対してタスクがすでに実行されている場合は、

そのタスクが最新の状態が復元された状態でフォアグラウンドに移動し、アクティビティが onNewIntent() で新しいインテントを受け取ります。

これにより、前のセクションで説明した "singleTask"launchMode の値と同じ動作が発生します。

FLAG_ACTIVITY_CLEAR_TOP
開始されるアクティビティが、すでに現在のタスクで実行されている場合は、そのアクティビティの新しいインスタンスを起動する代わりに、上に置かれた他のアクティビティをすべて破棄し、一番上に移動したアクティビティの再開されたインスタンスに、onNewIntent() を介してこのインテントを渡します。

この動作を起こす launchMode 属性には値がありません。

ほとんどのケースで FLAG_ACTIVITY_CLEAR_TOP は FLAG_ACTIVITY_NEW_TASK と併用されます。同時に使用することで、これらのフラグは、別のタスクにある既存のアクティビティを捜し出し、インテントに対応できる位置に置く手段として活用できます

自分で試した限り、
IntentのFlagにFLAG_ACTIVITY_NEW_TASK|FLAG_ACTIVITY_CLEAR_TOP をセットして既存アクティビティへ遷移しても
onNewIntent()が呼ばれませんでした。

↑のサイトでは、
"singleTask"launchMode の値と同じ動作が発生します。」
と書いてあったので、フラグだけ設定すればよいのかと思ったのですが、
ManifestでlaunchMode指定が必須なのでしょうか

試したこと

確認のために、
MainActivity --> **SubActivity **-(ボタンタップ)-> SubSubActivity -(ボタンタップ)-> SubActivity
と遷移させて、SubSubActivityからSubActivityへ遷移するときに
onNewIntentが呼ばれるか試しました。
(ManifestでのアクティビティのlaunchModeは指定していません)

試した結果、
SubActivityへ遷移されたときに、onNewIntentが呼ばれず、
SubActivityはonDestroyが呼ばれた後、onCreateが呼ばれました。

該当のソースコード

AndroidManifest.java

xml

1<?xml version="1.0" encoding="utf-8"?> 2<manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="com.example.TaskTest"> 4 5 <application 6 android:allowBackup="true" 7 android:icon="@mipmap/ic_launcher" 8 android:label="@string/app_name" 9 android:roundIcon="@mipmap/ic_launcher_round" 10 android:supportsRtl="true" 11 android:theme="@style/AppTheme"> 12 <activity android:name=".MainActivity"> 13 <intent-filter> 14 <action android:name="android.intent.action.MAIN" /> 15 16 <category android:name="android.intent.category.LAUNCHER" /> 17 </intent-filter> 18 </activity> 19 <activity android:name=".SubActivity" /> 20 <activity android:name=".SubSubActivity" /> 21 </application> 22</manifest>

MainActivity

java

1public class MainActivity extends AppCompatActivity { 2 3 @Override 4 protected void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 setContentView(R.layout.activity_main); 7 //SubActivity起動 8 Intent intent = new Intent(getApplicationContext(), SubActivity.class); 9 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK); 10 startActivity(intent); 11 } 12}

SubActivity.java

java

1public class SubActivity extends AppCompatActivity { 2 3 @Override 4 protected void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 setContentView(R.layout.activity_sub); 7 Log.d("[TaskTest]", this.getLocalClassName()+".onCreate()"); 8 9 //ボタンタップでSusSubActivityへ遷移 10 Button button = findViewById(R.id.button); 11 button.setOnClickListener(new View.OnClickListener() { 12 @Override 13 public void onClick(View v) { 14 Log.d("[TaskTest]", "SubSubActivity起動"); 15 Intent intent = new Intent(getApplicationContext(), SubSubActivity.class); 16 //SuSubActivityを起動 17 startActivity(intent); 18 } 19 }); 20 } 21 22 @Override 23 protected void onStart() { 24 super.onStart(); 25 Log.d("[TaskTest]", this.getLocalClassName()+".onStart()"); 26 } 27 @Override 28 protected void onResume() { 29 super.onResume(); 30 Log.d("[TaskTest]", this.getLocalClassName()+".onResume()"); 31 } 32 @Override 33 protected void onStop() { 34 super.onStop(); 35 Log.d("[TaskTest]", this.getLocalClassName()+".onStop()"); 36 } 37 @Override 38 protected void onDestroy() { 39 super.onDestroy(); 40 Log.d("[TaskTest]", this.getLocalClassName()+".onDestroy()"); 41 } 42 @Override 43 protected void onNewIntent(Intent intent) { 44 super.onNewIntent(intent); 45 Log.d("[TaskTest]", this.getLocalClassName()+".onNewIntent()"); 46 } 47}

SubSubActivity

Java

1public class SubSubActivity extends AppCompatActivity { 2 3 @Override 4 protected void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 setContentView(R.layout.activity_sub_sub); 7 Log.d("[TaskTest]", this.getLocalClassName()+".onCreate()"); 8 //ボタンタップでSubActivityへ遷移 9 Button button2 = findViewById(R.id.button2); 10 button2.setOnClickListener(new View.OnClickListener() { 11 @Override 12 public void onClick(View v) { 13 Intent intent = new Intent(getApplicationContext(), SubActivity.class); 14 Log.d("[TaskTest]", "SubActivityへ戻る"); 15 //SubActivityを起動。 16 //FLAG_ACTIVITY_CLEAR_TOP は FLAG_ACTIVITY_NEW_TASKをセットしているので、 17 // 既存アクティビティが呼ばれる? (SubActivityでonNewIntentが呼ばれる?) 18 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP 19 | Intent.FLAG_ACTIVITY_NEW_TASK); 20 startActivity(intent); 21 } 22 }); 23 } 24 @Override 25 protected void onStart() { 26 super.onStart(); 27 Log.d("[TaskTest]", this.getLocalClassName()+".onStart()"); 28 } 29 @Override 30 protected void onResume() { 31 super.onResume(); 32 Log.d("[TaskTest]", this.getLocalClassName()+".onResume()"); 33 } 34 @Override 35 protected void onStop() { 36 super.onStop(); 37 Log.d("[TaskTest]", this.getLocalClassName()+".onStop()"); 38 } 39 @Override 40 protected void onDestroy() { 41 super.onDestroy(); 42 Log.d("[TaskTest]", this.getLocalClassName()+".onDestroy()"); 43 } 44 @Override 45 protected void onNewIntent(Intent intent) { 46 super.onNewIntent(intent); 47 Log.d("[TaskTest]", this.getLocalClassName()+".onNewIntent()"); 48 } 49}

ログ

log

1D/[TaskTest]: SubActivity.onCreate() 2D/[TaskTest]: SubActivity.onStart() 3D/[TaskTest]: SubActivity.onResume() 4 5D/[TaskTest]: SubSubActivity起動 6D/[TaskTest]: SubSubActivity.onCreate() 7D/[TaskTest]: SubSubActivity.onStart() 8D/[TaskTest]: SubSubActivity.onResume() 9D/[TaskTest]: SubActivity.onStop() 10 11D/[TaskTest]: SubActivityへ戻る 12D/[TaskTest]: SubActivity.onDestroy() 13D/[TaskTest]: SubActivity.onCreate() 14D/[TaskTest]: SubActivity.onStart() 15D/[TaskTest]: SubActivity.onResume() 16D/[TaskTest]: SubSubActivity.onStop() 17D/[TaskTest]: SubSubActivity.onDestroy()

補足情報(FW/ツールのバージョンなど)

[確認環境]
・ Android Studio 3.6.3
・ Google Pixel 3a (API 29) エミュレータ

[備考]
AndroidManifest.xmlでSubActiivtyに
android:launchMode="singleTask"
を指定したらonNewIntentが呼ばれました。

D/[TaskTest]: SubActivity.onCreate() D/[TaskTest]: SubActivity.onStart() D/[TaskTest]: SubActivity.onResume() D/[TaskTest]: SubSubActivity起動 D/[TaskTest]: SubSubActivity.onCreate() D/[TaskTest]: SubSubActivity.onStart() D/[TaskTest]: SubSubActivity.onResume() D/[TaskTest]: SubActivity.onStop() D/[TaskTest]: SubActivityへ戻る D/[TaskTest]: SubActivity.onStart() D/[TaskTest]: SubActivity.onNewIntent() D/[TaskTest]: SubActivity.onResume() D/[TaskTest]: SubSubActivity.onStop() D/[TaskTest]: SubSubActivity.onDestroy()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

RIRI99

2020/05/12 10:23

回答ありがとうございます。 ・ IntentフラグでFLAG_ACTIVITY_NEW_TASKの代わりにFLAG_ACTIVITY_SINGLE_TOPを指定する。 もしくは、 ・ ManifestでSubActivityのlaunchModeを"singleTop"に指定 したときに、onNewIntentが呼ばれることを確認しました。 結局のところ、 IntentにFLAG_ACTIVITY_NEW_TASK|FLAG_ACTIVITY_CLEAR_TOPを指定しても、既存アクティビティは使われることはない(onNewIntentは呼ばれない) ということなのでしょうか? ↑に書いた、FLAG_ACTIVITY_NEW_TASKの説明と実際の動きが異なっているように見えるので、、、
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問