Android 启动器应用程序不断被销毁

Android Launcher Application keeps being destroyed

我正在开发包含 WebView 的自定义启动器应用程序。当我将应用程序作为普通应用程序启动时,它在调用 startActivity()/ startActivityForResult() 之后没有任何问题(Intent.ACTION_CALL,在使用 Intent for MediaStore.ACTION_IMAGE_CAPTURE 时不会发生)应用程序调用 onPause() , onStop() 和其他 activity 启动,完成其任务后返回到应用程序。但是,当我将应用程序设置为启动器时,它会在 onPause() 和 onStop() 之后立即调用 onDestroy()。这种行为是不可取的,因为我试图将插入的数据保留在启动器 WebView 应用程序中。

在onDestroy()之后logcat也有很多错误与E/libGLESv2类似或相同:HWUI Protection: wrong calling from app context F:ES3-glDeleteBuffers (when not using它作为启动器会出现此类错误,但偶尔会出现在不同的情况下)。

AppManifest 包含

<activity
    android:name=".MainActivity"
    android:label="@string/app_name"
    android:launchMode="singleTask" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
        <category android:name="android.intent.category.HOME" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

我也尝试过使用 singleInstance,在该模式下应用程序在安装后可以正常工作,但在重新启动后会中断其行为。

使用 minSdkVersion 19,在 Android 4.4.2.

上测试

让我们先把它改成这样,

  <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:launchMode="singleTop" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

现在让我们了解 launchMode(s) 是什么

通过文档: android:launchMode 有关如何启动 activity 的说明。 有四种模式与 Intent 对象中的 activity 标志(FLAG_ACTIVITY_* 常量)结合使用,以确定调用 activity 来处理意图时应该发生什么。他们是: "standard" "singleTop" "singleTask" "singleInstance" 默认模式是 "standard".

"singleTask" 不允许 多个实例 系统在新任务的根目录下创建 activity 并将意图路由到它。但是,如果 activity 的实例已经存在,系统将通过调用其 onNewIntent() 方法将意图路由到现有实例,而不是创建新实例。

"标准" 默认。系统总是在目标任务中创建 activity 的新实例并将意图路由到它。

"单顶" 如果 activity alreadyinstance 存在于目标任务的顶部,系统通过调用其 onNewIntent() 方法,而不是创建 activity.

的新实例

单实例" 与 "singleTask" 相同,除了系统不会启动任何其他活动到持有实例的任务中。 activity 始终是其任务的唯一成员。

如需更深入的了解,请参阅 Documentation

好的,这就是我设法解决问题的方法,实际上是什么问题。我用了

    Settings.System.putInt(
            getContentResolver(),
            Settings.System.USER_ROTATION,
           // toRotate //Or a different ROTATION_ constant
            Surface.ROTATION_270
    );

用于屏幕旋转,因为我需要确保应用 运行 处于横向模式。问题是,相机支持风景模式,但拨号器不支持。所以当我启动相机时它没有问题,但是拨号器导致纵向旋转并且导致 WebView 在旋转屏幕时的默认行为,onDestroy() 并且导致之后重新加载......