Cét*_*tia 17 stack transparency android android-intent android-activity
我有半透明主题的活动:
android:theme="@android:style/Theme.Translucent.NoTitleBar"
Run Code Online (Sandbox Code Playgroud)
此问题也可以通过以下主题重现:
<style name="MyTheme" parent="@android:style/Theme">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:colorBackground">@null</item>
</style>
Run Code Online (Sandbox Code Playgroud)
此活动在启动时加载并保存在内存中(当我开始此活动时,我将该FLAG_ACTIVITY_REORDER_TO_FRONT标志作为额外标记).
问题:当我开始此活动时(从菜单中),活动没有显示,没有任何反应.但是:如果我删除半透明主题:一切正常,活动就会回到正面.
是的onNewIntent()被调用.
如果我按回半透明活动是下面的那个!但它需要成为顶级.
一个例子是
A(半透明活动)BC
堆栈:A
一个startActivity(B)
堆栈:A,B
B startActivity(C)
堆栈:A,B,C
c startActivity(A)//带有标志FLAG_ACTIVITY_REORDER_TO_FRONT
堆栈应为:B,C,A
但是A永远不会被带到前面,尽管它的onNewIntent()被调用.
有任何想法吗?
旁注
有趣的未回答的问题:http://groups.google.com/group/android-developers/browse_thread/thread/269c67f6b39cfe45?pli = 1
android:launchMode的singleTask或singleInstance不希望被使用.这些更改了backstack并将活动移动到自己的堆栈中.因此我们不再有A,B,C了.
singleTask和singleInstance - 不适合大多数应用程序,因为它们会导致用户可能不熟悉的交互模型,并且与大多数其他应用程序非常不同.
http://developer.android.com/guide/topics/manifest/activity-element.html#lmode
想要直观表示launchModes的任何人都可以尝试以下应用:https://play.google.com/store/apps/details? id = com.novoda.demos.activitylaunchmode
应该launchMode位于清单文件中您的活动的标签singleTask中。<activity>
来自文档:
singleTask - 如果在启动活动时,已经有一个与该活动一起启动的任务正在运行,则当前任务将被置于前面,而不是启动新实例。现有实例将收到对
Activity.onNewIntent()正在启动的新 Intent 的调用,并Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT设置标志。这是 singleTop 模式的超集,如果已经有一个活动实例在堆栈顶部启动,它将接收那里描述的 Intent(不FLAG_ACTIVITY_BROUGHT_TO_FRONT设置标志)。
作为更好的解决方法,您可以尝试使整个窗口 inonNewIntent()或 in onResume..
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
getWindow().getDecorView().invalidate();
}
Run Code Online (Sandbox Code Playgroud)