0

我所拥有的书籍在解释如何处理生命周期方面非常糟糕,我遗漏了很多我希望有人能补充的东西。

我的应用程序结构是,当它第一次启动时,它会启动一个用户必须接受的充满法律问题的活动。当他说“好的”时,我开始我的主要活动,然后我像这样调用完成:

public void onClick(View view) { //as a result of "I accept"
    Intent mainIntent = new Intent(mParent, EtMain.class);
    startActivity(mainIntent); // Start the main program
    finish();
}

然后在 onCreate 方法的 EtMain 中,我有一些选项卡,我实例化了一些类:

super.onCreate(savedInstanceState);
setContentView(R.layout.main);

mTabHost = (TabHost)findViewById(android.R.id.tabhost);
SetupTabs.setMyTabs(mTabHost, this);

mComData = new ComFields(this); // Create the objects
mDepWx = new WxFields(this, DepArr.Departure);
mArrWx = new WxFields(this, DepArr.Arrival);
mDepVs = new DepFields(this);
mArrVs = new ArrFields(this);
mTabHost.setOnTabChangedListener(new OnTabChangeListener(){
}

问题:第一个片段中的“完成”应该终止 legalbabble 活动,因此它永远不会重新启动,对吗?即使我的应用程序被推到后台,EtMain 也将永远存在(直到被外部杀死),对吗?

现在的方式是,当 EtMain 被推动并随后被带到前台(通过点击图标)时,它会通过 legalbabble 屏幕,就好像这是一个完整的开始 - 这就是我想要阻止的 - 通过 legalbabble再次屏幕。

看来我想在第二个代码片段中覆盖 onRestart 并在那里放一些东西来重新启动应用程序,对吧?这是我不清楚的部分。

我的问题是在 onRestart 中需要做什么。我是否必须重新创建选项卡中的所有选项卡和数据以及我的所有对象实例化?或者应用程序的内存状态是否保存在某个地方,然后恢复到它在其他东西被带到前台之前的状态,在这种情况下不需要做太多事情,因为所有对象和侦听器仍然存在?

4

3 回答 3

2
  1. 是的,在第一个活动结束后,您不必再次查看该活动。您还可以写入用户以前看过法律信息的共享偏好。

  2. 如果您的 UI 对象创建是在 onCreate 方法中,则应该只调用一次。暂停或恢复不会再次调用 onCreate 方法。

  3. 除非您在 onPause 方法中显式删除您的对象和 tabChangedListeners,否则您不必在 onRestart 方法中触摸它们。

  4. 正确,应用程序的状态会自动保存。您不必触摸 onRestart 方法。

希望这可以帮助!

于 2011-09-25T00:06:43.780 回答
1

我认为问题在于清单中的启动活动是合法的活动,因此当您单击图标时,系统会启动另一个。更好的架构是在后者的 onCreate 方法中从您的 EtMain 活动中启动 legalbabble 活动,使用startActivityForResult. 从文档:

作为一种特殊情况,如果您在活动startActivityForResult()的初始onCreate(Bundle savedInstanceState)/期间使用 requestCode >= 0 进行调用onResume(),则在从已启动的活动返回结果之前不会显示您的窗口。

当你得到结果时,如果合法的东西被拒绝了onActivityResult,你可以打电话;finish()否则一切都会正常进行。

这避免了在您的清单中定义的启动活动在接受合法内容时完成的问题。

于 2011-09-25T00:11:49.040 回答
1

EtMain 不会永远保留,如果用户退出(通过按 BACK 键)Activity 将完成(onPause,然后 onStop,然后 onDestroy 将被调用)。通常,您可以忽略 onRestore,直到您做一些复杂的事情。

一旦用户退出您的应用程序并重新进入(或按下主屏幕上的图标),将为您的第一个活动调用 onCreate(随后是 onStart 和 onResume),因此您不需要 onRestart 中的任何逻辑,您的代码在onCreate 将像第一次一样为您进行设置。因此,除非您存储首选项(在 SharedPreferences 或数据库或文件中)以表明您已经显示它,否则当用户在退出后启动应用程序时,您的法律问题将再次出现 - 在这种情况下,立即完成并启动主程序活动。

仅当应用程序从停止状态(已调用 onStop 但未调用 onDestroy)进入启动状态(已调用 onStart 但尚未调用 onResume)时才调用 onRestart。

为了保存数据——一些组件会自动保存它们的状态(例如,EditTexts 会记住其中的文本,TabHosts 会记住当前选择的选项卡等)。有些组件不会。如果您希望保存额外数据,请使用 onSaveInstanceState 和 onRestoreInstanceState。您应该只使用这些方法来恢复您的应用程序或临时数据的状态,而不是重要的事情,例如用户正在查看的资源的 ID、他们所处的缩放级别等。对于联系人或实际数据等内容,您当调用 onPause 时,应该将这些更改提交到数据库、SharedPreferences 或其他永久存储(例如文件)。

如果您感到困惑,我建议您查看Android Activity 生命周期。或者问更多问题!

于 2011-09-25T00:13:51.333 回答