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 already 的 instance 存在于目标任务的顶部,系统通过调用其 onNewIntent() 方法,而不是创建 activity.
的新实例
单实例"
与 "singleTask" 相同,除了系统不会启动任何其他活动到持有实例的任务中。 activity 始终是其任务的唯一成员。
如需更深入的了解,请参阅 Documentation
好的,这就是我设法解决问题的方法,实际上是什么问题。我用了
Settings.System.putInt(
getContentResolver(),
Settings.System.USER_ROTATION,
// toRotate //Or a different ROTATION_ constant
Surface.ROTATION_270
);
用于屏幕旋转,因为我需要确保应用 运行 处于横向模式。问题是,相机支持风景模式,但拨号器不支持。所以当我启动相机时它没有问题,但是拨号器导致纵向旋转并且导致 WebView 在旋转屏幕时的默认行为,onDestroy() 并且导致之后重新加载......
我正在开发包含 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 already 的 instance 存在于目标任务的顶部,系统通过调用其 onNewIntent() 方法,而不是创建 activity.
的新实例单实例" 与 "singleTask" 相同,除了系统不会启动任何其他活动到持有实例的任务中。 activity 始终是其任务的唯一成员。
如需更深入的了解,请参阅 Documentation
好的,这就是我设法解决问题的方法,实际上是什么问题。我用了
Settings.System.putInt(
getContentResolver(),
Settings.System.USER_ROTATION,
// toRotate //Or a different ROTATION_ constant
Surface.ROTATION_270
);
用于屏幕旋转,因为我需要确保应用 运行 处于横向模式。问题是,相机支持风景模式,但拨号器不支持。所以当我启动相机时它没有问题,但是拨号器导致纵向旋转并且导致 WebView 在旋转屏幕时的默认行为,onDestroy() 并且导致之后重新加载......