activity 启动模式_Andorid四大组件—Activity篇

v2-e1baff8e8524768136a858db15c857a9_1440w.jpg?source=172ae18b

Activity简介

v2-cf3f286fca44866dc2da313d34bc2eaa_b.jpg
android四大组件

Activity是Android的四大组件之一,同时它也是Android应用中最常见的组件之一。一个应用通常会有多个Activity,它主要负责与用户进行交互,并向用户呈现出应用此时的状态,不同的Activiy呈现给用户不同的操作体验。其实每当我们打开一个Android的app,我们都会接触到它。他其实就相当于一个屏幕,上面承载着我们所能看到和接触到的不同的组件。

Activity创建三步曲

那么我们如何在项目中创建Activity呢? 其实每当我们新建一个项目的时候,ide都会帮我们创建一个MainActivity,如果我们还想创建新的Activity,最简单的方式就是通过ide直接new一个Activity。但还是得了解Activity具体的创建过程。

手动创建分为三步 :

第一步就是新建一个类继承于Activity或者其子类 ;

第二步就是在AndroidMainifest进行声明注册,(四大组件的使用都需要在清单文件中进行配置。)只需要在<application></application>中添加<activity../>子元素即可配置。下图是创建项目时帮我们注册好的MainActivity的配置以及我现在新建的DemoActivity的配置。

v2-d1f974fb29a98d8a6c5b6f008e7e64b9_b.jpg
绿框为创建项目时已创建好的MainActivity的配置,蓝框是我自己创建的DemoActivity的配置

在配置过程中我们可能会经常接触到的一些属性:

name: 该Activity的类名 label: 该Activity的标签,相当于标题,也就是当你打开应用时,该Activity上方的ActionBar显示的标题就是通过这个设置的 icon: 该Activiy对应的图标 exported: 指定该Activity是否允许被其它的应用调用 launchMode: 指定Activity的启动模式,下边会讲
至于<intent-filter…/>其实就是一个过滤器。一种根据某一个intent当中action、data以及category等属性,对适合接收这个intent组件进行匹配和筛选的机制,主要用于使用隐式intent来启动activity的时候。 在上图中的MainActivty里面的categoy标签中LAUNTCHER其实就是将该Activiy置为打开应用时最先启动的界面。也就是我们打开此app时最先看到的就页面。

第三步就是创建layout并在该类中的onCreate通过setContentView设置

v2-519860f10827297a7bc4b6eb3dbebda0_b.jpg

这样子就创建好一个Activity了,当然实际开发如果你不习惯这样也可以直接通过file来new一个Activity,这样配置和layout都会帮你弄好。但是具体创建过程还是要了解的。

Activity生命周期

当Activity被部署在应用当中后,在应用程序的运行过程中,Activity会不断在不同的状态中进行切换,在切换的过程中其实就是在对Activty中特定的方法进行回调。而这些特定的方法其实就是Activity的生命周期中不同的状态。熟悉Activity生命周期是很有必要的,只有熟悉其生命周期,你才能游刃有余的在不同状态中进行不同的操作,让用户体验感更好。

v2-d98e929e515ae4a8edd0f3c7a7be8a9b_b.jpg
Activity的生命周期

上图我们可以看到Actvity类中定义了七个回调方法:

onCreate : onCreate在整个生命周期只会调用一次,也就是开始启动的时候,第一次创建的时候进行调用。只有执行了onDestroy再打开这个Activity才会再次调用onCreate。一般在此阶段我们通常会进行一些初始化的操作,像设置layo文件或者对控件进行绑定等等; onStart : 此时用户已经可以看到界面了,但界面此时并没焦点,用户还不能进行操作; 此方法是在Activity由不可见变为可见时调用; onResume : 此时Activity有焦点,用户可以开始进行操作。此方法是在和用户进行交互时调用; onPause : 此时界面还是可见的,但又再次失去了焦点。 此方法在准备去启动或者恢复另一个Activity时调用; onStop : 此时原来的Activity已经看不见了,进入到了后台。此方法是在原来的Activity完全不可见时调用的; onRestart : 当用户再次启动原来的Activity,是之进入前台时调用; onDestroy : 此时Activity被销毁。该方法在Activity被销毁之前调用;比如说我们在退出应用或者进行屏幕翻转时都会调用此状态;

