我的应用程序中有一个浮动按钮服务(例如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);
它打开了(原始应用程序的)第一个活动,而不是打开的活动。
任何帮助都会得到补偿
答案 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。
你问
我的活动从后台返回,它从再次调用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)