Activity相关知识 | 青训营笔记
这是我参与「第四届青训营 」笔记创作活动的第5天
一、本堂课重点内容
在本堂课中,主要介绍了Android客户端的基础知识,包括Android基础组件和Android通信组件。
二、详细知识点介绍与实践练习例子
在本次笔记中主要结合Android Stdio介绍Activity的使用和相关内容,是对上一篇笔记客户端基础知识必备的补充和进一步学习。
1.Activity切换
重建一个empty Activity,在本次中除了要勾选上一个backwards选项外还要勾选generate选项。 Intent是Android程序中各组件之间进行交互的一种重要方式,可以指明当前组件想要执行的动作。还可以在不同组件之间传递数据。可用于启动Activity,Service以及发送广播等场景。 可分为显式Intent和隐式Intent。
显式Intent
修改FirstActivity中的事件
button1.setOnClickListener{
val intent=Intent(this,SecondActivity::class.java)//第一个参数Context要求提供一个启动Activity的上下文,这个this也就是FirstActivity。第二个参数用于指定要启动的目标Activity
startActivity(intent)//来执行这个Intent
}
隐式Intent
并不明确的指出要启动哪一个Activity,而是指定了一些列更为抽象的action和category等信息,然后交由系统去分析这个Intent,并找出可以响应这个Intent的Activity。 如何设置响应? 在标签下设置的内容,指定可以响应的action和category。只有action和category同时匹配时才能够相应相应的Intent。
<activity android:name=".SecondActivity" >
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />//DEFAULT表示默认的category
<category android:name="com.example.activitytest.MY_CATEGORY"/>
</intent-filter>
</activity>
每个intent只能指定一个action,但是可以指定多个category。在firstactivity中
button1.setOnClickListener {
val intent = Intent("com.example.activitytest.ACTION_START")//指定action,此时用的是默认的category
intent.addCategory("com.example.activitytest.MY_CATEGORY")//增加category
startActivity(intent)
}
隐式Intent的其他用法 隐式Intent不仅可以启动自己程序内的Activity,还可以启动其他程序的Activity(便于多个程序之间的功能共享) 修改FirstActivity中的按钮点击代码
button1.setOnClickListener {
val intent = Intent(Intent.ACTION_VIEW)
intent.data = Uri.parse("https://www.baidu.com")
startActivity(intent)
}
- 启动其他程序
- 向下一个Activity传递数据
- 向上一个Activity传递数据
2.Activity的生命周期
Android通过任务来管理Activity。一个任务就是一组存放在栈中的Activity集合,这个栈也被称为返回栈。 Activity的四种状态:
- 运行态:处于栈顶,系统回收意愿:极低
- 暂停态:不在栈顶,但依然可见(某些不占据整个屏幕的Activity),是完全存活着的。低
- 停止态:不在栈顶,且不可见。但系统会保存着某些数据。可能会被回收
- 销毁态:栈中移除。高(保证手机内存充足)。
七个方法:

- 1.点击一个图标,开始onCreate(此时不可见,不可交互)
- 2.onStart,此时可见不可交互
- 3.onResume,此时可以交互了
- 4.onPause,出现一个小一点的界面,这个界面没有被完全遮挡。此时可见不可交互
- 5.onStop,出现一个新界面,原来的界面不可见了。
- 6.onResume,关闭小一点的界面,原来界面回复可交互
- 7.onStart,关闭新界面,原来的界面恢复可见
- 8.onDestory,关闭当前界面,关闭Activity。 如果界面处于不可见的状态下是可能被回收的,此时back的话,不是启用onStart,而是onCreate重建,但是直接这样做会导致数据丢失。因此我们可以使用onSaveInstanceState()方法保存数据,对MainActivity中的Bundle进行检查
3.Activity的启动模式
一共有四种:,分别是standard、singleTop、 singleTask和singleInstance,可以在AndroidManifest.xml中通过给标签指定android:launchMode属性来选择启动模式。
1.standard
该模式下,每启动一个Activity,就会放入栈中,位于栈顶。但并不在乎栈中是否已经存在该Activity。 例:一个Activity已经位于栈顶了,再次启动的时候还会新建立一个新的Activity。
2.singleTop
该模式下,如果启动一个Activity时,会先检查栈顶是否已经存在,如果存在,则不会创建新的实例。但如果没有处在栈顶,再次点击还是会创建新的实例。
3.singleTask
当Activity的启动模式指定为singleTask,每次启动该Activity时,系统首先会在返回栈中检查是否存在该Activity的实例,如果发现已经存在则直接使用该实例,并把在这个Activity之上的所有其他Activity统统出栈,如果没有发现就会创建一个新的Activity实例。 缺点:如果发现需要启动的Activity位于栈中的话,如果尝试启动该Activity的话,会导致栈中该Activity中上边的Activity全部出栈销毁。
4.singleInstance
指定为singleInstance模式的Activity会启用一个新的返回栈来管理这个Activity。 引入理由:每个应用程序都有自己的返回栈。同一Activity在不同的返回栈中入栈时,会创建新的实例。这也就存在共享Activity实例的问题。 特点:会为声明为该模式的Activity设置一个单独的返回栈来管理。
4.实践技巧
1.知道当前界面对应的Activity
- 1.创建一个普通的Kotlin类baseActivity,继承自AppCompatActivity,设置为open。并重写onCreate()方法。加入日志打印功能。使用javaClass来获取当前实例的Class对象。
- 2.更改其他所有的Activity,让他们继承自上边baceActivity。
- 3.运行程序,点击按钮进入不同的界面,就可以知道当前界面 对应的Activity了。
2.一键退出程序
- 1.新建一个单例类ActivityCollector(用于避免构建重复的对象,比如希望全局最多只有一个实例),使用ArrayList()对所有的Activity进行管理。
- 2.重写一下各种方法,尤其是finishAll():对当前Activity判断是否正在销毁后进行销毁。
- 3.在baseActivity的onCreate()方法中对新建立的Activity添加到ArratyList中。重写onDestory()方法,对于要销毁的Activity在链表中移去。
- 4.在需要一键退出的地方,调用finishAll()函数。也可以再加上杀掉当前进程的代码,确保完全退出。killProcess()方法只能用于杀掉当前程序的进程,不能用于杀掉其他程序。
3.启动Activity
对于不知道需要传递多少参数的时候。我们建立一个companion boject{}的语法结构。(在这种结构中的方法都可以使用类似于java静态方法的形式调用)。对于该Activity所需要的所有参数都通过一个actionStart()的方法传递过来。这样就可以非常清晰的知道启动该Activity需要传递哪些数据。
三、课后个人总结
Activity只是Android最开始的基础部分,本次对于上次的基础的Activity有了进一步的学习。
四、引用参考
本篇文章主要参考了青训营课程客户端基础知识必备和书籍《第一行代码》