【Android开发笔记】返回上层Activity的正确打开方式
技术支持 http://stackoverflow.com/questions/12276027/how-can-i-return-to-a-parent-activity-correctly
首先,在网上看到有人这么写:
1 @Override 2 public boolean onOptionsItemSelected(MenuItem item) { 3 switch (item.getItemId()) { 4 case android.R.id.home: 5 this.getActivity().finish(); 6 return true; 7 default: 8 return super.onOptionsItemSelected(item); 9 } 10 }
这样直接Finish()的写法貌似可行?
NONONO,这种写法只适用于你足够确定在关闭子Activity前,父Activity会一直存活着。
而在更复杂的状况下(比如子Activity是从推送中启动的),然并卵。
所以接下来,我来给大家示范一下正确打开上一层Activity的正确姿势(摩拳擦掌
Step. 1 首先在Manifest中关联父子关系
使用"android.support.PARENT_ACTIVITY"这货来关联:
1 <activity android:name=".ChildActivity" 2 android:label="@string/app_name" > 3 <meta-data android:name="android.support.PARENT_ACTIVITY" 4 android:value=".ParentActivity" /> 5 </activity>
Step. 2 在子Activity中启用向上导航按钮
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 这句必须写,不写不调用onOptionsItemSelected setHasOptionsMenu(true); // 启用向上导航按钮 if (NavUtils.getParentActivityName(getActivity()) != null) { getActivity().getActionBar().setDisplayHomeAsUpEnabled(true); } }
这里的if用来判断子Activity是否含有父Activity,要是没做第一步,就要跪了
Step. 3 onOptionsItemSelected中启动父Activity
1 @Override 2 public boolean onOptionsItemSelected(MenuItem item) { 3 switch (item.getItemId()) { 4 case android.R.id.home: 5 // 点击返回按钮,退回上一层Activity 6 if (NavUtils.getParentActivityName(getActivity()) != null) { 7 // 启动父Activity 8 NavUtils.navigateUpFromSameTask(getActivity()); 9 } 10 return true; 11 12 default: 13 return super.onOptionsItemSelected(item); 14 } 15 }
到这一步,我们就可以愉快的启动父Activity~
但你会发现,怎么父Activity启动的并不是之前存在的实例,而是新实例化一个?
这并不符合我们的需求啊,所以说关键是接下来一步。
Step. 4 设置launchMode
因为安卓的默认启动Activity方式是new一个,即使存在一个实例,但还是要new,new,new
所以我们需要做出修改,在Manifest的父Avtivity属性中添加一条:
android:launchMode="singleTop"
这样就万事OK了,(大概是)正确的打开方式~
にっこにっこにーー!