我所拥有的书籍在解释如何处理生命周期方面非常糟糕,有很多我想念的,我希望有人可以填写。
我的应用程序结构是,当它第一次启动时,它会启动一个充满了用户必须接受的legalbabble的活动。当他说'好'时,我开始我的主要活动,然后我打电话给这样完成:
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(){
}
问题: 第一个片段中的“完成”应终止合法的活动,因此它永远不会重新启动,对吧?即使我的应用程序被推到了后台,EtMain将永远保留(直到外部被杀),对吧?
现在的方式,当EtMain被推动并随后被带到前台(通过点击图标)时,它会通过legalbabble屏幕,好像它是一个完整的开始 - 这就是我想要阻止的 - 去再次通过legalbabble屏幕。
似乎我想要在第二个代码片段中覆盖onRestart并在其中放置一些内容来重启应用程序,对吧?这是我不清楚的部分。
我的问题是在onRestart上需要做些什么。我是否必须重新创建选项卡中的所有选项卡和数据以及所有对象实例?或者是应用程序的内存状态保存在某个位置,然后恢复到其他东西被带到前台之前所处的状态,在这种情况下不需要做太多,因为所有对象和侦听器仍然存在?
答案 0 :(得分:2)
是的,在第一个活动结束后,您不必再次查看该活动。您也可以写信给用户之前看过法律信息的shared preferences。
如果您在onCreate方法中创建UI对象,则只应调用一次。暂停或恢复不会再次调用onCreate方法。
除非您在onPause方法中明确删除对象和tabChangedListeners,否则您不必在onRestart方法中触摸它们。
正确,应用程序的状态会自动保存。您不必触及onRestart方法。
希望这有帮助!
答案 1 :(得分:1)
我认为问题在于清单中的启动活动是合法的活动,所以当您点击图标时,系统会启动另一个活动。一个更好的架构是使用startActivityForResult
在后者的onCreate方法中从您的EtMain活动启动它的合法活动。来自文档:
作为特殊情况,如果您在活动的初始
startActivityForResult()
/onCreate(Bundle savedInstanceState)
期间使用requestCode> = 0致电onResume()
,那么您的窗口将不会显示结果从已启动的活动返回。
当您在onActivityResult
中获得结果时,如果合法内容被拒绝,您可以致电finish()
;否则一切都会正常进行。
这可以避免在合法内容被接受时,清单中定义的启动活动完成的问题。
答案 2 :(得分:1)
EtMain不会永远保留,如果用户退出(通过按BACK键)Activity将完成(onPause,然后onStop,然后onDestroy将被调用)。 通常,在执行复杂操作之前,您可以忽略onRestore。
一旦用户退出您的应用程序并重新进入(或按下主屏幕上的图标),将为您的第一个活动调用onCreate(后跟onStart和onResume),因此onRestart中不需要任何逻辑,您在onCreate中的代码将像第一次一样为您进行设置。因此,除非您存储偏好(在SharedPreferences或数据库或文件中)以指示您已经显示它,否则当用户在退出后启动应用程序时,您的合法bab呀声会再次出现 - 在这种情况下立即完成并启动主要内容活性。
仅当应用程序从停止状态(已调用onStop但未调用onDestroy)进入启动状态(调用onStart但尚未使用onResume)时,才会调用onRestart。为了保存数据 - 某些组件会自动保存其状态(例如,EditTexts会记住其中的文本,TabHosts会记住当前选中的标签等)。有些组件不会。如果您希望保存额外数据,请使用onSaveInstanceState和onRestoreInstanceState。您应该只使用这些方法来恢复应用程序或临时数据的状态,而不是重要的事情,例如用户正在查看的资源的ID,他们所处的缩放级别等。对于联系人或实际数据等内容,您应该在调用onPause时将这些更改提交到数据库,SharedPreferences或其他永久存储(例如文件)。
如果您感到困惑,我建议您查看Android Activity lifecycle。或者问更多问题!