如何判断活动状态是否已销毁并需要重新创建



我有一个列表活动,它执行通常的列表活动类型。所有活动设置都是在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) 离开此列表活动时,我不调用 finish,但在返回到此列表活动时,我会在 newIntent 活动中调用 finish。一切正常,除非ListActivity本身或其中一个新活动已经在后台放置了很长时间(即我切换到另一个应用程序)。长时间以小时为单位。有时(并非总是如此),当我在此延迟后返回我的应用程序时,列表活动不显示列表,菜单也不显示,只是一个空白屏幕,活动标题显示在 ActionBar 中。

我意识到我需要通过onResume()(也许onStart())处理返回列表活动。但是onResume()总是在我导航回这个列表活动后被调用,我怎么知道代表ListAdapterListView的变量是否真的作系统破坏了,需要在onResume()内部重新创建,我不想每次调用onResume()时都重新创建它们。我可以检查它们是否等于空吗?很难对此进行测试,因为这不会经常发生。

谢谢加里

听起来您缺少有关Android和Activity生命周期的一些基本信息。首先,我想提一下Android如何保存其状态。这里有两个要点。当离开活动时,它有被破坏的风险,它调用钩子方法

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("myKey1", 1);
    outState.putString("myStringKey", "hello");
}

调用此选项时,这是保存要保留的所有数据的机会。这可以是 id、字符串、数组列表和几乎任何其他类型的数据。

保存数据后,在活动的 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
}

第一次创建时,称为 savedInstanceState 为空。要回答您的问题:"我如何真正知道代表ListAdapter和ListView的变量是否实际上已作系统销毁",这就是您可以知道的方式。如果 savedInstanceState 不为空,则您的内容可能已被销毁。但是,我会说,无论何时调用Create,该活动无论如何都已被完全销毁。

我要提到的另一件事是,允许Android在需要回收一些内存时杀死您的后台活动。当它这样做时,它将为你调用onSaveInstanceState方法。Android 不必在应用程序的"第一个"或"主"屏幕上重新启动应用程序。如果这是用户离开的位置,它可以启动多个活动。我之所以提到这一点,是因为每当Android决定在清除内存后创建活动时,听起来您都会遇到问题。确保应用程序在发生这种情况时运行良好的最佳方法是旋转手机。将手机从水平旋转到横向和/或向后旋转将导致活动被销毁并重新创建,并调用 onSaveInstanceState 并传递回 onCreate。根据您提供的信息,这是我目前能建议的最好的建议。

干杯。

我终于弄清楚发生了什么。我有 2 个活动,活动 A 和活动 B,以及一个应用程序对象。应用程序启动时,活动 A 初始化存储在应用程序对象中的一些全局变量,然后启动活动 B。当我的应用程序在后台长时间后重新启动时,将调用应用程序的 onCreate(),然后调用 ActivityB 的 onCreate()。活动 B 依赖于应用程序对象中的变量,这些变量通常由活动 A 初始化,但这次从不调用活动 A,并且不会初始化全局变量。我仍然不清楚为什么 ActivityA 只是挂起,而不是崩溃并显示一些消息,指出变量为 null,这是应用程序对象中的 onCreate() 将它们设置的内容,但无论如何,当发生这种情况时,我需要回到 ActivityA() 并像往常一样重新初始化所有内容,当应用程序启动时。

我现在在应用程序对象中有一个布尔值,指示在调用应用程序对象的 onCreate() 后是否执行了 ActivityA。活动 B 检查此布尔标志,如果未设置,则只需启动活动 A 即可执行启动时类型初始化。实际上,我几乎必须在每项活动中进行此检查。

最新更新