1、activity的生命周期
onCreate(Bundle savedInstanceState) 第一次创建时调用
onStart() 被用户可见时调用
onRestart() 当Activity处于stop状态又被重新启动时调用
onResume() 当获得焦点即可与用户交互时调用
onPause() 当失去焦点时调用
onStop() 当不可见时调用
onDestroy() 当销毁时调用
2、Activity的启动模式
Android应用程序都是由一个或多个Activity组成的,而Android内部则是通过栈来对Activity
进行管理的。所谓栈就是一个先进后出的数据结构。正常情况下栈顶的Activity就是当前Task
显示的Activity,当我们按back键的时候该Activity便会出栈。然而事实并不是这么简单,
google在对Activity任务栈进行设计的时候考虑到了一些特殊需求所以便有了Activity的启动
模式之说。
Activity的启动模式包含四种,分别是:standard、singleTop、singleTask、
singleInstance,我们可以在manifest里通过Activity的launchmode进行指定。
1)standard模式
这是Activity的标准启动模式(默认模式),如果我们不对Activity做任何特殊处理的情况下就默认为该模
式启动,所以该模式并不需要在manifest或者Intent里进行指定。这个模式的问题在于会导致
一个任务栈里会有多个该Activity的实例存在,很简单的一个例子就是我们在AcitivytA里启
动ActivityA这样就会有两个ActivityA存在。假如说该Activity非常消耗资源,那么就有必要
考虑下更改下Activity的启动模式了。
2)singleTop模式
该模式简单来说,启动的Activity已经在任务栈的栈顶话,那么再启动这个Activity的时候
就不会创建该实例,同时会调用该Acitivity的onNewIntent方法(前面有提过该方法)。但是
如果该Activity不在栈定的话,那么启动它的行为与standard模式并没有什么区别。
3)singleTask模式
singleTask指的是一个任务栈中只能存在一个这样的Acitivity。但是需要我们注意的是如果
任务栈中没有该Activity的话系统就会帮我们创建一个Acitivity压入栈顶,但是如果存在该
Activity的话就会销毁压在该Activity上的所有Activity最终让创建出来的Activity实例处于
栈顶,同时也会回掉该Activity的onNewIntent方法。
4)singleInstance模式
该模式是四个模式当中最为特殊的一个,设置了该模式启动的Acitivyt会在一个独立的任务栈
中开启,同事该任务栈有且只有一个这样的Activity实例,每次再启动这个Activity的时候就
会在该任务栈里重用该Activity同时回掉onNewIntent方法。
singleInstace与singleTask的区别在于:singleTask启动的Activity在系统层面上来说是
可以有多个实例的。比如说应用程序A想调用singleInstance模式下的ActivityA,而应用程
序B也同样调用了,那么在应用程序A和B中就会各有一个ActivityA的实例。但如果该
ActivityA是singleInstance模式的话,那么无论有多少个应用程序调用它,它都只可能在系统中
存在一个实例同时该实例还是位于它自己的一个单独的任务栈中。
3、Activity运行状态
运行 可见可交互
暂停 可见不可交互
停止 不可见不可交互
销毁 啥都没有
4、8个案例
锁屏:onpause()
开屏: onResume()
一个页面跳转另一个页面:
整个页面
A:onpause->onstop
B:oncreate->onstart->onResume
对话框页面
A:onpause
B:oncreate->onstart->onResume
home键:onPause() onStop()
唤醒: OnRestart() OnResume();
activity启动:onCreate() onStart() onResume()
退出程序:onPause() onStop() onDestroy()
横竖屏切换: 横竖屏切换: ConfigOptions="";
如果配置了这个参数,只走onConfigOptionChange
如果没有配置,横竖屏切换各走两次
onSaveInStanceStale() -->保存数据
onpause->onStop 相当于俩个页面切换
另一个:oncreate(Bundle恢复数据) onstart onReSeaveInStance(还原数据)
5、Activity两种启动方式
显示启动:new Intent(A.this,B.class)指明需要转向到的Activity,显式意图明确指定了要激活的组件是哪个组件,一般是在应用程序内部使用。
隐式启动:隐式Intent:通过在清单文件中配置IntentFilter来实现的,它一般用在没有明确指出目标组件名称的前提下,当一个应用要激活另一个应用中的Activity时
(看不到源代码),只能使用隐式意图,根据Activity配置的意图过滤器建一个意图,让意图中的各项参数的值都跟过滤器匹配,这样就可以激活其他应用中的Activity。
Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。一般是用于在不同应用程序之间,如果想隐式
- intent不可以被跨应用启动只需要在AndroidManifest.xml对应的activity中配置android:exported="false"即可。
6、Activity两种传值
intent 传具体值
bundle 传对象
7、隐式启动的不同方式
1>根据action和Category进行匹配
2>根据action和data进行匹配
3>根据action和data的mimeType的属行进行匹配
8、回传思路
1、使用startActivityForResult(Intent intent, int requestCode) 方法启动指定Activity。
2、当前 Activity 需要重写 onActivityResult(int requestCode,int resultCode,Intent intent), 当被启动的Activity返回结果时,
该方法将会被触发,其中requestCode代表请求码, 而resultCode代表Activity返回的结果码,这个结果码也是由开发者根据业务自行设定的。
3、被启动的Activity需要调用setResult()方法设置处理结果。
9、传值的方式:
intent
广播
contentprovider
静态成员变量
sp
数据库
bundle
eventbus
接口回调
构造方法