Android:面向单Activity开发

Posted 嘴巴吃糖了

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android:面向单Activity开发相关的知识,希望对你有一定的参考价值。

记得前一两年很多人都跟风面向单Activity开发,顾名思义,就是整个项目只有一个Activity。一个Activity里面装着N多个Fragment,再给Fragment加上转场动画,效果和多Activity跳转无异。其实想想还比较酷,以前还需要关注多个Acitivity之间的生命周期,现在只需关注一个,但还是需要对Fragment的生命周期进行关注。

其实早在六七年前GitHub上就有单Activity的开源库Fragmentation,后来谷歌也出了一个库Navigation。本来以为官方出品必为经典,当时跟着官方文档一步一步踩坑,最后还是放弃了该方案。理由大概如下:

  1. 需要创建XML文件,配置导航关系和跳转参数等
  2. 页面回退是重新创建,需要配合livedata使用
  3. 貌似还会存在卡顿,一些栈内跳转处理等问题

而Github上Fragmentation库已经停止维护,所幸的是再lssuse中发现了一个基于它继续维护的SFragmentation,于是正是开启了面向单Activity的开发。

提供了可滑动返回的版本

dependencies 
	//请使用最新版本
	implementation 'com.github.weikaiyun.SFragmentation:fragmentation:latest'
	//滑动返回,可选
	implementation 'com.github.weikaiyun.SFragmentation:fragmentation_swipeback:latest'

由于是Fragment之间的跳转,我们需要将原有的Activity跳转动画在框架初始化时设置到该框架中

Fragmentation.builder() 
    //设置 栈视图 模式为 (默认)悬浮球模式  SHAKE: 摇一摇唤出  NONE:隐藏, 仅在Debug环境生效
    .stackViewMode(Fragmentation.BUBBLE)
    .debug(BuildConfig.DEBUG)
    .animation(
        R.anim.public_translate_right_to_center,  //进入动画
        R.anim.public_translate_center_to_left,  //隐藏动画
        R.anim.public_translate_left_to_center,  //重新出现时的动画
        R.anim.public_translate_center_to_right  //退出动画
    )
    .install()

因为只有一个Activity,所以需要在这个Activity中装载根Fragment

loadRootFragment(int containerId, SupportFragment toFragment)

但现在的APP几乎都是一个页面多个Tab组成的怎么办呢?

loadMultipleRootFragment(int containerId, int showPosition, SupportFragment... toFragments);

有了多个Fragment的显示,我们需要切换Tab实际也很简单

showHideFragment(ISupportFragment showFragment);

是不是使用起来很简单,首页我们解决了,关于跳转和返回、参数的接受和传递呢?

//启动目标fragment
start(SupportFragment fragment)
//带返回的启动方式
startForResult(SupportFragment fragment,int requestCode)
//接收返回参数
override fun onFragmentResult(requestCode: Int, resultCode: Int, data: Bundle?) 
    super.onFragmentResult(requestCode, resultCode, data)

//返回到上个页面,和activity的back()类似
pop()

对于单Activity而言,我们其实也可以注册一个全局的Fragment监听,这样就能掌控当前的Fragmnet

supportFragmentManager.registerFragmentLifecycleCallbacks(
    object : FragmentManager.FragmentLifecycleCallbacks() 
        override fun onFragmentAttached(fm: FragmentManager, f: Fragment, context: Context) 
            super.onFragmentAttached(fm, f, context)
        
        override fun onFragmentCreated(
            fm: FragmentManager,
            f: Fragment,
            savedInstanceState: Bundle?
        ) 
            super.onFragmentCreated(fm, f, savedInstanceState)
        
        override fun onFragmentStarted(fm: FragmentManager, f: Fragment) 
            super.onFragmentStarted(fm, f)
        
        override fun onFragmentResumed(fm: FragmentManager, f: Fragment) 
            super.onFragmentResumed(fm, f)
        
        override fun onFragmentDestroyed(fm: FragmentManager, f: Fragment) 
            super.onFragmentDestroyed(fm, f)
        
    ,
    true
)

接下来我们看看Pad应用。对于手机应用来说,一般不会存在局部页面跳转的情况,但是Pad上是常规操作。

如图,点击左边列表的单个item,右边需要显示详情,这时候再点左边的其他item,此时的左边页面是保持不动的,但右边的详情页需要跳转对应的页面。使用过Pad的应该经常见到这种页面,比如Pad的系统设置等页面。这时只使用Activty应该是不能实现的,必须配合Fragment,左右分为两个Fragment。

但问题又出现了,这时候点击back怎么区分局部返回和整个页面返回呢?

//整个页面回退,主要是用于当前装载了Fragment的页面回退
_mActivity.pop()
//局部回退,被装载的Fragment之间回退
pop()

如下图,这样的页面我们又应该怎么装载呢?

可以分析,页面最外面是一个Activty,要实现单Activity其内部必装载了一个根Fragment。接着这个根Fragment中使用ViewPage和tablayout完成主页框架。当前tab页要满足右边详情页的单独跳转,还得将右边页面作为主页面,以此装载子Fragment才能实现。

总结

单Activity开发在手机和平板上使用都一样,但在平板上注意的地方更多,尤其是平板一个页面可能是多个页面组成,其局部还能单独跳转的功能,其中涉及到参数回传和栈的回退问题。使用下来,我还是觉得某些页面对硬件要求很高的使用单Activity会出现体验不好的情况,有可能是优化不到位。手机应用我还是使用多Activity方式,平板应用则使用该框架实现单Activity方式。

作者:似曾相识2022
链接:https://juejin.cn/post/7204100079430123557

最后

如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。

如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。


相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。

全套视频资料:

一、面试合集

二、源码解析合集


三、开源框架合集


欢迎大家一键三连支持,若需要文中资料,直接点击文末CSDN官方认证微信卡片免费领取↓↓↓

以上是关于Android:面向单Activity开发的主要内容,如果未能解决你的问题,请参考以下文章

android开发 如何从一个activity中的两个按钮分别跳转到另外两个activity?

android--------实现Activity和Fragment通信的面向对象的万能接口

Android核心组件 Activity组件

activity跳转

Android 透明 Activity 没有覆盖整个屏幕

Android 自定义Activity的Dialog