Activity 没有调用完成? (API 23)

Activity did not call finish? (API 23)

我收到以下错误,我不知道为什么会这样。

错误:

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

我正在尝试 运行 AVD 运行ning android 6.0 (API 23) 上的代码,适用于 API 22.

这是 Android M 开发者预览中的错误。 More details

我找到了解决方法。在 onStart():

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

我遇到了同样的问题,同样的崩溃与

did not call finish() prior to onResume() completing

错误信息。所以我创建了 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,尤其是 defined

Theme for translucent activities (on API level 10 and lower).

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

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

我的隐形 Activity 显示确认对话框。当我使用 android:Theme.Translucent.NoTitleBar.

时,这确实 失去了 material 设计外观

因此,基于上面的答案和 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>

其中 android 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))}

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

在调用 onResume() 之前在 activity 中调用 finish()(如错误消息所述)将阻止这种情况发生。

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

我已经找到了实际的修复方法。 Theme.NoDisplay 仅适用于

activities that don't actually display a UI; that is, they finish themselves before being resumed.

来源:Android Dev

因此,如果您将此主题分配给 activity,您 必须 在退出 onCreate() 之前调用 finish()(即在系统调用之前onResume) 这就是错误显示 "did not call finish() prior to onResume()".

的原因

所以这个主题的实际用例是 bootstrap 活动等,例如当您必须根据用户是否已经通过身份验证来确定是显示登录还是主视图时:

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

}