免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1536 | 回复: 1

[Android] 返回上层Activity的正确打开方式 [复制链接]

论坛徽章:
0
发表于 2015-07-22 17:57 |显示全部楼层
首先,在网上看到有人这么写:
  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中启用向上导航按钮
  1. @Override
  2.      public void onCreate(Bundle savedInstanceState) {
  3.          super.onCreate(savedInstanceState);

  4.          // 这句必须写,不写不调用onOptionsItemSelected
  5.          setHasOptionsMenu(true);

  6.          // 启用向上导航按钮
  7.          if (NavUtils.getParentActivityName(getActivity()) != null) {
  8.              getActivity().getActionBar().setDisplayHomeAsUpEnabled(true);
  9.          }
  10.      }
复制代码
这里的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属性中添加一条:
  1. android:launchMode="singleTop"
复制代码
这样就万事OK了,(大概是)正确的打开方式~

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
发表于 2015-08-12 10:33 |显示全部楼层
如果返回是NULLt怎么处理。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP