Activity(活动)是什么:
- 活动包含用户界面的组件,主要用于和用户进行交互,一个应用程序中可以包含零个或多个活动。
- 四大组件都要在Androidmanifest文件中注册,所以活动是四大组件之一要在里面进行注册。
Activity活动状态:
- 运行状态:当一个活动位于返回栈的栈顶时,这时活动就处于运行状态。系统最不愿意回收的就是处于运行状态的活动,因为这会带来非常差的用户体验。
- 暂停状态:当一个活动不再处于栈顶位置,但仍然可见时,这是活动就进入了暂停状态。处于暂停状态的活动仍然是完全活着的,系统也不愿意去回收这种活动,只有内存极低的情况下,系统才会去考虑回收这种活动。
- 停止状态:当一个活动不再处于栈顶位置,并且完全不可见的时候,就进入停止状态。系统仍然会为这种活动保存相应的状态和成员变量,但是这并不是完全可靠的,当其他地方需要内存时,处于停止状态的活动有可能被系统回收。
- 销毁状态:当一个活动从返回栈中移除后就变成了销毁状态。系统会最倾向于回收处于这种状态的活动,从而保证手机的内存充足。
Activity的生命周期:
- onCreate:活动第一次被创建的时候调用。应该在这个方法中完成活动的初始化操作,比如加载布局、绑定事件。
- onStart:这个方法在活动由不可见变为可见的时候调用。
- onResume:这个方法在活动准备好和用户进行交互的时候调用。此时的活动一定位于返回栈的栈顶,并且处于运行状态。
- onPause:这个方法在系统准备去启动或者恢复另一个活动的时候调用。我们通常会在这个方法中将一些消耗CPU的资源释放掉,以及保存一些关键数据,但这个方法的执行速度一定要快,不然会影响到新的栈顶活动的使用。
- onStop:这个方法在活动完全不可见的时候调用。它和onPause()方法的主要区别在于,如果启动的新活动是一个对话框式的活动,那么onPause()方法会得到执行,而onStop()方法并不会执行。
- onDestroy:这个方法在活动被销毁之前调用,之后活动的状态将变为销毁状态。
- onRestart:这个方法在活动由停止状态变为运行状态之前的调用,也就是活动被重新启动了
- 完整生命周期:在onCreate方法和onDestory方法之间所经历的,就是完整生存期期
- 可见生存期:活动在onStart方法和onStop方法之间所经历的,就是可见生存期。在可见生存期内,活动对于用户总是可见的,即便有可能无法和用户进行交互。可以通过这个两个方法,合理地管理那些对用户可见的资源。比如在onStart方法中对资源进行加载,而在onStop方法中对资源进行释放,从而保证处于停止状态的活动不会占用过多内存。
- 前台生存期:活动在onResume方法和onPause方法之间所经历的就是前台生存期。在前台生存期内,活动总是处于运行状态,此时的活动是可以和用户进行交互的,平时看到和接触最多的也就是这个状态下的活动.
Activity的启动模式:
- standard:标准模式,这是系统默认的默认,也就是说你不设置Activity的launchMode时,默认的就是standard。在这种模式下,每次启动一个Activity都会重新创建一个新的实例,不管这个实例是否存在。在这种模式下,谁启动了这个Activity,那么这个Activity就运行在启动它的那个Activity所在的栈,但是这是有条件的,前提是启动它的Activity不能是singleInstance,因为singleInstance只能独立于一个任务栈中,不能有其他的Activity实例,这个后面我们会验证。比如非singleInstance模式的Activity A启动了标准模式的Activity B,那么Activity B就会进入到Activity A所在的任务栈。
- singleTop:栈顶复用模式。在这种模式下,如果Activity已经在任务栈的栈顶了,当再次启动同一个Activity的时候,这个Activity不会被重新创建,而且它的onNewIntent()方法会被调用,但是它的onCreate()、onStart()方法不会被调用。此模式下的Activity也会进入启动它的非singleInstance模式的Activity所在的任务栈中。
- singleTask:栈内复用模式。在这种模式下,只要Activity存在栈内,那么多次启动这个Activity都不会重新创建实例,系统会调用它的onNewIntent()方法。此外有个需要注意的地方:singleTask有clear top的效果,也就是说会将其以上的Activity全部出栈,直到singleTask模式的Activity到栈顶.
- singleInstance:这是singleTask的一种加强模式,除了singleTask所有特性以外,具有此模式的Activity只能单独位于一个任务栈中
Intent:
- Intent是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。Intent一般可用于启动活动、启动服务以及发送广播等场景。
- Intent的构造函数:Intent(Context packageContext,Class<?>cls),这个构造函数接收两个参数,第一个参数Context要求提供一个启动活动的上下文,第二个参数Class则是指定想要启动的目标活动,通过这个构造函数就可以构建出Intent的“意图”。然后通过Activity类中提供了一个startActivity()方法启动,这个方法专门用于启动活动的,它接收一个Intent参数,这里我们将构建好的Intent传入startActivity()方法就可以启动目标了:
-
1 Intent intetn=new Intent(FirstActivity.this,SecondActivity.class); 2 startActivity(intent);
- 显式Intent:像上面的例子意图非常明显,直接使用startActivity方法来跳转到另外一个活动称之为显示Intent.
- 隐式Intent:顾名思义,意图不明显的Intent,它并不明确指出我们想要启动哪一个活动,而是指定了一系列更为抽象的action和category等信息,然后交由系统去分析这个Intent,并帮我们找出合适的活动去启动:
-
通过<acticity>标签下配置<intent-filter>的内容,可以指定当前活动能够响应的action和category,打开AndroidManifest.xml,添加如下代码: <activity android:name=".MainActivity"> <intent-filter> <action adnroid:name="com.example.activitytest.ACTION_START"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity>
在<activity>标签中我们指明了当前活动可以响应com.example.activitytest.ACTION_START这个action,而<category>标签则包含了一些附加信息,
更精确地指明了当前的活动能够响应的Intent中还可能带有category。只有<action>和<category>中的内容同时能够匹配上Intent中指定的action和category时,这个活动才能响应该Intent: Intent intent=new Intent("com.example.activitytest.ACTION_START"); startActivity(intent); 前面说要匹配<aciton>和<categroy>才能响应,但是为什么没有category呢?
因为是android.intent.category.DEFAULT是一种默认的category,在调用startactivity()方法的时候会自动将这个category添加到Intent中
更多隐式Intent的用法:
使用隐式Intent不仅可以启动程序内的活动,还可以启动其他程序的活动,这使得Android多个应用程序之间的功能共享成为了可能。比如说应用程序要打开一个网页,这时没必要自己去实现一个浏览器,而是只需要调用系统的浏览器来打开这个网页就可以了: