我有一个列表活动,它执行通常的列表活动类型的东西。所有活动设置都在onCreate()
方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_streams);
Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler(this));
mActionBar = getActionBar();
mStreamListAdapter = new StreamListRowAdapter(this, R.layout.stream_list_row);
mStreamListView = (ListView)findViewById(android.R.id.list);
mStreamListView.setAdapter(mStreamListAdapter);
}
我没有onStart()
和onResume()
覆盖。我可以根据按下的菜单按钮成功导航出此活动,然后导航回此活动。当我通过startActivity(newIntent)
离开此列表活动时,我不会调用完成,但是当我回到此列表活动时,我会在newIntent活动中调用finish。除非ListActivity
本身或其中一个新活动已经在后台长时间(即我切换到另一个应用程序),否则一切正常。长时间以小时计算。有时(并非总是),当我在此延迟后回到我的应用程序时,列表活动不显示列表,菜单也不显示,只是一个空白屏幕,活动标题显示在ActionBar中。
我意识到我需要处理通过onResume()
(也许是onStart()
)回到列表活动。但是在我导航回这个列表活动之后总是会调用onResume()
,我怎么才能真正知道代表ListAdapter
和ListView
的变量是否实际上已被操作系统销毁并且需要是在onResume()
内重新创建,我不希望每次调用onResume()
时都重新创建它们。我可以检查一下它们是否等于null吗?很难对此进行测试,因为这种情况不会经常发生。
谢谢你, 加里
答案 0 :(得分:1)
听起来你缺少一些关于Android和Activity生命周期的基本信息。首先,我想提一下Android如何保存它的状态。这里有两个重点。离开活动时,它有被破坏的风险,它会调用钩子方法
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("myKey1", 1);
outState.putString("myStringKey", "hello");
}
调用此方法时,您可以保存所有要保留的数据。这可能是ids,字符串,arraylists和几乎任何其他类型的数据。
现在您已经保存了数据,在Activity的onCreate方法中,您将传回所有这些值。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
String myStr = savedInstanceState.getString("myStringKey");
int myInt = savedInstanceState.getInt("myKey1", -1);
}
// do the rest of your setup
}
第一次调用onCreate时,savedInstanceState为null。回答你的问题:“我怎么知道代表ListAdapter和ListView的变量是否真的被操作系统破坏了”这是你怎么知道的。如果savedInstanceState不为null,那么您的东西可能已被破坏。但是,我会说,无论何时onCreate被调用,Activity已经完全被销毁了。
我要提到的另一件事是Android允许在需要回收一些内存时杀死你的后台活动。当它执行此操作时,它将为您调用onSaveInstanceState方法。 Android不必在应用程序的“第一个”或“主要”屏幕上重新启动应用程序。如果那是用户离开的地方,它可以开始几个活动。我之所以提到这一点,是因为只要Android确定在清除内存后决定创建活动,就会发现问题。确保您的应用程序正常运行的最佳方法是旋转手机。将手机从水平旋转到横向和/或返回将导致活动被销毁并使用onSaveInstanceState重新创建并调回并传回onCreate。根据您提供的信息,这是我现在建议的最佳信息。
干杯。
答案 1 :(得分:0)
我终于弄清楚发生了什么。我有2个活动,ActivityA和ActivityB,以及一个Application对象。在应用程序启动时,ActivityA初始化一些存储在Application对象中的全局变量,然后启动ActivityB。当我的应用程序在后台运行很长时间后重新启动时,将调用Application的onCreate(),然后调用ActivityB的onCreate()。 ActivityB依赖于通常由ActivityA初始化的Application对象中的变量,但此次从不调用ActivityA并且未初始化全局变量。我仍然不清楚为什么ActivityA只是挂起,而不是崩溃一些消息说明变量是null,这是Application对象中的onCreate()设置它们,但无论如何,当发生这种情况时,我需要回去到ActivityA()并重新初始化应用程序启动时的所有内容。
我现在在Application对象中有一个布尔值,表示在调用Application对象的onCreate()之后是否已执行ActivityA。 ActivityB检查此布尔标志,如果未设置,则只需启动ActivityA即可执行启动类型初始化。我实际上必须在几乎所有活动中都进行检查。