Android:当我按下后退按钮(ActivityGroup + TabWidget)应用程序崩溃

4

大家好!

一年前,我使用“ActivityGroup + TabWidget”组合开发了一个应用,在Android OS 2.3+上运行良好。但我在OS 4.0上测试它时,发现有时会崩溃。 - 如果我打开应用程序,什么也不做,然后点击“返回”,它就可以正常工作。 - 如果我打开应用程序,在应用程序中导航(点击列表项,查看详细信息,然后返回),然后当我回到标签的“根”页面时,点击“返回”时,它就会崩溃。(它应该正常关闭应用程序)------- 在这种情况下,ActivityGroup启动新的活动并接收back键事件。 - 如果我像上面那样打开应用程序,在应用程序中导航,但只查看由组中的根活动而不是activitygroup启动的视图,那么它就可以正常工作。

我的ActivityGroup中有一些代码。

public void startActivity(Intent intent) {
// Start the root activity withing the group and get its view
    View view = getLocalActivityManager().startActivity(id, intent)
                                        .getDecorView();
    // Replace the view of this ActivityGroup
    replaceView(view);
}

public void back() {
    if(history.size() > 1) {  //history = new ArrayList<View>(); global variable
        history.remove(history.size()-1);
        setContentView(history.get(history.size()-1));

        mIds.pop();
    }else {
        finish();    // I tried to commment it too, but no lucks
    }
}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        back();

        return true;
    }

    return super.onKeyDown(keyCode, event);
}

还有错误堆栈:

05-18 18:47:47.687: E/AndroidRuntime(6828): FATAL EXCEPTION: main
05-18 18:47:47.687: E/AndroidRuntime(6828): java.lang.IllegalStateException: Can not                 perform this action after onSaveInstanceState
05-18 18:47:47.687: E/AndroidRuntime(6828):     at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1213)
05-18 18:47:47.687: E/AndroidRuntime(6828):     at     android.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:442)
05-18 18:47:47.687: E/AndroidRuntime(6828):     at android.app.Activity.onBackPressed(Activity.java:2121)
05-18 18:47:47.687: E/AndroidRuntime(6828):     at android.app.Activity.onKeyUp(Activity.java:2099)
05-18 18:47:47.687: E/AndroidRuntime(6828):     at android.view.KeyEvent.dispatch(KeyEvent.java:2557)
05-18 18:47:47.687: E/AndroidRuntime(6828):     at android.app.Activity.dispatchKeyEvent(Activity.java:2329)
05-18 18:47:47.687: E/AndroidRuntime(6828):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1806)
05-18 18:47:47.687: E/AndroidRuntime(6828):     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1248)
05-18 18:47:47.687: E/AndroidRuntime(6828):     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1248)
05-18 18:47:47.687: E/AndroidRuntime(6828):     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1248)
05-18 18:47:47.687: E/AndroidRuntime(6828):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1859)
05-18 18:47:47.687: E/AndroidRuntime(6828):     at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1361)
05-18 18:47:47.687: E/AndroidRuntime(6828):     at android.app.Activity.dispatchKeyEvent(Activity.java:2324)
05-18 18:47:47.687: E/AndroidRuntime(6828):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1806)
05-18 18:47:47.687: E/AndroidRuntime(6828):     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1248)
05-18 18:47:47.687: E/AndroidRuntime(6828):     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1248)
05-18 18:47:47.687: E/AndroidRuntime(6828):     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1248)
05-18 18:47:47.687: E/AndroidRuntime(6828):     at android.widget.TabHost.dispatchKeyEvent(TabHost.java:298)
05-18 18:47:47.687: E/AndroidRuntime(6828):     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1248)
05-18 18:47:47.687: E/AndroidRuntime(6828):     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1248)
05-18 18:47:47.687: E/AndroidRuntime(6828):     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1248)
05-18 18:47:47.687: E/AndroidRuntime(6828):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1859)
05-18 18:47:47.687: E/AndroidRuntime(6828):     at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1361)
05-18 18:47:47.687: E/AndroidRuntime(6828):     at android.app.Activity.dispatchKeyEvent(Activity.java:2324)
05-18 18:47:47.687: E/AndroidRuntime(6828):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1806)
05-18 18:47:47.687: E/AndroidRuntime(6828):     at android.view.ViewRootImpl.deliverKeyEventPostIme(ViewRootImpl.java:3300)
05-18 18:47:47.687: E/AndroidRuntime(6828):     at android.view.ViewRootImpl.handleFinishedEvent(ViewRootImpl.java:3273)
05-18 18:47:47.687: E/AndroidRuntime(6828):     at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2436)
05-18 18:47:47.687: E/AndroidRuntime(6828):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-18 18:47:47.687: E/AndroidRuntime(6828):     at android.os.Looper.loop(Looper.java:137)
05-18 18:47:47.687: E/AndroidRuntime(6828):     at android.app.ActivityThread.main(ActivityThread.java:4340)
05-18 18:47:47.687: E/AndroidRuntime(6828):     at java.lang.reflect.Method.invokeNative(Native Method)
05-18 18:47:47.687: E/AndroidRuntime(6828):     at java.lang.reflect.Method.invoke(Method.java:511)
05-18 18:47:47.687: E/AndroidRuntime(6828):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
05-18 18:47:47.687: E/AndroidRuntime(6828):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
05-18 18:47:47.687: E/AndroidRuntime(6828):     at dalvik.system.NativeStart.main(Native Method)

我没有使用Fragment,因为在我开发这个应用程序时它还没有被Android SDK发布。

有什么想法吗?每一个想法都会受到赞赏!
谢谢!

3个回答

2
您可以使用 onBackPressed() 来实现您想要的结果,您可以按以下方式使用它。
public void onBackPressed(){
  //Your code here
  super.onBackPressed();
}

最重要的是,确保您在所有子活动中实现了此方法,这些子活动将用于您的活动组。


是的,你说得对。我在每个活动中都放置了onBackPressed()以供在ActivityGroup中使用。它按预期工作。 - Arslan Anwar
我已经有一段时间没有在其他项目中工作了。但是感谢穆罕默德,我会在有时间的时候尝试你的解决方案。 - lansher1985

0

你可以帮助这段代码:

@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putString("WORKAROUND_FOR_BUG_19917_KEY", "WORKAROUND_FOR_BUG_19917_VALUE");
    super.onSaveInstanceState(outState);
}

0

不要这样做:

if (keyCode == KeyEvent.KEYCODE_BACK)

你可以尝试通过重写

public void onBackPressed() {}

来处理返回按钮,然后在其中编写你的代码。


你尝试过调试它吗?它在哪一行报错?它进入了back()方法吗? - rizzz86
是的,我尝试了。当我在选项卡的根页面上点击返回键时,它没有在任何地方停止。我在“back()”、“OnStop()”、“OnPause()”、“OnKeyDown()”、“onSaveInstanceState(Bundle outState)”处设置了断点,但什么也没发生,它直接停在了“FragmentManagerImpl.checkStateLoss() line:1213”,我看不到源代码,只是一个空白页面。 - lansher1985
但是当我在其他页面(详细页面)上点击返回按钮时,它停止了。 - lansher1985

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接