android - 如何判断Activity状态是否已经被销毁需要重新创建

标签 android android-activity

我有一个列表 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 后被调用,我如何真正知道代表 ListAdapterListView 的变量实际上已经被操作系统销毁,需要在 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/

相关文章:

Android listview如何将选中的项目滚动到顶部

android - 从可绘制文件夹裁剪图像

android - Checkstyle Plugin 不添加 gradle 任务

android - 在谷歌播放应用程序登录期间出现错误 "no key for alias"

java - Android:在运行时多次检查另一个类的方法

android - 如何使 Activity 背景透明和模糊背景

android - Activity 泄漏了原本是 android 的窗口

java - Android,可检查菜单项

android - 在 PagerTitleStrip 中隐藏相邻的标签标题

android - 找不到符号 Volley