web-dev-qa-db-ja.com

新しいIntent()はAndroidで新しいインスタンスを起動します:launchMode = "singleTop"

マニフェストにアクティビティAAndroid:launchMode="singleTop"があります。

アクティビティBC、およびDにアクセスすると、アプリケーションのルートアクティビティ(A)に戻るためのメニューショートカットがあります。

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

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

ただし、既存のインスタンスAMainActivity.classに戻る代わりに、新しいインスタンスを作成します-> onCreate()ではなくonNewIntent()に移動します。

これは予想される動作ではありませんか?

57
znq

これでうまくいくはずです。

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

アプリの使用を開始するインテントを作成する場合:

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

これは必要なことです。

68
Vidar Vestnes

最終的に私のために実際に働いたのはこれでした:

Intent myIntent = new Intent(getBaseContext(), MainActivity.class);
myIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(myIntent);
29
znq

ドキュメント からの引用:

「標準」モードと「シングルトップ」モードは、1つの点で互いに異なります。「標準」アクティビティの新しいインテントがあるたびに、そのインテントに応答するクラスの新しいインスタンスが作成されます。各インスタンスは単一のインテントを処理します。同様に、「singleTop」アクティビティの新しいインスタンスを作成して、新しいインテントを処理することもできます。ただし、ターゲットタスクのスタックの一番上に既にアクティビティの既存のインスタンスがある場合、そのインスタンスは新しいインテントを受け取ります(onNewIntentで) ()呼び出し);新しいインスタンスは作成されません。

「既にスタックの一番上にアクティビティの既存のインスタンスがある」ことの意味は100%わかりませんが、おそらくあなたのアクティビティはこの条件を満たしていません。

singleTaskまたはsingleInstanceは機能しますか?または、おそらくFLAG_ACTIVITY_SINGLE_TOP私はそれが違いを生むとは思わないが、それが違いを生むかどうかを見るためにあなたが作成しようとしている意図について。

14
Mark B

_Android:launchMode="singleInstance"_でActivityの同じ既存のインスタンスに戻ることができます

マニフェストで。 AからBに戻ると、Bを破壊するためにfinish()が必要になる場合があります。

6
rbin

まず、スタック構造を調べることができます。起動モードの場合:singleTop
同じアクティビティのインスタンスが既にタスクスタックの先頭にある場合、このインスタンスは再利用されてインテントに応答します。

すべてのアクティビティはスタックに保持されるため(「先入れ先出し」)、現在のアクティビティがスタックの最上位にあり、manifest.fileでsingleTopとして定義している場合

Android:name=".ActivityA"
Android:launchMode="singleTop"

activityAにいる場合、onCreateに入らないアクティビティを再作成すると、onNewIntent()が再開され、通知を作成して確認できます。Not:İfonNewIntent(Intent)を実装しない場合、新しいインテントは取得されません。

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);

        }
1
huseyin

これは、元のAアクティビティが、B、C、またはDから開始する時点ですでに破棄されているためです。したがって、onNewIntent()の代わりにonCreateが呼び出されます。これを解決する1つの方法は、新しいAを開始する前に、常に既存のAを破棄することです(startActivityのときにFLAG_ACTIVITY_CLEAR_TASK | FLAG_ACTIVITY_NEW_TASKを使用)。したがって、onCreateが常に呼び出され、getIntent( )はあなたが始めた意図です。

0
Rachel