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

时间:2014-03-30 21:46:12

标签: android android-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()覆盖。我可以根据按下的菜单按钮成功导航出此活动,然后导航回此活动。当我通过startActivity(newIntent)离开此列表活动时,我不会调用完成,但是当我回到此列表活动时,我会在newIntent活动中调用finish。除非ListActivity本身或其中一个新活动已经在后台长时间(即我切换到另一个应用程序),否则一切正常。长时间以小时计算。有时(并非总是),当我在此延迟后回到我的应用程序时,列表活动不显示列表,菜单也不显示,只是一个空白屏幕,活动标题显示在ActionBar中。

我意识到我需要处理通过onResume()(也许是onStart())回到列表活动。但是在我导航回这个列表活动之后总是会调用onResume(),我怎么才能真正知道代表ListAdapterListView的变量是否实际上已被操作系统销毁并且需要是在onResume()内重新创建,我不希望每次调用onResume()时都重新创建它们。我可以检查一下它们是否等于null吗?很难对此进行测试,因为这种情况不会经常发生。

谢谢你, 加里

2 个答案:

答案 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即可执行启动类型初始化。我实际上必须在几乎所有活动中都进行检查。