这几天继续回顾了一些Android基础方面的知识,今天跟大家一起回顾下Android四大组件中的Activity。虽然很基础,但工欲善其事,必先利其器。我们只有打好夯实的基础,才能在技术开发这条道路上越走越远、越走越好。
1. Activity的定义、创建和销毁
学习Activity我们首先应该知道何为Activity?如何在我们在工程中创建一个Activity?以及如何销毁一个Activity?
1.1 Activity的定义
An Activity is an application component that provides a screen with which users can interact in order to do something, such as dial the phone, take a photo, send an email, or view a map. Each activity is given a window in which to draw its user interface. The window typically fills the screen,but may be smaller than the screen and float on top of other windows.
这是Google原生的解释,这里我就不翻译了,相信大家都能看懂。
1.2 Activity的创建步骤:
1. 自定义FirstActivity 继承 Activity
2. 覆写onCreate方法
3. 在onCreate方法中调用setContentView()方法
4. 给setContentView()传入布局文件(每个Activity都应有个布局文件)
5. 在AndroidManifest.xml中注册该Activity
当然如果用Android Studio创建Activity时,可以选择自动帮我们生成布局文件和在AndroidManifest进行注册。
1.3 Activity的销毁
1. 点击back按键
2. 通过代码销毁:finish()
2. Android中各组件间交互的桥梁——Intent
Intent是Android中四大组件进行交互的一种重要方式,不仅可以指明想要执行的动作,还可以进行数据的传递。Intent一般用于启动活动、启动服务和发送广播等。Intent一般分为显式Intent和隐式Intent。
2.1 使用显式Intent实现Activity之间的跳转:
1. 适用的场景:同一个app中不同Activity之间的跳转。
Intent intent = new Intent(MainActivity.this,FirstActivity.class);
startActivity(intent);
2. 跳转时携带数据(在MainActivity中给Intent绑定数据)
intent.putExtra("name", "zhangsan");
intent.putExtra("age", 18);
3. 在FirstActivity中获取Intent上的数据
/**
* 1.获取MainActivity发送过来的Intent
* 2. 从Intent上获取绑定的数据
*/
Intent intent = getIntent();
String name = intent.getStringExtra("name");
int age = intent.getIntExtra("age", 0);
2.2 使用隐式Intent实现Activity之间的跳转:
1. 适用的场景:不同App之间不同Activity之间的跳转。
2. 匹配规则
1. 如果目标Activity有多个intent-filter,则只有匹配上一个意图就可以启动
2. intent-filter中的action category data标签,必须严格的跟Inentent上的参数匹配,才能启动这个Activity,其中如果category是DEFAULT,那么可以不用匹配这个参数。
3. 每个Intent中只能有一个action,可以有多个category和data
4. 如果intent-filter中有多个category标签,只需要让我们的Intent随便匹配一个即可
5. 如果intent-filter中有多个data标签,只需要让我们的Intent随便匹配一个即可
2.3 Intent可以携带的数据类型有哪些
1. 八种基本数据类型以及数组形式
2. 字符串类型以及数组形式
3. 实现了序列化接口的对象(Serializable和Parcelable)
3. Activity中数据传递和返回数据
1: 启动另一个Activity需要返回结果时的启动方式是:
Intent intent = new Intent(this, SecondActivity.class);
//参数1:是Intent,参数2:请求码
startActivityForResult(intent, 1);
2:使用startActivityForResult(intent, requestCode)启动另外一个Activity时,需要接受返回的值,那么就需要在当前Activity中重写onActivityResult()方法:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
3:在另一个Activity中返回数据给另一个Activity时,需要调用setResult(RESULT_OK, data)方法:
Intent data = new Intent();
data.putExtra("contents", value);
setResult(RESULT_OK, data);
4:Activity的生命周期
每个应用一般都包含很多个Activity,在不同的阶段Activity会呈现不同的状态。很好的掌握Activity的生命周期对每个Android开发者来说都是必备技能。
4.1 Activity的管理机制
通过前面的学习我们会发现Android中的Activity是可以层叠的,那么这就需要一种机制来对这些Activity进行管理。Android中是使用任务来管理的,一个任务就是一组存放在栈里的Activity的集合,这个栈也称作为返回栈。栈是一种先进后出的数据结构。每当新建一个Activity,它就会进入返回栈,并处于栈顶位置。每当按下Back键或调用finish()时,处于栈顶的Activity就会弹栈,这时前一个入栈的Activity就会处于栈顶的位置。系统总是会显示处于栈顶的活动给用户。
4.2 Activity的活动状态
每个Activity在生命周期中最多可能会有四种状态
1.运行状态
当一个Activity处于返回栈的栈顶时,此时的Activity就是处于运行状态,也就是正在显示给用户的Activity。这种情况下的Activity系统是最不愿意回收的,否则会造成很差的用户体验。
2:暂停状态
当一个Activity不处于栈顶,当仍然可见时(处于栈顶位置的Activity没有占满整个屏幕),此时的Activity就是处于暂停状态。这种情况下的Activity系统也是不愿意回收的,只有在内存极低的时候,系统才会考虑去回收这种Activity。
3:停止状态
当一个Activity不处于栈顶,且完全不可见时,此时的Activity就是处于停止状态。当系统很缺内存时,处于停止状态的Activity是有可能会被回收的。
4:销毁状态
当一个Activity从返回栈中移除后,此时的Activity就变成了销毁状态。系统最喜欢回收处于这种状态的Activity,从而保证手机的内存充足。
4.3 Activity的生存期
Android通过定义7个回调方法来表述Activity生命周期中的每一个环节。下面我将对这7个方法进行简述,方便大家对Activity的生命周期有更一步的理解。
1:onCreate()
该方法会在Activity第一次创建的时候调用。主要完成Activity中一些初始化的工作。例如:加载布局、绑定点击事件等。
2:onStart()
该方法在onCreate()或onRestart()之后调用,让Activity由不可见状态变为可见状态的时候调用。
3:onResume()
该方法在与用户进行交互时调用,此时的Activity处于可见状态,处于返回栈的栈顶位置。
4:onPause()
该方法在系统要跳转到另一个Activity时调用。如果跳转的Activity没有占满整个屏幕则不会执行下面的onStop()方法。
5:onStop()
该方法在系统要跳转到另一个Activity时,且新的Activity占满整个屏幕是调用。
6:onDestroy()
该方法在Activity被销毁之前调用。完成释放内存的操作。
7:onRestart()
该方法在Activity由停止状态变为运行状态之前调用,此时的Activity被重新启动了。
如果想要更好的掌握Activity的生命周期,最好还是要写个Demo自己去体会下。为了帮助我们更好的理解Activity的生命周期,Android提供了一张Activity生命周期的示意图:
5:Activity的四种启动模式
在实际项目开发中,我们会根据需求为每个Activity指定恰当的启动模式。启动模式一共有四种,分别是:standard、singleTop、singleTask和singleInstance。我们可以在AndroidManifest.xml中进行设定:
<activity
android:launchMode="singleInstance"
android:name=".MainActivity"
android:label="@string/app_name" >
</activity>
5.1 standard(标准启动模式)
standard是Activity默认的启动模式,在standard模式下,每启动一个新的Activity,它都会进入返回栈,并且处于栈顶的位置。不管返回栈中有没有Activity,都会创建该Activity的一个新的实例。
5.2 singleTop(栈顶复用模式)
如果一个Activity是以singleTop模式启动的,并且处于返回栈的栈顶位置时,如果想再次启动该Activity,此时系统不会创建新的实例,而是直接使用栈顶位置的Activity。
5.3 singleTask(栈内复用式)
如果一个Activity的启动模式是singleTask,以后每次启动该Activity时,系统都会先去返回栈中看看有没有该活动的实例,(注:是到整个返回栈中去检查,并不是单单看栈顶位置),如果返回栈中已经有了该活动的实例,那么就会直接使用该实例,并且会把该Activity上面所有的Activity全部弹栈。如果整个返回栈中都没有检查到该活动的实例,那么系统就会创建一个新的Activity实例。
5.4 singleInstance(单例模式)
如果一个Activity的启动模式是singleInstance,那么系统会单独启用一个新的返回栈来管理该Activity,同一时刻系统中只会存在一个这样的Activity,当需要再次启动该Activity时,系统不会创建新的Activity,而是直接复用已经存在的Activity。其他启动的Activity会运行在另一个任务栈中。使用这种模式的Activity达到了与其他程序共享同一个Activity的目的。
6. Activity中的常见问题
6.1 横竖屏切换时对Activity生命周期的影响
1. 默认情况下 先完全杀死,然后再重新创建
2. 如何不让横竖屏切换时影响当前Activity的生命周期?
android:configChanges="screenSize|orientation|keyboardHidden"
6.2 如何固定Activity的方向
1. 通过修改配置文件
android:screenOrientation="landscape"
2. 通过编写代码
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
好了,本文到此就写完了,希望能够帮助到大家对Activity的理解。让我们共同学习,一起进步吧!