编者按:本文节选自郭霖著《第一行代码——Android》一书中的部分章节。
活动的最佳实践
你已经掌握了关于活动非常多的知识,不过恐怕离能够完全灵活运用还有一段距离。虽然知识点只有这么多,但运用的技巧却是多种多样的。所以,在这里我准备教你几种关于活动的最佳实践技巧,这些技巧在你以后的开发工作当中将会非常有用。
活动的最佳实践:知晓当前是在哪一个活动
这个技巧将教会你如何根据程序当前的界面就能判断出这是哪一个活动。可能你会觉得挺纳闷的,我自己写的代码怎么会不知道这是哪一个活动呢?很不幸的是,在你真正进入到企业之后,更有可能的是接手一份别人写的代码,因为你刚进公司就正好有一个新项目启动的概率并不高。阅读别人的代码时有一个很头疼的问题,就是当你需要在某个界面上修改一些非常简单的东西时,却半天找不到这个界面对应的活动是哪一个。学会了本节的技巧之后,这对你来说就再也不是难题了。
我们还是在 ActivityTest 项目的基础上修改,首先需要新建一个BaseActivity
类。右击 com.example.activitytest 包→New→Java Class,在弹出的窗口出输入 BaseActivity,如图 1 所示。
图 1 创建BaseActivity
类
注意这里BaseActivity
和普通活动的创建方式并不一样,因为我们不需要让BaseActivity
在 AndroidManifest.xml 中注册,所以选择创建一个普通的 Java 类就可以了。然后让BaseActivity
继承自AppCompatActivity
,并重写onCreate()
方法,如下所示:
我们在onCreate()
方法中获取了当前实例的类名,并通过 Log 打印了出来。
接下来我们需要让BaseActivity
成为 ActivityTest 项目中所有活动的父类。修改 FirstActivity、SecondActivity 和 ThirdActivity 的继承结构,让它们不再继承自AppCompatActivity
,而是继承自BaseActivity
。而由于BaseActivity
又是继承自AppCompatActivity
的,所以项目中所有活动的现有功能并不受影响,它们仍然完全继承了 Activity 中的所有特性。
现在重新运行程序,然后通过点击按钮分别进入到 FirstActivity、SecondActivity 和 ThirdActivity 的界面,这时观察 logcat 中的打印信息,如图 2 所示。
图 2 BaseActivity 中的打印日志
现在每当我们进入到一个活动的界面,该活动的类名就会被打印出来,这样我们就可以时时刻刻知晓当前界面对应的是哪一个活动了。
活动的最佳实践:随时随地退出程序
如果目前你手机的界面还停留在 ThirdActivity,你会发现当前想退出程序是非常不方便的,需要连按 3 次 Back 键才行。按 Home 键只是把程序挂起,并没有退出程序。其实这个问题就足以引起你的思考,如果我们的程序需要一个注销或者退出的功能该怎么办呢?必须要有一个随时随地都能退出程序的方案才行。
其实解决思路也很简单,只需要用一个专门的集合类对所有的活动进行管理就可以了,下面我们就来实现一下。
新建一个ActivityCollector
类作为活动管理器,代码如下所示:
在活动管理器中,我们通过一个 List 来暂存活动,然后提供了一个addActivity()
方法用于向 List 中添加一个活动,提供了一个removeActivity()
方法用于从 List 中移除活动,最后提供了一个finishAll()
方法用于将 List 中存储的活动全部销毁掉。
接下来修改BaseActivity
中的代码,如下所示:
在BaseActivity
的onCreate()
方法中调用了ActivityCollector
的addActivity()
方法,表明将当前正在创建的活动添加到活动管理器里。然后在BaseActivity
中重写onDestroy()
方法,并调用了ActivityCollector
的removeActivity()
方法,表明将一个马上要销毁的活动从活动管理器里移除。
从此以后,不管你想在什么地方退出程序,只需要调用ActivityCollector.finishAll()
方法就可以了。例如在 ThirdActivity 界面想通过点击按钮直接退出程序,只需将代码改成如下所示:
当然你还可以在销毁所有活动的代码后面再加上杀掉当前进程的代码,以保证程序完全退出,杀掉进程的代码如下所示:
其中,killProcess()
方法用于杀掉一个进程,它接收一个进程id
参数,我们可以通过myPid()
方法来获得当前程序的进程id
。需要注意的是,killProcess()
方法只能用于杀掉当前程序的进程,我们不能使用这个方法去杀掉其他程序。
活动的最佳实践:启动活动的最佳写法
启动活动的方法相信你已经非常熟悉了,首先通过 Intent 构建出当前的“意图”,然后调用startActivity()
或startActivityForResult()
方法将活动启动起来,如果有数据需要从一个活动传递到另一个活动,也可以借助 Intent 来完成。
假设 SecondActivity 中需要用到两个非常重要的字符串参数,在启动 SecondActivity 的时候必须要传递过来,那么我们很容易会写出如下代码:
这样写是完全正确的,不管是从语法上还是规范上,只是在真正的项目开发中经常会有对接的问题出现。比如 SecondActivity 并不是由你开发的,但现在你负责的部分需要有启动 SecondActivity 这个功能,而你却不清楚启动这个活动需要传递哪些数据。这时无非就有两种办法,一个是你自己去阅读 SecondActivity 中的代码,二是询问负责编写 SecondActivity 的同事。你会不会觉得很麻烦呢?其实只需要换一种写法,就可以轻松解决掉上面的窘境。
修改 SecondActivity 中的代码,如下所示:
我们在 SecondActivity 中添加了一个actionStart()
方法,在这个方法中完成了 Intent 的构建,另外所有 SecondActivity 中需要的数据都是通过actionStart()
方法的参数传递过来的,然后把它们存储到 Intent 中,最后调用startActivity()
方法启动 SecondActivity。
这样写的好处在哪里呢?最重要的一点就是一目了然,SecondActivity 所需要的数据在方法参数中全部体现出来了,这样即使不用阅读 SecondActivity 中的代码,不去询问负责编写 SecondActivity 的同事,你也可以非常清晰地知道启动 SecondActivity 需要传递哪些数据。另外,这样写还简化了启动活动的代码,现在只需要一行代码就可以启动 SecondActivity,如下所示:
养成一个良好的习惯,给你编写的每个活动都添加类似的启动方法,这样不仅可以让启动活动变得非常简单,还可以节省不少你同事过来询问你的时间。
图书简介:https://www.ituring.com.cn/book/1841
相关阅读:
第一行代码——Android(一):前行必备,如何使用日志工具
评论