Android back按键基础开发

在app设计中, 通常都会针对用户的退出按钮进行特别的开发:

  • 按下back按钮两次才退出应用
  • 在ActionBar中新增回退按钮
  • 增加按钮直接回退到主屏幕
  • ….

该篇文章针对以上的几种常见需求, 做一个模拟的例子进行简单说明


自定义Back按键

问题: 应用程序以自己的方式来处理用户按下物理Back按键后的行为;

解决方案:
可以在Activity中调用onBackPressed()回调方法或者再Fragment中popBackStack中操作回退栈;

实现:
如果想要在Activity中进行用户点击物理Back按键后得到相应的通知, 可以复写Activity中的onBackPressed()回调方法。

// 当用户点击物理Back按键的时候, 会调用该方法
class MainActivity extends Activity{...@Overridepublic void onBackPressed() {super.onBackPressed();}
}

这个方法的默认实现会将该Activity中绑定的Fragment全部弹出并且销毁该Activity, 如果需要修改这个默认流程, 只需要确保不调用super方法即可。(不进行源码分析)

场景: 用户需要在两秒钟之内按两次Back按键才认为需要退出该界面, 否则认为用户的误操作。

// 当用户点击物理Back按键的时候, 会调用该方法
long firstDown = 0l;
@Override
public void onBackPressed() {if(System.currentTimeMillis() - firstDown < 2000){super.onBackPressed();}else{Toast.makeText(this, "再按一次退出应用", Toast.LENGTH_SHORT).show();firstDown = System.currentTimeMillis();}
}

监听Fragment进行回退操作

问题:
目前大部分应用的主界面Tab都采用的是Fragment进行管理, 然而我们都知道, Fragment只是依附于Activity上的, 当用户打开多个Fragment时, 进行物理Back按键退出的时候, 希望能够通过打开的Fragment顺序进行依次关闭或者直接回退到第一个Fragment主界面。

解决方案:
在进行Fragment的绑定的时候, 我们需要将当前的Activity添加到回退栈中, 当用户按下物理Back按键时, 可根据回退栈中的Fragment进行依次回退或回退到指定的Fragment中

实现:
不管是进行Fragment的依次回退还是指定回退, 都需要先将Fragment添加至Fragment的回退栈中。

class MainActivity extends Activity{....void init(){FragmentManager fragmentManager = getSupportFragmentManager();FragmentTransaction transaction = fragmentManager.beginTransaction();transaction.add(R.id.main_fragment_layout, MyFragment.newInstance("one"), "one");transaction.addToBackStack("one");transaction.commit();transaction = fragmentManager.beginTransaction();transaction.add(R.id.main_fragment_layout, MyFragment.newInstance("two"), "two");transaction.addToBackStack("two");transaction.commit();transaction = fragmentManager.beginTransaction();transaction.add(R.id.main_fragment_layout, MyFragment.newInstance("three"), "three");transaction.addToBackStack("three");transaction.commit();transaction = fragmentManager.beginTransaction();transaction.add(R.id.main_fragment_layout, MyFragment.newInstance("four"), "four");transaction.addToBackStack("four");transaction.commit();}public static class MyFragment extends Fragment{private String title;public static Fragment newInstance(String title){MyFragment fragment = new MyFragment();fragment.setTitle(title);return fragment;}@Nullable@Overridepublic View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {TextView tv = new TextView(getActivity());tv.setText(title);tv.setBackgroundColor(Color.parseColor("#4400ff00"));return tv;}public void setTitle(String title){this.title = title;}}
}

上诉代码通过FragmentTransaction.addToBackStack("xxx") 把Fragment添加到回退栈中, 名称为"xxx" 当我们需要进行指定回退的时候, 这个参数就很有用了。

场景1:本应用有个抽屉效果, 每个抽屉的item都是一个Fragment表示, 当我们依次点开item后, 用户退出时,需要从当前显示的item内容依次回退到第一个item。

class MainActivity extends Activity{...getSupportFragmentManager().popBackStack();
}

上诉方法, 将会从Fragment中的回退栈中依次的退出。

场景2:本应用有个抽屉效果, 每个抽屉的item都是一个Fragment表示,当用户按下物理Back按键时, 需要回退到第一个Framgent内容, 再决定是否需要退出app。

class MainActivity extends Activity{...getSupportFragmentManager().popBackStack("two", FragmentManager.POP_BACK_STACK_INCLUSIVE);
}

模拟Home按键

背景:
应用程序有一个按钮, 需要跟物理Home按键一样的功能。

解决方案:
其实Home界面也可以理解为一个Activity。 我们只需要知道如果打开这个Activity就可以了。

实现:

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);

大结局:

