Activity没有调用finish方法?(API 23)

34

我遇到了以下错误,但是我不知道为什么会发生。

错误信息:

08-23 17:07:46.533  22454-22454/com.a.b.c E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.a.b.c, PID: 22454
    java.lang.RuntimeException: Unable to resume activity {com.a.b.c/com.a.b.c.MainActivity}: java.lang.IllegalStateException: Activity {com.a.b.c/com.a.b.c.MainActivity} did not call finish() prior to onResume() completing
            at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3103)
            at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3134)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2481)
            at android.app.ActivityThread.-wrap11(ActivityThread.java)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:148)
            at android.app.ActivityThread.main(ActivityThread.java:5417)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
     Caused by: java.lang.IllegalStateException: Activity {com.a.b.c/com.a.b.c.MainActivity} did not call finish() prior to onResume() completing
            at android.app.Activity.performResume(Activity.java:6324)
            at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3092)
            at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3134)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2481)
            at android.app.ActivityThread.-wrap11(ActivityThread.java)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:148)
            at android.app.ActivityThread.main(ActivityThread.java:5417)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

代码:

protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
    System.out.println("Started");
}

我正在尝试在运行 Android 6.0 (API 23) 的 AVD 上运行代码,但在 API 22 上可以正常工作。


1
请展示你的onResume和onFinish方法。 - iGio90
我没有重写onResume/onFinish方法。我只使用了如上所示的onCreate方法。 - olfek
2
从Android清单中删除(android:theme="@android:style/Theme.NoDisplay")已经解决了问题,然而我需要在我的应用程序中使用它,因此我需要一个解决方法。 - olfek
链接已修复。请查看已接受的答案。 - Malwinder Singh
有没有好的替代方案可以替换android:theme="@and‌​roid:style/Theme.NoDi‌​splay"? - iYonatan
@iYonatan 这个链接或许能帮到你:https://commonsware.com/blog/2015/11/02/psa-android-6p0-theme.nodisplay-regression.html - olfek
8个回答

26

我遇到了相同的问题,与

在 onResume() 完成之前没有调用 finish()

的崩溃错误信息。因此我创建了 v23\styles.xml 文件。

<style name="AppTheme" parent="android:Theme.Translucent">
...
</style>

尽管通常的styles.xml有

<style name="AppTheme" parent="android:Theme.NoDisplay">
...
</style>

它现在运行良好,不再崩溃。但是,我不知道在API 23中使用Theme.Translucent解决方法有多好,特别是因为它被定义为“半透明活动的主题(在API级别10及以下)”。

我真的希望他们修复这个错误。


14
我建议使用Theme.Translucent.NoTitleBar主题,否则您会在屏幕上看到旧式的标题栏。此外,这种技术对我很有效--非常感谢! - CommonsWare
3
似乎这不是一个 bug。http://developer.android.com/reference/android/R.attr.html#windowNoDisplay 的文档说明 "activity 必须立即退出而不等待用户交互"。因此,正如异常消息建议的那样,在 onResume() 完成之前需要完成 Activity。 - koral

23

我找到了一个解决办法。在onStart()函数中调用setVisible(true)

@Override
protected void onStart() {
    super.onStart();
    setVisible(true);
}

1
这个不起作用,至少在Android 6.0正式版中是如此。我仍然会得到与问题中引用的相同异常。 - CommonsWare
@CommonsWare,听起来他们在最终版本中修复了它。在正式发布6之前,这个修复已经在官方模拟器中运行了。谢谢你让我知道。 - Sam
3
抱歉,我认为我试过使用setVisible(false)。使用setVisible(true)可以避免崩溃,但是你最终会显示一个无用的活动UI(黑色背景,旧式灰色标题栏)。Theme.Translucent.NoTitleBar更接近于Theme.NoDisplay的视觉效果(即不可见)。 - CommonsWare

15

这是 Android M 开发者预览版中的一个漏洞。 更多细节


2
  1. 损坏的链接
  2. 这似乎是从API 23开始的预期行为更改,而不是错误,以下答案可以帮助解决问题,并且此帖子可用于总结:https://commonsware.com/blog/2015/11/02/psa-android-6p0-theme.nodisplay-regression.html
- marmor
链接已修复。这是谷歌开发人员认可的错误。 - Malwinder Singh
1
这个错误在Android 9.0中仍然存在,所以我认为可以说它会一直存在下去。 - Sam

6

我的不可见Activity显示一个确认对话框。当我使用android:Theme.Translucent.NoTitleBar时,这导致了失去了Material Design的外观

因此,基于上面的答案、CommonWare的博客和Android主题定义,我使用了这个样式,它扩展了一个普通的AppCompat.Light主题:

<style name="AppTheme.NoDisplay" parent="Theme.AppCompat.Light">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowAnimationStyle">@android:style/Animation</item>
    <item name="android:windowDisablePreview">true</item>
    <item name="android:windowNoTitle">true</item>
</style>

由于某些原因,我的编辑被拒绝了,答案缺失。<item name="android:statusBarColor">@android:color/transparent</item> 这行代码可以在 Activity 关闭时隐藏状态栏。 - Ako
@Ako 我添加了这行代码,但需要一个单独的 styles.xml 文件来支持 API 21+。 - M D P
这个答案已经需要在项目中包含一个特定于应用的styles.xml文件。 - Ako

5
我已经找到了实际的解决方法。 Theme.NoDisplay 仅适用于不显示UI的活动; 也就是说,在被恢复之前,它们会自行完成。因此,如果您将此主题分配给一个活动,则必须在退出 onCreate() 之前(即在系统调用 onResume 之前)调用 finish()。这就是为什么错误显示“在 onResume() 之前未调用 finish()” 的原因。因此,这个主题的实际用例是引导活动和类似的活动,例如当您需要确定是否显示登录视图或主视图,具体取决于用户是否已经通过身份验证时。
来源:Android Dev
public class BootstrapActivity extends Activity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (!userLoggedIn) {
            startActivity(new Intent(this, LoginActivity.class));
        } else {
            startActivity(new Intent(this, MainActivity.class));
        }
        finish();
    }

}

1

安卓23在哪里> https://www.youtube.com/watch?v=NAcUGwCkrcs

清单:

android:theme="@android:style/Theme.Translucent.NoTitleBar"
Activity extends from Activity. Not AppCompatActivity.

对于版本 >= 23

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){     
    getWindow().setStatusBarColor(getResources().getColor(android.R.color.transparent))}

0

这是因为在Activity上设置了一个主题,用户无法看到。我猜Android这样做的原因是为了防止你无限期地运行一个不可见的Activity

onResume()被调用之前,在你的活动中调用finish()(就像错误消息所说的那样)将阻止这种情况发生。

我的用例是启动一个不可见的Activity来处理深层链接并将其直接指向我的应用程序的正确部分。


-4

尝试在build.gradle中将targetSdkVersion更改为22。Theme.NoDisplay在api级别23中显示错误。


1
更改目标 SDK 版本不是解决方案。Google 已经改变了其政策,在更新或创建新应用程序之前,必须将目标 SDK 升级到最新版本。 - Ahmad Ayyaz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接