在我的应用中有两项活动。活动1是webview(==主要活动)。活动2是原生pdf阅读器(儿童活动)。如果单击某些链接,则活动1通过意图打开活动2。意图不使用任何特定标志。如果用户完成阅读pdf,则关闭活动2.触发另一个意图并且用户到达他开始的点(活动1)。到目前为止没问题!
不幸的是,pdf阅读器仍然有问题并且有时会崩溃。 在那些情况下,我想要与上面提到的相同的行为:用户应该到达他开始的点(活动1)。 在Activity 2中,我集成了一个实现UncaughtExceptionHandler接口的类来捕获任何未捕获的异常并在uncaughtException方法中处理它。但我在那里完成的最好成果是重新开展活动1。
我的目标无法到达吗?或者换句话说,如果儿童活动崩溃,您可以获得的最好的是重新创建父活动(==主要活动)?
编辑:
在Alexander的回答中,我找到了解决方案:
AndroidMainfest.xml:
<activity
android:name="de.fcms.webapp.CoreActivity"
android:label="@string/label_name"
android:theme="@style/Theme.AppTheme"
android:configChanges="orientation|screenSize"
android:windowSoftInputMode="adjustResize"
android:launchMode="singleTask" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="de.fcms.framework.module.PdfActivity"
android:label="@string/setting_activity_name"
android:parentActivityName="de.fcms.webapp.CoreActivity"
android:configChanges="orientation|screenSize"
android:theme="@style/Theme.PdfActivity"
android:process="de.fcms.framework.PdfActivity">
</activity>
PdfActivity.java:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable ex) {
PdfActivity.this.getBackToMainActivity();
android.os.Process.killProcess(android.os.Process.myPid());
}
});
//let's force a crash
throw new OutOfMemoryError();
}
private void getBackToMainActivity () {
getLogger().debug("getBackToMainACtivity");
Intent intent = new Intent(this, CoreActivity.class);
setResult(2001, intent);
finish();
}
答案 0 :(得分:2)
您可以尝试在单独的进程中运行Activity2。只需在android:process
AndroidManifest.xml
即可
<activity
android:name=".Activity2"
android:process="com.example.myapp.activity2"/>
请注意,流程名称必须至少包含一个&#39;。&#39;这是你在adb shell top
中看到的。即它应该是独一无二的。所以我建议您使用应用程序ID +活动名称。
备选方案,您可以将该过程设为您应用的私密状态(这也是您大多数时间可能想要的)。为此,您使用冒号(:
)预先添加进程名称。在这种情况下,您不必担心全局名称唯一性,可以使用较短的名称:
android:process=":activity2"
了解更多in the docs。