如果儿童活动崩溃,请返回父活动

时间:2014-04-13 09:29:55

标签: android android-intent exception-handling android-activity android-webview

在我的应用中有两项活动。活动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();
}

1 个答案:

答案 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