文章目录
- 碎碎念部分
- activity是什么
- 创建一个新的activity
- 在活动中使用Toast
- 在活动中使用Menu
- 使用Intent在活动之间穿梭(转换界面)
- 显式使用Intent
- 隐式使用Intent
- 更多用法尽在掌握
- 向下一个活动传递数据
- 活动的生命周期
- 活动状态
- 活动的生存期(7个回调方法,3种生存期)
- 在活动被回收之前抢救数据
- 活动的启动模式
碎碎念部分
长达一个学期的摆烂之后,终于下定决心把碎碎念博客继续规律更新啦,从c语言直接快进到android,跳过Java这个磨人的玩意!!
规律更新博客也希望对暑假还在挣扎学习的自己起到一点点督促的作用吧
新的征程开始咯!
activity是什么
在讲活动之前呢,要先提一嘴Android的四大组件——
活动(Activity)、服务(Service)、广播接收器(Breadcast Receiver)和内容提供器(Content Provider)。这篇博客就先讲讲活动,剩下三个组件且看下回分解~
那么活动究竟是什么东西呢,在我看来活动就是界面或者说是用来放组件的载体,一个空白的活动就是一个没有东西的界面,而我们要做的就是往这个空白的界面里塞东西(组件),来让界面变得更好看、更实用。
创建一个新的activity
- 懒人方法:右键→new→Activity→选择想要的活动类型→设置活动名等属性→finish
- 手动创建活动:新建一个类→让这个类继承
AppCompatActivity
(不继承就是普通的类,不是活动哦)→重写onCreate()
方法→在layout文件夹里面为这个活动新建一个布局文件→在onCreate()
方法中引入新建的布局→在清单里面注册(所有组件都要在清单里面注册)→活动基本创建完成
手动创建的流程大概是这样,因为常用创建方式是第一种,这里对手动创建的细节就不做过多阐述了
在活动中使用Toast
- Toast是一种提醒方式,会在一段时间后自动消失并且不占任何屏幕空间(就是平常使用手机的时候,屏幕偏下方会弹出的灰色框)
- Toast的触发一般和按钮的点击事件结合在一起(把代码写在按钮的
onClick()
方法中),比如这样👇
(小小提一句,这一段是在对应活动的onCreate()
方法中放着的) - 解释一下这行关键代码:通过静态方法
makeTaxt
创建一个Toast对象,然后调用show()
将Toast显示出来就完成了
这里makeText方法需要传三个参数。第一个是Context,也就是Toast要求的上下文。(由于活动本身就是一个context对象,所以直接传活动.this;第二个参数是Toast显示文本的内容,第三个参数是Toast显示的时长(有Toast.LENGTH_SHORT
和Toast.LENGTH_LONG
两个内置常量可选)
在活动中使用Menu
Menu其实就是把菜单隐藏起来做展示的一种方法,实现起来有点类似微信主页面右上角那个“+”号的效果:既能展示菜单又不占用屏幕空间。
创建过程如下👇
- 先在res目录下新建一个menu文件夹,再在这个文件夹下再新建一个名叫main的菜单文件
- 然后在main.xml里面创建两个菜单项:
- 接着重新回到对应活动中来重写
onCreateOptionsMenu()
方法(快捷键Ctrl+O)
通过getMenuInflater()
方法能够得到MenuInflater对象,再调用它的inflate()
方法就可以给当前活动创建菜单了。
inflate方法接收两个参数,第一个参数用于指定我们通过哪一个资源文件来创建菜单(这里肯定传入R.main.menu)第二个参数用于指定我们的菜单项;第二个参数用于指定我们的菜单项将添加到哪一个Menu对象中(这里直接使用了传入的参数menu)。然后给这个方法返回true,表示允许创建的菜单显示出来,若是返回false,则菜单无法显示。
- 定义菜单响应事件(在对应活动中重写
onOptionsItemSelected()
方法)
调用item.getItemId()
来判断点击的是哪一个菜单,给菜单项加入自己的逻辑处理(例如这里的Toast,点击菜单之后就会出现灰框提醒)
使用Intent在活动之间穿梭(转换界面)
Intent一般用于android中各组件之间的交互,不仅指明当前组件想要执行的动作,还可以在不同组件之间传递数据。
• Intent有多个函数的重载,其中一个是Intent(Context packageContext, Class<?>cls)
,这个构造函数接收两个参数,第一个参数Context要求提供一个启动活动的上下文,第二个参数Class则是指定想要启动的目标活动,通过这个构造函数就可以构建出Intent的意图
- Intent一般分为显式Intent和隐式Intent两种使用方法,下文会分别介绍
显式使用Intent
修改某按钮的点击事件为👇(点击跳转另一个界面)
构建一个Intent,传入MainActivity.this
作为上下文,传入MainActivity2.class
作为目标活动,意图为在MainActivity
的基础上打开MainActivity2
这个活动
然后通过startActivity()
方法来执行这个Intent
隐式使用Intent
- 通过在
<activity>
标签下配置<intent-filter>
内容,指定当前活动能够响应的action和category - ❗只有
<action>
和<category>
中的内容能够同时匹配上指定的action和category时,这个活动才能响应该Intent - 然后再把MainActivity的点击事件改成👇
- · 隐式和显式的区别就是用的不是同一个构造方法,上面设置的category这个内容是默认的,会在
startActivity()
被调用的时候自动将这个category添加到Intent中,所以上面只传了一个action进去
每个Intent中只能指定一个action,但却能指定多个category(使用addCategory()
添加),当然了在匹配时这些category也要一一对应,活动和Intent才能响应
更多用法尽在掌握
隐式Intent不仅可以启动自己程序内的活动,还可以启动其他程序的活动比如调用系统的浏览器来打开一个网页:
- 将点击事件设置为👇
- 指定了Intent的action是
Intent.ACTION_VIEW
(这是一个Android系统内置的动作);然后通过Uri.parse()
方法,将一个网址字符串解析成一个Uri对象,再调用Intent的setData()
方法将这个Uri对象传进去
这样点击这个按钮就会打开网址对应的网页啦
向下一个活动传递数据
这个操作的主要思路就是:通过putExtra()
方法的重载,将想要传递的数据暂存在Intent中,启动另一个活动后再把这些数据从Intent中取出就可以了
- 将数据暂存到第一个活动Intent中:
- 使用显示的方式启动MainActivity2,并通过
putExtra()
方法传递一个字符串
这里putExtra()
接收两个参数,第一个参数是键用于后面从Intent中取值,第二个参数才是真正要传递的数据 - 在第二个活动中把数据取出来:
- 首先使用
getIntent()
方法取到用于启动MainActivity2的Intent,然后调用getXxxExtra()
方法来获取传递的数据(这里的Xxx根据数据类型灵活调整)
活动的生命周期
Android中的活动是可以层叠的,每启动一个新的活动就会覆盖在原活动之上,然后点击Back键会销毁最上面的活动,下面的活动就会重新显示。联想一下很容易发现:这个操作有点类似数据出入栈。
而事实上Android是用Task来管理活动的,一个Task就是一组存放在栈里的活动的集合,这个栈也被称作返回栈,系统总是会显示处于栈顶的活动给用户。
活动状态
一个活动的生命周期最多会有四种状态:运行状态、暂停状态、停止状态和销毁状态。
活动的生存期(7个回调方法,3种生存期)
- Activity类中定义了7个回调方法:
○ onCreate() :会在活动第一次被创建的时候调用,一般在这里完成活动的初始化操作(加载布局、绑定事件等)
○ onStart():这个方法在活动由可见变为不可见的时候调用
○ onResume():这个方法在活动准备好和用户进行交互的时候调用。此时活动一定位于返回栈栈顶并处于运行状态
○ onPause():这个方法在系统准备去启动或者恢复另一个活动的时候调用
○ onStop():这个方法在活动完全不可见的时候调用
○ onDestroy():在活动被销毁之前调用,调用之后活动状态将变为销毁状态
○ onRestart():在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了 - 除了onRestart()之外,其他都是两两相对的,把活动分成了三种生存期:
○ 完整生存期:在onCreate()
方法和onDestory()
方法之间所经历的就是完整生存期。一般情况下,一个活动会在onCreate方法中完成各种初始化操作,在onDestroy()方法中完成释放内存的操作
○ 可见生存期:在onStart()
方法和onStop()
方法之间所经历的,就是可见生存期。我们一般通过这两个方法合理地管理那些对用户可见的资源。
○ 前台生存期:在onResume()
方法和onPause()
方法之间所经历的就是前台生存期。前台生存期内活动总是处于运行状态的,此时的活动是可以与用户进行交互的
在活动被回收之前抢救数据
为了防止上一个活动被内存不够的系统回收导致数据丢失,这里有一些抢救措施可以使用。其主要逻辑就是先把数据存在一个地方,安全了再取出来:
- 保存数据:Activity提供了一个
onSaveInstanceState()
回调方法,这个方法可以保证在活动被回收之前一定会被调用,所以我们在这个方法里面操作保存数据。onSaveInstanceState()
方法携带一个Bundle类型的参数,提供了putXxx()的方法(Xxx由数据类型决定)这个方法需要传入两个参数,第一个参数是键,用于后面从Bundle中取值,第二个参数是真正要保存的内容 - 提取数据:在安全的活动的
onCreat()
方法中用相应的方法取出数据
活动的启动模式
在Android 12中,启动模式已经从4种升级到了5种,分别是:standard
、singleTop
、singleTask
、singleInstance
和singleInstancePerTask
五种启动模式👇
- standard:无论这个活动是否在返回栈中出现,每次启动都会创建该活动的一个新的实例(在不进行显示指定的情况下,所有Activity都会自动使用这种模式)
- singleTop:如若发现返回栈的栈顶已经是该活动,则直接使用,不会再创造新的活动实例
- singleTask:若活动已在栈中,挪到栈顶直接使用并将这个活动之上的活动全部出栈,没有就建一个新的实例(但是若没有显示指定taskAffinity,则一般不会开新栈,只是新建一个实例)
- singleInstance:使用这种模式的活动会被一个单独的返回栈管理,其他应用来访问这个活动都会共用这个返回栈
- singleInstancePerTask:若活动不在栈中,会为该活动创建一个新的栈;若活动在栈中,则与singleTask一样会把这个活动之上的活动全部出栈,自己到栈顶
❗可以在AndroidManifest.xml中通过给<activity>
标签指定android:launchMode
属性来选择启动模式