New Intent()用Android启动新实例:launchMode =“singleTop”

时间:2010-03-11 11:28:23

标签: android android-activity android-intent

我在清单中有A的活动android:launchMode="singleTop"

如果我转到活动BCD,我会有菜单快捷方式返回我的应用程序根活动(A)。

代码如下所示:

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

但是,不是返回我A的现有实例MainActivity.class,而是创建新实例 - >它转到onCreate()而不是onNewIntent()

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

6 个答案:

答案 0 :(得分:68)

这应该可以解决问题。

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

当您创建启动应用程序的意图时使用:

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

这应该是需要的。

答案 1 :(得分:29)

最终对我有用的是:

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

答案 2 :(得分:14)

来自documentation

的引用
  

“标准”和“单击”模式   只有一个彼此不同   尊重:每次有新的意图   对于“标准”活动,新的   创建类的实例   回应这个意图。每个实例   处理单一意图。同样,a   “singleTop”活动的新实例   也可以创建来处理新的   意图。但是,如果是目标任务   已经有一个现有的实例   它顶部的活动   堆栈,该实例将收到   新意图(在onNewIntent()中   呼叫);没有创建新实例。

我不是百分之百确定“已经在其堆栈顶部存在活动的现有实例”意味着,但也许您的活动不符合这一条件。

singleTasksingleInstance会为您效劳吗?或者也许您可以尝试在创建的意图上设置FLAG_ACTIVITY_SINGLE_TOP,看看是否会产生影响,尽管我认为不会。但

答案 3 :(得分:6)

您可以返回相同的现有Activity实例 android:launchMode="singleInstance"

清单中的

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

答案 4 :(得分:1)

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

所有活动都保存在堆栈中(“倒数第一个”),所以如果您当前的活动位于堆栈顶部,并且您在manifest.file中将其定义为singleTop

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

如果您在ActivityA中重新创建它将不会进入的活动onCreate将继续onNewIntent(),您可以通过创建通知来查看 不是:如果你没有实现onNewIntent(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);

        }

答案 5 :(得分:0)

这是因为原始A活动在从B,C或D开始时已被破坏。因此,将调用onCreate而不是onNewIntent()。解决此问题的一种方法是在开始新A之前始终销毁现有的A(在startActivity时使用FLAG_ACTIVITY_CLEAR_TASK | FLAG_ACTIVITY_NEW_TASK连接),因此将始终调用onCreate,并通过检查getIntent(将onInwIntent()的代码放入onCreate中( )是你开始的意图。