该篇文章主要是针对一些应用场景的app开发常见的效果而产生的, 没有要求整体质量。
言语匪浅, 心意可达。


Android back按键基础开发相关推荐

  1. android 自定义view 加载图片,Android自定义View基础开发之图片加载进度条

    学会了Paint,Canvas的基本用法之后,我们就可以动手开始实践了,先写个简单的图片加载进度条看看. 按照惯例,先看效果图,再决定要不要往下看: 既然看到这里了,应该是想了解这个图片加载进度条了, ...

  2. Android系统 linux内核按键驱动开发

    Android系统 linux内核按键驱动开发 前言 刚入门的小白,在csdn的帮助下完成了第一个按键驱动,特写此文记录学习并分享给有需要的人. 1.修改设备树.dts 我是用的开发板是rp-rk32 ...

  3. Android零基础开发到项目实战

    Android零基础开发到项目实战(目录) 前言:本教程适合零基础学习安卓开发的伙伴,下面是目录,本博主会每天定时更新每一章节的教程,未完..... 一.Java基础阶段 day01_Java语言概述 ...

  4. Android应用基础开发入门

    本文写给Android小白,起步入门参考,不过还是喜欢从原理上尽量多讲一点东西. 本文从以下四个方面展开,重点介绍前3节: 第一节:什么是apk? 第二节:android开发 工具介绍 第三节:我们开 ...

  5. Android基础开发(1) - 打恶魔准备篇

    文章目录 前言 配置开发环境 一.开发工具 二.安装和配置JDK 三.安装Android Studio 正式开始 前言 Android开发是指在Android平台上进行应用创作.在"Andr ...

  6. 基于Quartus Prime的NiosII基础开发流程

    基于Quartus Prime的NiosII基础开发流程 2018年11月23日 21:44:13 bt_ 阅读数 2246 更多 分类专栏: FPGA 版权声明:本文为博主原创文章,遵循 CC 4. ...

  7. Android传感器Motion Sensor开发实验

    目录 一.实验目的 二.实验要求 三.实验原理 (一)第一次实验 1.JDK(Java Development Kit) 2.Android SDK 3.AVD(Android Virtual Dev ...

  8. Android自定义定时闹钟开发详解

    这篇文章主要为大家详细介绍了Android自定义定时闹钟开发,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了Android开发之自定义闹钟实现,供大 ...

  9. 《Android 移动应用基础教程(Android Studio)(第2版)》【课本客观题】+【学习通2023春】【参考答案】

    文章目录 超星学习通智能终端软件开发(基于Android Studio环境)章节作业(39) 一 二 三 四 五 六 课本一 课本二 课本三 课本四 课本五 课本六(无) 课本七 课本八 课本九 课本 ...

最新文章

  1. vue如何使用原生js写动画效果_手摸手,带你用 vue 动画实现原生 app 切换效果,丝滑般的体验...
  2. org.apache.ibatis.binding.BindingException: Mapper method 'com.wdg.person.api.IPerson.insertPerson'
  3. java 启动加载顺序_Java 程序的加载运行过程 | 学步园
  4. mysql get one_Ecshop 数据库操作方法getRow、getAll、getOne区别
  5. [mybatis]Configuration XML_mappers
  6. nt服务器需要的协议,构建没有NT服务器的NT域
  7. 二维数组中的查找(java)
  8. 以太坊的4个发展阶段与难度炸弹
  9. python迭代器和生成器_Python迭代器与生成器
  10. Visio设置跨线之间不避让
  11. max30102c语言,max30102问题
  12. JavaScript实现富文本编辑器
  13. PR2打印机参数设置
  14. iOS14隐私适配:根据不同的场景需求设置不同的定位精确度
  15. IBMMQ-安装IBMMQ服务端7.5(windows)
  16. oracle级联 drop,请教:oralce自带主外键级联删除的原理?
  17. np.title函数作用
  18. 读书笔记 | 自动驾驶中的雷达信号处理(第6章 到达方向(DOA)估计算法 )
  19. wordpress大前端主题DUX7.1免授权
  20. VMware vSphere Hypervisor 7(ESXi 7)

热门文章

  1. R02-javaWeb-ServletConfigServletConfig
  2. 华为硬件逻辑岗笔试题(一)
  3. R语言-南丁格尔玫瑰图
  4. 极限、可导、可微、连续之间的关系
  5. 2018年计算机考证时间
  6. 内网渗透测试:内网横向移动基础总结
  7. 中秋节快到了,一起用MATLAB绘制一款2.5D月饼叭
  8. 单片机(Arduino)+FLASH+MIC+喇叭自制录音、播放器(二)
  9. iOS 定位服务编程详解
  10. win10系统更新后文件丢失的解决办法