客户端基础知识-Activity
2022年8月11日,13日-
Android基础组件
1.Activity
Activity是一种可以包含用户界面的组件,主要用于和用户进行交互。一个应用程序可以包含0个或多个Activity。
1.基本用法
创建:
- 从创建项目开始,这次不选择Empty Activity选项,选择“Add No Activity”。
- 项目模式手动改为Project模式
- 在app/src/main/java/com.example.activitytest目录下新建Activity选择Empty Activity,在弹出的对话框中只选择Backwards···
- 创建和加载布局
- 在AndroidMainifest文件中注册,所有Activity都需要在这个文件中注册才能生效。Activity的注册声明要放在< application >标签内。
- 为程序配置主Activity
任何Activity都需要重写onCreate()方法
Toast
Toast是一种提醒方式,也就是弹窗
使用方法
override fun onCreate(saveInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.first_layout)
val button1:Button=findViewById(R.id.button1)
button1.setOnclickListener{
Toast.makeTest(this,"this is a text",Toast.LENGTH_SHORT).show()
}//第一个参数是Context,表示要求的上下文,Activity本身就是,故可以传入this。第二个是text,第三个是显示时长,可以选择SHORT和LONG。
}
findViewById():获取布局文件中定义的元素,返回的是一个继承自View的泛型对象,但无法确认是什么对象,因此在上边声明为了Button
R.id.button1:得到按钮的实例
setOnclickListener():设置按钮功能
ps:
在Kotlin中引入了一个差距,会根据布局文件中的id自动生成一个相同名称的变量,可以在Activity中直接调用,故上述中的button1的定位可以不用写了,但要使用代码补全,因为自动生成要导包。
Menu
创建菜单
通过android:id给菜单项指定唯一一个标识符
通过android:title给菜单项指定一个名称
回到FirstActivity重写onCreateOptionsMenu()方法,可以使用Ctrl+O快捷键
然后关联指定动作,使用item.itemId来判断点击的是哪一个菜单项。
销毁
只需要按一下Back就可以销毁当前的Activity,或者在按钮关联动作中调用finish()函数。
2.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传递数据
3.Activity的生命周期
Android通过任务来管理Activity。一个任务就是一组存放在栈中的Activity集合,这个栈也被称为返回栈。
Activity的四种状态:
- 运行态:处于栈顶,系统回收意愿:极低
- 暂停态:不在栈顶,但依然可见(某些不占据整个屏幕的Activity),是完全存活着的。低
- 停止态:不在栈顶,且不可见。但系统会保存着某些数据。可能会被回收
- 销毁态:栈中移除。高(保证手机内存充足)。
七个方法:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NxhEmL81-1660474792244)(images/2022-08-13-10-12-15.png)] - 1.点击一个图标,开始onCreate(此时不可见,不可交互)
- 2.onStart,此时可见不可交互
- 3.onResume,此时可以交互了
- 4.onPause,出现一个小一点的界面,这个界面没有被完全遮挡。此时可见不可交互
- 5.onStop,出现一个新界面,原来的界面不可见了。
- 6.onResume,关闭小一点的界面,原来界面回复可交互
- 7.onStart,关闭新界面,原来的界面恢复可见
- 8.onDestory,关闭当前界面,关闭Activity。
如果界面处于不可见的状态下是可能被回收的,此时back的话,不是启用onStart,而是onCreate重建,但是直接这样做会导致数据丢失。因此我们可以使用onSaveInstanceState()方法保存数据,对MainActivity中的Bundle进行检查
4.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设置一个单独的返回栈来管理。
5.实践技巧
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
Activity在链表中移去。
- 4.在需要一键退出的地方,调用finishAll()函数。也可以再加上杀掉当前进程的代码,确保完全退出。killProcess()方法只能用于杀掉当前程序的进程,不能用于杀掉其他程序。
3.启动Activity
对于不知道需要传递多少参数的时候。我们建立一个companion boject{}的语法结构。(在这种结构中的方法都可以使用类似于java静态方法的形式调用)。对于该Activity所需要的所有参数都通过一个actionStart()的方法传递过来。这样就可以非常清晰的知道启动该Activity需要传递哪些数据。