新しいテントは()のAndroidの新しいインスタンスを開始します。launchMode =「singleTop」

StackOverflow https://stackoverflow.com/questions/2424488

質問

私はマニフェストにAとアクティビティandroid:launchMode="singleTop"を有している。

私はそこ活動BC、およびDに行けば

私は自分のアプリケーションのルートアクティビティ(A)に戻るには、メニューのショートカットを持っています。

のコードは次のようになります:

Intent myIntent = new Intent(getBaseContext(), MainActivity.class);
startActivity(myIntent);

しかし、代わりに私のAの既存のインスタンスMainActivity.classに返すのでは、新しいインスタンスを作成します - >それはonCreate()の代わりにonNewIntent()に行く

これは期待される動作ではありません、右?

役に立ちましたか?

解決

これはトリックを行う必要があります。

<activity ... android:launchMode="singleTop" />

あなたはアプリの使用を開始する意図を作成する場合:

Intent intent= new Intent(context, YourActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);

これは、それが必要とされるべきである。

他のヒント

実際に何が最終的に私のために働いたことは、このました

Intent myIntent = new Intent(getBaseContext(), MainActivity.class);
myIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(myIntent);
ドキュメントでから

引用:

  

「標準」と「singleTop」モード   ちょうど1が互いに異なります   尊敬:新しい意図がありますたびに   「標準」の活動のために、新しいです   クラスのインスタンスが作成されるまで   その意図に応えます。各インスタンス   単一の意図を扱います。同様に、   「singleTop」アクティビティの新しいインスタンス   また、新しいを処理するために作成することができます   意図。対象タスクの場合ただし、<強いです>   既にの既存のインスタンスを持っています   そのの上部に活動   スタックを、そのインスタンスを受け取ります   onNewIntentの新しい意思(()   コール);新しいインスタンスが作成されていません。

私は「すでにそのスタックの最上部に活動の既存のインスタンスを持っている」を意味し、おそらくあなたの活動はこの条件を満たしていないものを100%わからない。

singleTaskまたはあなたのためにsingleInstanceの仕事だろうか?それとも、私はそれはないと思うが、あなたは、それが違いを作るかどうかを確認するために作成している意図にFLAG_ACTIVITY_SINGLE_TOPを設定してみてください可能性があります。

あなたはと活動の同じ既存のインスタンスに戻ることができます android:launchMode="singleInstance"

マニフェストインチ あなたはAからBに戻ったとき、finish()を破壊するBを必要とすることができる。

まず、積層構造を調べることができます。起動モードの場合:singleTop
同じアクティビティのインスタンスはタスク・スタックの一番上にすでにある場合、このインスタンスは、意図に対応するために再利用されます。

すべての活動は、スタック内の保留されている(「アウトラストで最初」)ので、あなたの現在の活動は、スタックの最上部に、あなたがsingleTop

としてmanifest.fileでそれを定義した場合であれば
android:name=".ActivityA"
android:launchMode="singleTop"

あなたがActivityAである場合、それはのonCreateがonNewIntentを()が再開されます入力しないであろう活動を再作成し、あなたは、通知を作成することによって見ることができます あなたはonNewIntent(意図)を実装していない場合は、新しい意図を得ることはありません。

:ありません。
Intent activityMain = new Intent(ActivityA.this,
                        ActivityA.class);

                activityMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                        | Intent.FLAG_ACTIVITY_SINGLE_TOP);
                startActivity(activityMain);




    @Override
        protected void onNewIntent(Intent intent) {

            super.onNewIntent(intent);

            notify("onNewIntent");
        }

        private void notify(String methodName) {

            String name = this.getClass().getName();
            String[] strings = name.split("\\.");

            Notification noti = new Notification.Builder(this)
                    .setContentTitle(methodName + "" + strings[strings.length - 1])
                    .setAutoCancel(true).setSmallIcon(R.drawable.ic_launcher)
                    .setContentText(name).build();
            NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            notificationManager.notify((int) System.currentTimeMillis(), noti);

        }
元のアクティビティが既にあなたはこのためB、CまたはDから起動時間によって破壊されているので、

これは、のonCreate)は(onNewIntentの代わりに呼び出されます。これを解決する一つの方法は、常に既存の(使用してFLAG_ACTIVITY_CLEAR_TASK | FLAG_ACTIVITY_NEW_TASKの併用時にstartActivity)を破壊することであるのonCreateが常に呼び出されます、そしてあなたがonNewIntent(のコードを入れて、新しいAを開始する前)のonCreateにgetIntentかどうかをチェックすることにより、( )あなたが開始の意図がある。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top