从服务调用时,活动重新启动

时间:2018-09-23 12:04:02

标签: android android-activity android-webview android-service

我的应用程序中有一个浮动按钮服务(例如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);

我的主要问题是在活动内部,我有一个Web视图,并且每次单击按钮并调用该活动时都会重新加载,而不仅仅是保持相同的方式。

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

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

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

任何帮助都会得到补偿

3 个答案:

答案 0 :(得分:1)

我只能想象您的FLAG_FROM_BACKGROUND是什么意思。而且我想知道它是否调用了它,从而导致您之前发生了一些崩溃,例如“没有applicationContext bla bla bla FLAG_NEW_TASK就可以启动活动”。随便。

因此,如果您有Intent.FLAG_ACTIVITY_NEW_TASK,将始终在 NEW_TASK 中实例化DrawerActivity2。您将永远是“新人”活动。 将launchMode更改为singleTop不会得到预期的结果。 Read about launchModes and Flags here

请注意,您不允许在与TASK(或ApplicationContext扩展的BaseContext/ContextWrapper)相同的Service中启动Activity。为此,您必须使用活动上下文开始新 Activity

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

  

当前实现首先在   类别Intent.CATEGORY_INFO,接下来是主要活动   类别Intent.CATEGORY_LAUNCHER。如果找不到,则返回null。

Android developers source

你问

  

我的活动从后台返回,它从再次调用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来启动startActivity。但这是另一个不同的故事。而且不能推荐实现它的“好的”方法。

答案 1 :(得分:0)

您需要:

<activity
        android:name=".DrawerActivity2"
        android:launchMode = "singleInstance" />

答案 2 :(得分:0)

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

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