上面七种方法是不需要我们去自己实现的,它是在Activity进入到相应状态时自动进行回调。而我们只需要通过重写相应的方法在相应的状态中进行你想要的操作即可。下面我们通过几张图片来更加清晰的认识Activity生命周期。

v2-80bd3097ba3ed992abfca54b76741e27_b.jpg

上图中我在MainActivity中重写七个方法(下面还有个onRestart的没有截图到)并在执行到不同状态时打出相应的log。此时我启动应用,我们可以来看下日志。

v2-9e581e8368f054d23b4604b4be0d0102_b.jpg

我们可以看到,当我们启动应用时,会调用onCreateonStartonResume。也就是MainActivity经过了创建-->可见-->可用这三个过程。此时当我们点击Demo按钮(我设置一个跳转界面的点击事件)此时会跳转到一个新的Activity。

v2-32d3e5adfb36b8c3accfd88d79c65108_b.jpg

通过上图可以看到,当从MainActivity跳转到一个另一个Activity后,MainActivity会调用onPauseonStop。但并不会调用onDestroy,因为此时MainActivity此时还并没有被销毁。接下来我们点击返回键,返回到MainActivity中。

v2-07fa4a4f4e72933bc24bca210ec41eeb_b.jpg

当我们返回到MainActivity后,此时MainActivity会调用onRestartonStartonResume。此时我们我们再点击返回键退出该应用。

v2-1eef1f97aa173b0f7b8c2cadb3c5e2aa_b.jpg

这时我们已经退出了应用,MainActivity也随之销毁了。

==熟悉生命周期,可以在特定的状态中进行操作== 例如:假如我们现在做一个社交app,我希望在发信息的时候,若输完后没发出去,那么就是一条草稿,假如现在我不小心退出应用(这里指的是按返回键退出--onDestroy),那么再进入时此草稿还存在。这个操作其实就可以通过在Destroy中先进行数据的保存,然后在onCreate的时候取回数据。

Activity启动模式

在上面讲创建Activity时,第二步在清单文件进行配置时,里面有一个launchMode的属性,这个属性就是用来配置该、对应Activity的启动模式。在项目中我们应该根据特定的需求为不同的Activity设置恰当的启动模式。

启动模式一共有四种:

standard : 标准模式,也是默认的加载模式。
singleTop : Task栈顶单例模式
singleTask : Task内单例模式
singleInstance : 全局单例模式

任务栈(Task Stack):其实就是一个栈,里面放着Activity,正在使用的Activity放在栈顶,当返回时,就出栈。

接下来来对上面的四种启动模式进行详细讲解:

