1

我的应用程序中有一个浮动按钮的服务(如 facebook messenger),当单击时,我的活动从后台返回,但它不会以与缩小时相同的方式返回,它会重新调用一次 onCreate更多,知道是什么导致了这种行为吗?

在我的清单中,活动与财产有关:

            android:launchMode="singleTask"

它由我的服务调用,如下所示:

    Intent i = new Intent(FloatingViewService.this, DrawerActivity2.class);
    i.putExtra("fromController",true);
    i.setFlags(FLAG_FROM_BACKGROUND);
    FloatingViewService.this.startActivity(i);

我的主要问题是在活动内部,我有一个 webview,每次单击按钮并调用活动时它都会重新加载,而不是保持不变。

更新后这是我在清单中的活动

        <activity
        android:name=".DrawerActivity2"
        android:configChanges="orientation"
        android:launchMode="singleTop"
        android:screenOrientation="portrait"
        android:theme="@style/OtherTheme"/>

更新 2

值得一提的是,它是一个位于应用程序中的库。

我尝试使用此代码打开活动:

Intent intent = getPackageManager().getLaunchIntentForPackage(getPackageName()); startActivity(intent);

它打开了第一个(原始应用程序的)活动,而不是打开的活动。

任何帮助将不胜感激

4

3 回答 3

1

你需要:

<activity
        android:name=".DrawerActivity2"
        android:launchMode = "singleInstance" />
于 2018-09-26T13:32:58.757 回答
1

我只能想象你的FLAG_FROM_BACKGROUND意思。而且我想知道它是否如此调用是因为您之前遇到过一些崩溃,例如“可以在没有来自 applicationContext bla bla 的 FLAG_NEW_TASK 的情况下启动活动”。任何。

因此,如果您在那里,Intent.FLAG_ACTIVITY_NEW_TASK您将始终在NEW_TASKDrawerActivity2中实例化您。它将永远是,你知道“新的”活动。并且更改为不会给出预期的结果。在此处阅读有关启动模式和标志的信息launchModesingleTop

请注意,您不允许TASK使用ApplicationContext(或扩展)在同一范围内启动 Activity。为此,您必须使用Activity 的上下文开始新的BaseContext/ContextWrapperService Activity

关于Intent intent = getPackageManager().getLaunchIntentForPackage(getPackageName()); startActivity(intent); 它可能按预期工作

当前实现首先在 Intent.CATEGORY_INFO 类别中查找主要活动,然后在 Intent.CATEGORY_LAUNCHER 类别中查找主要活动。如果都没有找到,则返回 null。

Android 开发者源码

你问

我的活动从后台返回,它重新开始调用 onCreate ,知道是什么导致了这种行为吗?

我的假设是FLAG_FROM_BACKGROUND

Intent i = new Intent(FloatingViewService.this, DrawerActivity2.class);
    i.putExtra("fromController",true);
    i.setFlags(FLAG_FROM_BACKGROUND); /*is it really Intent.FLAG_ACTIVITY_NEW_TASK ???*/
    FloatingViewService.this.startActivity(i);

如何解决?可能是用ActivityContext而不是ApplicationContext来启动Activity。但这是不同的故事。并且不能推荐如何实现它的“好”方式。

于 2018-09-26T20:55:08.837 回答
0

我认为如果您使用 launchMode singleTop 和 i.setFlags(FLAG_ACTIVITY_NEW_TASK) 它应该可以工作,但前提是活动位于堆栈顶部。

如果您无法确保活动位于堆栈顶部,则值得尝试将 launchMode 设置为 singleTask 和 i.setFlags(FLAG_ACTIVITY_NEW_TASK)

于 2018-09-28T07:19:16.273 回答