生命周期

- 新界面出现之前,上一个先执行上一个界面的onPause(),然后执行新界面的onCreate()
- onStart 和 onStop 是从是否可见的角度去区分,onResume和onPause从是否在前台区分。
- 异常情况下的生命周期:
资源相关的系统配置发生改变,系统在杀死activity的时候回调用onSaveInstanceState()方法对activity的状态进行保存,当activity重建的时候,会调用onRestoreInstanceState(),并把onSaveInstanceState()保存的Bundle作为参数传递过来。官方建议使用onRestoreInstanceState()恢复。
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
outState.putString("msg","存了点东西");
Log.e("MainActivity","onSaveInstanceState");
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.e("MainActivity","onRestoreInstanceState");
Log.e("MainActivity",savedInstanceState.getString("msg","啥也没有"));
}
强制竖屏
- (代码中使用):
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//强制竖屏 - (固定为垂直方向):
android:screenOrientation="portrait" - (使activity不敏感屏幕朝向的变化):
android:configChanges="orientation|keyboard|screenSize
1.不要和screenOrientation一同使用,会降低效率不销毁Activity;
2.当横竖屏切换的时候会直接调用onCreate方法中的onConfigurationChanged方法,而不是重新执行onCreate方法,如果没有使用这个属性就会重新调用onCreate方法了
启动模式
配置清单文件
<activity>中的launchModel属性控制
- standard(默认属性)
系统在启动该 Activity 的任务中创建 Activity 的新实例,并将 intent 传送给该实例。Activity 可以多次实例化,每个实例可以属于不同的任务,一个任务可以拥有多个实例。 - singleTop
如果当前任务栈的顶部已经存在activity实例,则不创建新的activity,而是通过掉用onNewIntent()方法传递Intent,如果不在栈顶,则创建新的activity。 - singleTask
系统会创建新任务,并实例化新任务的根 Activity。但是,如果另外的任务中已存在该 Activity 的实例,则系统会通过调用其 onNewIntent() 方法将 intent 转送到该现有实例,而不是创建新实例。Activity 一次只能有一个实例存在。 - singleInstance
与 "singleTask" 相似,唯一不同的是系统不会将任何其他 Activity 启动到包含该实例的任务中。该 Activity 始终是其任务唯一的成员;由该 Activity 启动的任何 Activity 都会在其他的任务中打开。
官方实例
Android 浏览器应用在 <activity> 元素中指定 singleTask 启动模式,由此声明网络浏览器 Activity 应始终在它自己的任务中打开。这意味着,如果您的应用发出打开 Android 浏览器的 intent,系统不会将其 Activity 置于您的应用所在的任务中,而是会为浏览器启动一个新任务,如果浏览器已经有任务在后台运行,则会将该任务转到前台来处理新 intent
使用Intent标记
-
FLAG_ACTIVITY_NEW_TASK
在新任务中启动 Activity。如果您现在启动的 Activity 已经有任务在运行,则系统会将该任务转到前台并恢复其最后的状态,而 Activity 将在 onNewIntent() 中收到新的 intent。
这与上一节中介绍的 "singleTask" launchMode 值产生的行为相同。 -
FLAG_ACTIVITY_SINGLE_TOP
如果要启动的 Activity 是当前 Activity(即位于返回堆栈顶部的 Activity),则现有实例会收到对 onNewIntent() 的调用,而不会创建 Activity 的新实例。
这与上一节中介绍的 "singleTop" launchMode 值产生的行为相同。 -
FLAG_ACTIVITY_CLEAR_TOP
如果要启动的 Activity 已经在当前任务中运行,则不会启动该 Activity 的新实例,而是会销毁位于它之上的所有其他 Activity,并通过 onNewIntent() 将此 intent 传送给它的已恢复实例(现在位于堆栈顶部)。注册流程,从结果页面到登录界面的时候,可以使用这个标识。
launchMode 属性没有可产生此行为的值。
FLAG_ACTIVITY_CLEAR_TOP 最常与 FLAG_ACTIVITY_NEW_TASK 结合使用。将这两个标记结合使用,可以查找其他任务中的现有 Activity,并将其置于能够响应 intent 的位置。
只有当 Activity 具有 ACTION_MAIN 和 CATEGORY_LAUNCHER 过滤器时,才应使用 "singleTask" 和 "singleInstance" 这两种启动模式,它们会将 Activity 标记为始终启动任务。
注意事项

清除返回栈
intentfilter 匹配规则
activity的启动方式分为显式启动和隐式启动
- 显式启动,通过intent方式启动activity
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
- 隐式启动,需要匹配IntentFilter中的过滤信息,
- action 是一个字符串,系统定义了很多字符串,也可以我们自己定义字符串
规则:必须有一个且action中的字符串值必须一样 - category
规则:Intent可以没有category,如果有不管有几个,每个都要和过滤器中的任意一个相同。过滤器中不设置的情况下,系统在调用startActivity和startActivityForResult的时候,会默认在Intent中添加“android.intent.category.DEFAULT”。 - data
data由两部分组成 URI 和 mimeType
mimeType:媒体类型 image/jpeg 、audio/mpeg4-generic、video/*等
URI:<scheme>://<host>:<port>/ <path> | <pathPattern> | <pathPrefix> |
例如:
content://com.example:200/folder/subfolder/tec
http://www.baidu.com:80/search/info
scheme和host 是必要的的,<path> 路径 | <pathPattern>可以使用通配符 * 的路径 | <pathPrefix>路径的前缀信息
可以调用Intent的setDataAndType 对各个参数进行设置。
intent.setDataAndType(Uri.parse("file://abc"),"image/png");
参考:《Android开发艺术探索》
网友评论