处理SavedInstances和恢复活动

时间:2013-11-14 19:52:57

标签: android

基本上我的应用程序有2个活动。“A”和“B” 。 A发布B。

活动B播放音乐并发出通知。

案例1:当视图仍在活动B时我按下主页按钮,然后我点击通知,活动B打开,其视图完好无损并播放音乐(因为在清单中我使用的是android :launchMode =“singleTop”,因此没有创建活动的另一个实例)这部分是按照需要...... 但是

案例2:当视图在活动B上并且我按下后退按钮时,活动A出现,然后我点击通知,活动B打开,视图丢失,音乐也停止(不需要)... ...我猜它发生了,因为当我按下后退按钮活动被销毁,所以我必须以正确的方式恢复其视图??所以要恢复其视图我重写两个方法.....

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
  // Save UI state changes to the savedInstanceState.
  // This bundle will be passed to onCreate if the process is
  // killed and restarted.
  savedInstanceState.putBoolean("boolMusicPlaying", boolMusicPlaying);
  savedInstanceState.putInt("swapnumber", swapnumber);
  savedInstanceState.putString("seekbarprogress", progress2);
  savedInstanceState.putInt("position.seekbar",seekbar.getProgress());
  savedInstanceState.putString("seekmaxString", max2);
  savedInstanceState.putInt("seekmaxInt",seekMax);
  savedInstanceState.putParcelableArrayList("songfetails",songdetails);
  super.onSaveInstanceState(savedInstanceState);


}
//make a note ....even if i don't override onDestroy() and don't call on SaveInstanceState explicitly, then too i am not getting any desired effect.......
@Override
public void onDestroy()
{   Bundle savedState = new Bundle();
onSaveInstanceState(savedState);//because of this line....the app is crashing......
super.onDestroy();
    }

但它没有帮助..... 并且在创建时我正在检查保存的实例是否为空....相应地创建视图...(即从保存的实例或新鲜的)但它没有帮助... 此行也发生了崩溃... onSaveInstanceState(savedState);

即使我没有覆盖ondestroy()并从任务杀手手动杀死应用程序,然后尝试打开活动B,那么保存的实例也应该正常工作,因为OnSaveInstanceState方法会被自动调用,对了???请帮忙

2 个答案:

答案 0 :(得分:1)

来自Android文档:

  

当您的活动因用户按下Back或活动自行完成而被销毁时,系统对该Activity实例的概念将永远消失,因为该行为表明不再需要该活动。但是,如果系统由于系统约束(而不是正常的应用程序行为)而破坏活动,那么虽然实际的Activity实例已经消失,但系统会记住它存在,如果用户导航回它,系统会创建一个新的活动的实例,使用一组保存的数据来描述销毁时的活动状态。系统用于恢复先前状态的已保存数据称为“实例状态”,是存储在Bundle对象中的键值对的集合。

要修复第二个问题,您必须从其他来源(播放音乐的服务,从应用程序上下文或单例恢复信息等)恢复数据。

有关详细信息,请查看this

答案 1 :(得分:1)

基本上,如果您按下后退按钮,则应使用shared preferences/or a database恢复活动,但如果您没有按下后退按钮,则需要恢复状态活动(因为活动被系统破坏)然后可以使用bundle savedinstances ......