我有一个列表 Activity ,它执行通常的列表 Activity 类型的事情。所有的 Activity 设置都在 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()
覆盖。我可以根据按下的菜单按钮成功导航出此 Activity ,然后导航回此 Activity 。当我通过 startActivity(newIntent)
离开此列表 Activity 时,我不会调用 finish,但在返回此列表 Activity 时会在 newIntent Activity 中调用 finish。一切正常,除非 ListActivity
本身或其中一个新 Activity 在后台运行了很长时间(即我切换到另一个应用程序)。长时间以小时计算。有时(不总是),当我在这个延迟之后回到我的应用程序时,列表 Activity 不显示列表,菜单也不显示,只是一个空白屏幕,ActionBar 中显示 Activity 标题。
我意识到我需要处理通过 onResume()
(可能还有 onStart()
)回到列表 Activity 的问题。但是 onResume()
总是在我导航回此列表 Activity 后被调用,我如何真正知道代表 ListAdapter
和 ListView
的变量实际上已经被操作系统销毁,需要在 onResume()
中重新创建,我不想每次调用 onResume()
时都重新创建它们。我可以只检查它们是否等于 null 吗?很难对此进行测试,因为这种情况不会经常发生。
谢谢你, 加里
最佳答案
听起来您缺少有关 Android 和 Activity 生命周期的一些基本信息。首先我想提一下 Android 是如何保存它的状态的。这里有两点要点。离开 Activity 时,它有被销毁的风险,它会调用 hook 方法
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("myKey1", 1);
outState.putString("myStringKey", "hello");
}
调用此方法时,您就有机会保存所有想要保留的数据。这可以是 ID、字符串、数组列表和几乎任何其他类型的数据。
现在您已经保存了数据,在您的 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 不为空,则您的东西可能已被销毁。但是,我要说的是,无论何时调用 onCreate,Activity 都已经被完全销毁了。
我要提到的另一件事是,Android 可以在需要回收一些内存时终止后台 Activity。当它这样做时,它会为您调用 onSaveInstanceState 方法。 Android 不必在应用程序的“第一个”或“主”屏幕重新启动应用程序。如果那是用户离开的地方,它可以开始几个 Activity 。我之所以提到这一点,是因为每当 Android 在清除内存后决定创建您的 Activity 时,听起来您就会遇到问题。发生这种情况时确保您的应用程序正常运行的最佳方法是旋转手机。将手机从横向旋转到横向和/或向后旋转将导致 Activity 被销毁并重新创建,并调用 onSaveInstanceState 并将其传递回 onCreate。根据您提供的信息,这是我目前所能提供的最佳建议。
干杯。
关于android - 如何判断Activity状态是否已经被销毁需要重新创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22750287/