在正常的开发过程中,我注意到特定活动似乎在第二次调用时停止响应。
即。 menu->(intent)->activity->(back button)->menu->(intent)
logcat没有任何相关内容。
我甚至不知道从哪里开始调试这个,也不知道要显示的代码是onClick
和onResume
片段:
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());
}
答案 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);
}