New Intent()使用Android启动新实例:launchMode=";单顶;

New Intent()使用Android启动新实例:launchMode=";单顶;,android,android-activity,android-intent,Android,Android Activity,Android Intent,我在清单中有带有android:launchMode=“singleTop”的活动A 如果我转到活动B、C和D,我就有菜单快捷方式可以返回到我的应用程序根活动(A) 代码如下所示: Intent myIntent = new Intent(getBaseContext(), MainActivity.class); startActivity(myIntent); 但是,它不是返回到myMainActivity.class的已存在实例A,而是创建一个新实例->它转到onCreate()而不是o

我在清单中有带有android:launchMode=“singleTop”的活动
A

如果我转到活动
B
C
D
,我就有菜单快捷方式可以返回到我的应用程序根活动(
A

代码如下所示:

Intent myIntent = new Intent(getBaseContext(), MainActivity.class);
startActivity(myIntent);
但是,它不是返回到my
MainActivity.class的已存在实例
A
,而是创建一个新实例->它转到
onCreate()
而不是
onNewIntent()

这不是预期的行为,对吗?

引自:

“标准”和“单顶”模式 在一个方面彼此不同 尊重:每次有新的意图 对于“标准”活动,新的 类的实例被创建为 对这一意图作出反应。每个实例 处理单一意图。同样,一个 “单顶”活动的新实例 也可以创建以处理新的 意图但是,如果目标任务 已具有的现有实例 处于其顶部的活动 堆栈,该实例将接收 新的意图(在onNewIntent()中) 电话);未创建新实例

我不能100%确定“在堆栈顶部已经有一个活动的现有实例”是什么意思,但可能您的活动不符合此条件


singleTask
singleInstance
是否适合您?或者你可以试着根据你正在创建的意图设置
FLAG\u ACTIVITY\u SINGLE\u TOP
,看看这是否会产生影响,尽管我不认为会有影响。

这应该可以解决问题

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

这正是我所需要的。

最终对我起作用的是:

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

您可以使用返回到相同的现有活动实例
android:launchMode=“singleInstance”

在舱单上。
当您从
B
返回
A
时,可能需要
finish()
来销毁
B

,首先,可以检查堆栈结构。对于启动模式:单顶
如果同一活动的实例已位于任务堆栈顶部,则将重用此实例以响应意图

所有活动都保存在堆栈中(“先进先出”),因此如果当前活动位于堆栈顶部,并且在manifest.file中将其定义为singleTop

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启动原始A活动时,它已被销毁。因此,将调用onCreate而不是onNewIntent()。解决这一问题的一种方法是,在启动新的A之前,始终销毁现有的A(使用FLAG_ACTIVITY_CLEAR_TASK | FLAG_ACTIVITY_NEW_TASK连接,当startActivity时),因此始终会调用onCreate,并通过检查getIntent()是否是您开始时的意图。

这意味着当前处于活动状态的任务堆栈(应用程序堆栈)的顶部有一个该活动的实例(例如,一个活动在有焦点时正在启动同一活动的另一个副本)。同一活动的其他实例可能存在于其他任务(应用程序)中。因此,如果我的意愿是在同一进程中启动新的活动实例,但我已经将重点放在该活动的前一个实例上,我将如何做到这一点?我想@rayman使用标准模式?它在文档中说,“每当有一个“标准”活动的新意图时,就会创建一个新的类实例来响应该意图。”您可能会遇到一些与singleTop活动有关的问题。太棒了!谢谢,先生这对我不起作用。:(代码行下面的代码可以正常工作。Intent myIntent=newintent(getBaseContext(),MainActivity.class);myIntent.setFlags(Intent.FLAG\u ACTIVITY\u CLEAR\u TOP);startActivity(myIntent);
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);

        }