onResume()未在第二次调用时调用Activity

时间:2013-03-14 21:48:31

标签: android

在正常的开发过程中,我注意到特定活动似乎在第二次调用时停止响应。

即。 menu->(intent)->activity->(back button)->menu->(intent)

logcat没有任何相关内容。

我甚至不知道从哪里开始调试这个,也不知道要显示的代码是onClickonResume片段:

 if (!dictionary.getClassName().equals("")) {

            this.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {

                    Intent i;

                    i = new Intent(mContext, NVGlobeNavigatorVC.class);
                    i.putExtra("PAGE_TITLE", title);
                    i.putExtra("TITLE", _dictionary._title);

                    mContext.startActivity(i);

            });
        } else {
            findViewById(R.id.greaterthan).setVisibility(View.GONE);
        }

并在正在启动的活动中:

@Override
protected void onResume() {

    super.onResume();

    ...

在清单中没有任何异常:

<activity
    android:name=".NVViews.NVGlobeNavigatorVC"
    android:theme="@style/WindowTitleBackground"
    android:label="GlobeNavigator"/>

为清楚起见,我在mContext.startActivity(i)super.onResume()上添加了断点。我单击onClickListener的视图,两个断点都按预期命中。然后按下后退按钮,返回菜单。 onPause()按预期调用。

我触摸视图再次启动活动,startActivity上的断点被点击但不在目标活动的onResume()中。屏幕变黑,我可以再次走的唯一方法是重启应用程序。如果我暂停调试器,它会在dalvik.system.NativeStart()暂停,这意味着活动永远不会重新启动。

我认为它不相关,但我正在使用Intellij IDEA并删除了所有输出目录,使缓存无效并完成了完全重建。

目标API是8.我已经在2.3和4.0.4上进行了测试。

有什么想法吗?我很难过。

[编辑]

onPause中,我将一些内容保存到prefs中。 onResume()的目的是让他们重新回来:

@Override
protected void onPause() {

   super.onPause();

   SCPrefs.setGlobeViewViewPoint(globeView.getViewPoint());
   SCPrefs.setGlobeViewZoom(globeView.getZoom());
   SCPrefs.setGlobeViewScale(globeView.getScale());

    }

2 个答案:

答案 0 :(得分:4)

我发现了问题,而且有点深奥。

我有一个大的静态数据结构,它加载在类静态初始化器中。如果数据结构仍然被加载,那么初始化器中有一个错误会在第二次调用时导致无限循环。

因为我的Activity中引用了该类,所以类加载器在onCreate()onResume()被调用之前加载它。

循环显示Activity加载程序已挂起。

答案 1 :(得分:3)

此代码:

i = new Intent(mContext, NVGlobeNavigatorVC.class);

创建一个新意图。意图是班级NVGlobeNavigatorVC.class

如果您调用一次,则创建一个新活动,我们称之为“iTheFirst”。如果退出活动,它将执行“暂停”。当您再次运行上面的代码时,您将创建同一类的另一个新活动,但具有不同的活动。因此它不会恢复你的其他活动,而是创建一个我们称之为“iTheSecond”的新活动。它看起来就像iTheFirst,但却是独一无二的。

如果您想恢复上述内容,退出后,您需要在菜单中保留对它的引用。然后在你的onClick中,查看该活动是否存在,如果没有,请创建一个新活动并启动它,如果确实存在,只需恢复它。

以下是记住并重新启动活动的示例活动:

Intent savedCueCardActivity = null;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState, R.layout.landing);
}

public void goToNextScreen(View v) {
    if (savedCueCardActivity == null) {
        savedCueCardActivity = new Intent().setClass(this, CueCardActivity.class);
        startActivity(savedCueCardActivity);
        //       lastActivity.finish();
    } else {
        savedCueCardActivity.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
        startActivity(savedCueCardActivity);
    }
    overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
}