5

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

IEmenu->(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)and上放置了断点super.onResume()。我单击带有 的视图,onClickListener两个断点都按预期命中。然后我按下返回按钮,返回菜单。 onPause()按预期调用。

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

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

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

有任何想法吗?我难住了。

[编辑]

onPause中,我将一些东西保存到首选项。的目的onResume()是让他们再次回来:

@Override
protected void onPause() {

   super.onPause();

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

    }
4

2 回答 2

4

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

我有一个大型静态数据结构,它加载在类静态初始化程序中。如果数据结构仍在加载,则该初始化程序中有一个错误导致第二次调用它时出现无限循环。

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

循环给出了 Activity 加载器已挂起的外观。

于 2013-03-18T08:12:05.500 回答
4

这段代码:

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);
}
于 2013-03-15T02:28:12.847 回答