目录
3)子类继承父类Activity后,生命周期走势:会先走父类的,之后再走子类的
1)设置显示的方向-screenOrientation属性:
1.Activity生命周期
1)Activity生命周期
oncreat:进行Activity的一些初始化工作,比如使用setContentView加载布局,对一些控件和变量进行初始化等。但是由于此状态的Activity不可见,那么一些动画的初始化放这就显示不妥。
onstart:此时Activity已经可见了,但是还没出现在前台,我们还看不到,无法与Activity交互。
onresume:Activity在这个阶段已经出现在前台并且可见了。
onpouse:切换Activity,back键,会走此方法,可做轻量资源释放
onstop:home和back键会走
ondestory:销毁数据
onrestart:home键回来或者act切换回来
2)A页面->B页面时的生命周期:
A:craet-start-resume-pouse
B:creat-start-resume
A:stop
B:pouse-stop-destory
A:restart-start-resume(不走oncreat-走start)
3)子类继承父类Activity后,生命周期走势:会先走父类的,之后再走子类的
父类oncreat
子类oncreat
父类onstart
子类onstart
父类onresume
子类onresume
......
2.清单文件设置Activity属性
1)设置显示的方向-screenOrientation属性:
"landscape" 横向显示(宽度比高度要大)
"portrait" 纵向显示(高度比宽度要大)
"unspecified"
默认值,由系统来选择方向。它的使用策略,以及由于选择时特定的上下文环境,可能会因为设备的差异而不同。
"user"
使用用户当前首选的方向。
"behind"
使用Activity堆栈中与该Activity之下的那个Activity的相同的方向。
"reverseLandscape"
与正常的横向方向相反显示,在API Level 9中被引入。
"reversePortrait"
与正常的纵向方向相反显示,在API Level 9中被引入。
"sensorLandscape"
横向显示,但是基于设备传感器,既可以是按正常方向显示,也可以反向显示,在API Level 9中被引入。
"sensorPortrait"
纵向显示,但是基于设备传感器,既可以是按正常方向显示,也可以反向显示,在API Level 9中被引入。
"sensor"
显示的方向是由设备的方向传感器来决定的。显示方向依赖与用户怎样持有设备;当用户旋转设备时,
显示的方向会改变。但是,默认情况下,有些设备不会在所有的四个方向上都旋转,因此要允许在所有的四个方向上都能旋转,
就要使用fullSensor属性值。
"fullSensor"
显示的方向(4个方向)是由设备的方向传感器来决定的,除了它允许屏幕有4个显示方向之外,其他与设置为
“sensor”时情况类似,不管什么样的设备,通常都会这么做。例如,某些设备通常不使用纵向倒转或横向反转,
但是使用这个设置,还是会发生这样的反转。这个值在API Level 9中引入。
"nosensor"
屏幕的显示方向不会参照物理方向传感器。传感器会被忽略,所以显示不会因用户移动设备而旋转。
除了这个差别之外,系统会使用与“unspecified”设置相同的策略来旋转屏幕的方向。
2)configChanges属性
在运行时发生配置更改时,默认情况下会关闭 Activity 然后将其重新启动,但使用该属性声明配置将阻止 Activity 重新启动。 Activity 反而会保持运行状态,并且系统会调用其 onConfigurationChanged() 方法。
- “mcc” IMSI 移动国家/地区代码 (MCC) 发生了变化 - 检测到了 SIM 并更新了 MCC。
- “mnc” IMSI 移动网络代码 (MNC) 发生了变化 - 检测到了 SIM 并更新了 MNC。
- “locale” 语言区域发生了变化 — 用户为文本选择了新的显示语言。
- “touchscreen” 触摸屏发生了变化。(这种情况通常永远不会发生。)
- “keyboard” 键盘类型发生了变化 — 例如,用户插入了一个外置键盘。
- “keyboardHidden” 键盘无障碍功能发生了变化 — 例如,用户显示了硬件键盘。
- “navigation” 导航类型(轨迹球/方向键)发生了变化。(这种情况通常永远不会发生。)
- “screenLayout” 屏幕布局发生了变化 — 这可能是由激活了其他显示方式所致。
- “fontScale” 字体缩放系数发生了变化 — 用户选择了新的全局字号。
- “uiMode” 用户界面模式发生了变化 — 这可能是因用户将设备放入桌面/车载基座或夜间模式发生变化所致。 请参阅 UiModeManager。 此项为 API 级别 8 中新增配置。
- “orientation” 屏幕方向发生了变化 — 用户旋转了设备。 注:如果您的应用面向 API 级别 13 或更高级别(按照 minSdkVersion 和 targetSdkVersion 属性所声明的级别),则还应声明 “screenSize” 配置,因为当设备在横向与纵向之间切换时,该配置也会发生变化。
- “screenSize” 当前可用屏幕尺寸发生了变化。它表示当前可用尺寸相对于当前纵横比的变化,因此会在用户在横向与纵向之间切换时发生变化。 不过,如果您的应用面向 API 级别 12 或更低级别,则 Activity 始终会自行处理此配置变更(即便是在 Android 3.2 或更高版本的设备上运行,此配置变更也不会重新启动 Activity)。
- 此项为 API 级别 13 中新增配置。
- “smallestScreenSize” 物理屏幕尺寸发生了变化。它表示与方向无关的尺寸变化,因此只有在实际物理屏幕尺寸发生变化(如切换到外部显示器)时才会变化。 对此配置的变更对应于smallestWidth 配置的变化。 不过,如果您的应用面向 API 级别 12 或更低级别,则 Activity 始终会自行处理此配置变更(即便是在 Android 3.2 或更高版本的设备上运行,此配置变更也不会重新启动 Activity)。
- 此项为 API 级别 13 中新增配置。
- “layoutDirection” 布局方向发生了变化。例如,从从左至右 (LTR) 更改为从右至左 (RTL)。 此项为 API 级别 17 中新增配置。
常用的配置有如下locale,keyboard,keyboardHidden,screenLayout,fontScale,orientation
3)其余属性
alwaysRetainTaskState:
声明在根activity(也就是启动项的activity有效),其余无效。看默认false。应用切换后,如果30分钟后再打开,将不保存之前的最终信息。设置为true时,则一直保存。
autoRemoveFromRecents:
声明都有效。如果为true,则由此activity启动以及后续启动的activity 将不保存在最近使用的任务栏中。
clearTaskOnLaunch:
声明在根activity(也就是启动项的activity有效)。默认为false。如果为true,那么应用通过主页面图标再次启动应用,只会保留任务栈底部的activity,并且显示,其余全部销毁,底部activity可以不是启动项的activity
enabled:
application和activity 中都可声明。默认true,表示activity 可实例化,也就是可用,false表示不可用,这个activity就不能启动了。
excludeFromRecents:
声明在根activity(也就是启动项的activity有效),其余无效。如果为true,则该应用不会显示在最近使用的列表中。
exported:
Activity 是否可由其他应用的组件启动 —“true”表示可以,“false”表示不可以。若为“false”,则 Activity 只能由同一应用的组件或使用同一用户 ID 的不同应用启动。
默认值取决于 Activity 是否包含 Intent 过滤器。没有任何过滤器意味着 Activity 只能通过指定其确切的类名称进行调用。 这意味着 Activity 专供应用内部使用(因为其他应用不知晓其类名称)。 因此,在这种情况下,默认值为“false”。另一方面,至少存在一个过滤器意味着 Activity 专供外部使用,因此默认值为“true”。
该属性并非限制 Activity 对其他应用开放度的唯一手段。 您还可以利用权限来限制哪些外部实体可以调用 Activity(请参阅 permission 属性)。
finishOnTaskLaunch:
每当用户再次启动其任务(在主屏幕上选择任务)时,是否应关闭(完成)现有 Activity 实例
True 为关闭。只要声明的都会被关闭,除了任务栈底部的activity。
hardwareAccelerated:
是否应为此 Activity 启用硬件加速渲染 —“true”表示应启用,“false”表示不应启用。 默认值为“false”。
从 Android 3.0 开始,为应用提供了硬件加速 OpenGL 渲染器,以改善许多常见 2D 图形运算的性能。 启用硬件加速渲染器时,Canvas、Paint、Xfermode、ColorFilter、Shader 和 Camera 中的大多数运算都会得到加速。这可以提高动画、滚动的流畅度和总体响应速度,即便是并不明确使用框架 OpenGL 库的应用也会受益。 由于启用硬件加速会增加资源消耗,因此您的应用将占用更多内存。
maxRecents:
达到该条目数时,系统会从概览屏幕中移除最近最少使用的实例。 有效值为 1-50(低内存设备使用 25);0 为无效值。 该值必须是整数,例如 50。默认值为 16。只对启动的根有效
multiprocess:
默认false。为true时可以在多个进程中创建实例。一个应用是一个进程。默认智能在自己app的进程中创建实例。更为广泛的是provider的声明,false 则多进程共享,ture,则有多个实例
noHistory:
默认false。为true表示该activity 进入不可见时便会自动销毁,调用finish(),那也就意味着这种定义的activity不会执行onActivityResult()。
permission:
自定义权限的方式,权限名称
process:
如果为该属性分配的名称以冒号(“:”)开头,则会在需要时创建应用专用的新进程,并且 Activity 会在该进程中运行。如果进程名称以小写字符开头,Activity 将在该名称的全局进程中运行,前提是它拥有相应的权限。这可以让不同应用中的组件共享一个进程,从而减少资源占用。
supportsPictureInPicture:
指定 Activity 是否支持画中画 显示。如果 android:resizeableActivity 是 false,系统会忽略该属性。 该属性是在 API 级别 24 添加的。
stateNotNeeded:
默认false。为true,表示不保存状态重新启动,也就是不会执行onsaveInstanceState()。
“true”设置可确保 Activity 能够在未保留状态时重新启动。 例如,显示主屏幕的 Activity 可以使用该设置来确保其由于某种原因崩溃时不会被移除。
resizeableActivity:
默认true。指定应用是否支持多窗口显示。您可以在 或 元素中设置该属性。
如果您将该属性设置为 true,则用户可以分屏和自由形状模式启动 Activity。 如果您将该属性设置为 false,Activity 将不支持多窗口模式。 如果该值为 false,且用户尝试在多窗口模式下启动 Activity,该 Activity 将全屏显示。
3.启动模式
1)如何设置启动模式
给<activity></activity>标签内部加上android:launchMode=""即可。
或者通过给Intent设置addflags(INTENT.FLAG_ACTIVITY_NEW_TASK),此优先级高。
2)4种启动模式
a.standard
默认的启动模式。生成新的实例
b.singletop-栈顶复用
位于栈顶,则重复利用,不在就生成新的实例
c.singletask-栈中只存在单个任务
此Activity实例之上的其他Activity实例通通出栈,使此Activity实例成为栈顶对象
d.singleInstance-全局单例模式
整个系统中只会创建一次这个activity的实例,并且单独为此activity开一个栈
4.异常状态数据保存
1)调用时机
activity容易被销毁时才会调用onSaveInstanceState方法去保存数据,但是主动finish和按back键不触发。比如:
1、当用户按下HOME键时。
2、长按HOME键,选择运行其他的程序时。
3、按下电源按键(关闭屏幕显示)时。
4、从activity A中启动一个新的activity时。
5、屏幕方向切换时,例如从竖屏切换到横屏时。
2) 数据保存及取出
通过参数bundle去存储信息,只能保存一些简单的数据,比如控件的状态等。调用保存数据的时机会在onstop()方法前。
保存方法如下:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
String string = "保存字符串";
outState.putString("Activity", string);
}
取值方式1-通过onCreate方法中参数Bundle取值,但是记得要判空:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState != null) {
String oldString = savedInstanceState.getString("Activity");
}
}
取值方式2:
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
String oldString = savedInstanceState.getString("Activity");
}
5.Activity切换添加动画
1)简单的滑进滑出动画
a.先在res文件夹下建立anim文件夹,然后在里面建立fade_in.xml和fade_out.xml两个动画资源
fade_in.xml
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="300"
android:fromAlpha="0.0"
android:interpolator="@android:anim/accelerate_interpolator"
android:toAlpha="1.0" />
fade_out.xml
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="300"
android:fromAlpha="1.0"
android:interpolator="@android:anim/accelerate_interpolator"
android:toAlpha="0.0" />
b.然后在values文件夹下的styles.xml中的resources标签内写:
<style name="Anim_fade" parent="android:Theme.NoTitleBar">
<item name="android:windowAnimationStyle">@style/fade</item>
</style>
<style name="fade" parent="@android:style/Animation.Activity">
<item name="android:activityOpenEnterAnimation">@anim/fade_in</item>
<item name="android:activityOpenExitAnimation">@anim/fade_out</item>
<item name="android:activityCloseEnterAnimation">@anim/fade_in</item>
<item name="android:activityCloseExitAnimation">@anim/fade_out</item>
</style>
c.清单文件中Activity的使用
<activity
android:name="com.example.mc.MainActivity"
android:theme="@style/Anim_fade" >
2)淡入淡出+分解动画+共享元素动画
https://blog.csdn.net/w630886916/article/details/78319502(转)