我有活性A与清单android:launchMode="singleTop"

如果我去到活动BCD那里我有菜单快捷方式回到我的应用程序根系活力(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”模式   彼此只是一个不同   尊重:每当有新意图   对于“标准”的活动,新的   类的实例被创建   应对这一意图。每一个实例   处理一个意图。同样,   一个“singleTop”活动的新实例   也可以创建以处理新   意图。然而,如果目标任务   已经拥有的现有实例   在顶部的活动   堆下,该实例将接收   新的意图(在onNewIntent()   呼叫);不创建新实例。

我不是100%肯定什么“已经活动的现有实例在其堆栈的顶部”的意思,但也许你的活动不符合这一条件。

singleTask或您singleInstance工作?或许你可以尝试在您创建,看看是否是有差别的意图设置FLAG_ACTIVITY_SINGLE_TOP,但我不认为你会的。

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

在清单中。 当返回从AB,可能需要finish()破坏B

首先,堆叠结构可以被检查。对于起跑模式:singleTop结果 如果同一活动的实例已经在任务堆栈的顶部,那么这种情况下将被重用向意图做出回应。

所有的活动都保持在堆栈(“先进后出的第一”),所以如果您当前的活动是在堆栈的顶部,如果你在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);

        }

这是因为原来的A活性已经由从B,C或D.启动它因此时间销毁,的onCreate将在onNewIntent代替)称为(。解决的方法之一是始终破坏现有的A |开始一个新的A,这样的onCreate总会被调用之前(使用FLAG_ACTIVITY_CLEAR_TASK FLAG_ACTIVITY_NEW_TASK一起时startActivity),并且您可以通过检查把onNewIntent()进入的onCreate的代码,如果getIntent( )是你开始的意图。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top