standard 标准模式 ; 如果不进行配置,默认都是该模式。在该模式下,当启动一个新的Activity时,这个新的Activity就会进入到栈顶,当点击返回键时,这个Activity就会出栈,其实就相当于典型的出入栈操作。在这个模式下,如果我们多次打开同一个Activity,那么这个Activity也会多次入栈,也就是会重复入栈。 例如 : 我现在将刚刚上面的图中的demo按钮的事件设成跳转到当前界面 : startActivity(new Intent(MainActivity.this,MainActivity.class)); 那么此时当我连续点击四次按钮之后,那么其实此时就会有五个MainActivity在栈中,需要点击五次返回键才能退出该应用。 singleTop 栈顶单例模式 ; 通过名字我们就大致可以看出,这是用来防止栈顶进行重复创建。在这个模式下,若要启动的Activity已经在栈顶,则直接使用栈顶的该Activity,而不会像标准模式那样去重复创建。当然如果要启动的Activity并不位于栈顶的话,那么此Activity就会进入到栈顶。 singleTask 栈内单例模式 ; 通过名字其实我们也可以看出,这个模式是用来防止在栈内中创建重复的Activity。在singleTop中我们可以防止栈顶的重复创建,但是在栈中还是允许有重复的Activity。而如果将启动模式设置成singleTask之后,这时就不允许栈中有重复的Activity了。 例如 : 假入现在我们将Activity1设置成了singleTask启动模式,那么就会有三种情况; 第一种就是此时栈中没有Activity1,那么它就会进入到栈顶; 第二种就是当栈顶就是Activity1时,此时就和singleTop是一样的,会直接使用栈顶的Activity1; * 第三种就是当栈里有这个Activity1,但它并不位于栈顶,此时也不会创建,而是把Activity1以上的Activity,全部出栈,直到Activity1在顶部。 singleInstance 全局单例模式 ; 这个模式和上面三种比起来它是最特别也是逼格最高的,上面三种模式都是在同一个任务栈中进行的,而这个模式它会启动一个新的任务栈。将一个Activity指定为singleInstance模式,那么当你启动这个Activiy时会使用一个新的任务栈来管理它。 例如 : 我现在创建了一个启动模式设置为singleInstance的Activity2,跳转到这个Activity2时, ①如果是第一次跳转,那么会创建一个独立栈,并将这个独立栈提前 ②如果不是第一次,那么就直接将第一次创建的独立栈提前
返回的时候, ①如果独立栈在前,那么先将独立栈里的Activity出栈。②如果独立栈在后,先把前面的那个任务栈(就是设置了上面三种启动模式的Activity任务栈)里的所有已创建的Activity出栈,再去到独立栈里的将独立栈里的Activity出栈。

其实关于Activity还有一块非常重要的也是非常常用的知识点就是不同Activity之间的跳转和数据传递。但因为关系到Intent的知识,所以就放到下次和Intent一起写吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Android 中,如果一个 Activity 要向另一个 Activity 返回数据,则可以使用 startActivityForResult 方法启动另一个 Activity。然后在另一个 Activity 中设置 setResult 方法并 finish() 结束该 Activity。 在第一个 Activity 中,可以通过 onActivityResult 方法获取返回的数据。在此方法中,您可以检查请求代码(requestCode)以确定哪个 Activity 返回数据,并检查结果代码(resultCode)以确定操作是否成功。然后,您可以使用获取的数据执行任何必要的操作。 如果您有多个 Activity 需要返回数据,则可以使用不同的请求代码来标识每个 Activity,以便在 onActivityResult 方法中分别处理每个 Activity 的返回数据。 以下是一个示例: 在第一个 Activity启动另一个 Activity: ```java Intent intent = new Intent(this, SecondActivity.class); startActivityForResult(intent, REQUEST_CODE_SECOND_ACTIVITY); ``` 在第二个 Activity 中设置返回数据并结束 Activity: ```java Intent intent = new Intent(); intent.putExtra("data", "Hello from SecondActivity"); setResult(Activity.RESULT_OK, intent); finish(); ``` 在第一个 Activity 中实现 onActivityResult 方法以处理返回的数据: ```java @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_SECOND_ACTIVITY && resultCode == Activity.RESULT_OK) { String returnedData = data.getStringExtra("data"); Toast.makeText(this, returnedData, Toast.LENGTH_SHORT).show(); } } ``` 在此示例中,使用 REQUEST_CODE_SECOND_ACTIVITY 标识了第二个 Activity。在 onActivityResult 方法中,检查 requestCode 是否等于 REQUEST_CODE_SECOND_ACTIVITY 并检查 resultCode 是否等于 Activity.RESULT_OK(表示操作成功)。然后,使用 data 参数获取返回的数据,并执行必要的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值