Activity

2020-04-10  本文已影响0人  面向星辰大海的程序员

学习记录:

四种启动模式:

1.标准模式standart :系统在启动Activity的任务中创建Activity的新实例并向其传送Intent。Activity可以多次实例化,不管这个例子是否已经存在,而每个实例均可属于不同的任务栈Task,并且一个任务栈Task可以拥有多个实例。这种模式的Activity被创建时它的onCreate、onStart都会被调用。这是一种典型的多实例实现,在这种模式下谁启动了Activity,那么这个Activity就运行在启动它的那个Activity所在的栈中。

a.当从非Activity的context启动Activity时需要带上new_task的flag。

b.当启动一个带有afiinity的Activity(需要设置intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);)(android:taskAffinity="com.dbf.Test"afiinity命名过短似乎安装不了,且不报错,比较坑),如果这个Activity已经有实例存在该task,则不会重新创建。

c.如果从应用内启动的standart Activity的affinity就是App默认的affinity,则会每次新建一个实例。

  2.栈顶复用模式singleTop :一个singleTop Activity的实例可以无限多,唯一的区别是如果再栈顶有一个相同类型的Activity实例,Intent不会再创建一个Activity实例,而是通过onNewIntent发送到现有的Activity实例。

 3.栈内复用模式singleTask :这是一种单例模式,在这种模式下,只要栈中有一个该类型的Activity实例,那么多次启动该类型的Activity都不会重新创建实例,和singleTop一样,系统也会回调其onNewIntent。当一个具有singleTask模式的Activity请求启动后,比如Activity A ,系统首先会寻找是否有A想要的任务栈,如果不存在,就重新创建一个任务栈,然后创建A的实例并压入栈中。如果存在A所需的任务栈并且有A的实例在其中,系统就会把A调到栈顶并回调其onNewIntent方法,如果不存在就创建A的实例并压入栈中。(将A调到栈顶时会把在A之上的Activity实例都清掉)

4.单实例模式singleInstance:与singleTask相同,只是系统不会将任务其他Activity启动到包含实例的任务栈中。该Activity实例始终是其任务栈唯一仅有的成员。

Intent Activity Flag:

启动模式的应用场景:

七大生命周期 1.onCreate()  2.onStart() 3.onResume() 4.onPause() 5.onStop() 6.onRestart() 7.onDestroy()

1.onCreate和onStart之间的区别?

(1)可见和不可见的区别,前者可见,后者不可见。

(2)执行次数的区别,onCreate方法只在Activity创建时执行一次,而onStart方法在Activity的切换以及按Home键返回桌面再切回应用的过程中被多次调用。因此Bundle数据的恢复在onStart中进行比onCreate中执行更合适。

2.onStart方法和onResume方法有什么区别?

(1)是否在前台。onStart方法中Activity可见但不在前台,不可交互。而onResume方法中Activity在前台。

(2)职责不同。onStart方法中主要还是进行初始化工作,而onResume方法,根据官方的建议,可以做开启动画和独占设备的操作。

3.onPause方法和onStop方法的区别?

(1)是否可见。onPause方法Activity可见,onStop方法Activity不可见,但Activity对象还在内存中。

(2)在系统内存不足时可能会执行onStop方法,因此程序状态的保存,独占设备和动画的关闭、以及一些数据的保存最好在onPause中进行,但要注意不能太耗时。

4.onStop和onDestroy的区别

onStop阶段Activity还没被销毁,对象还在内存中,因此可以通过切换Activity再次回到该Activity,而onDestroy方法表示Activity被销毁了。

onNewIntent的生命周期

1.只对singleTop,singleTask,singleInstance有效,因为s'tandart每次都是新建,所以不存在onNewIntent。

2.只对startActivity有效,对于从Navigation切换回来的恢复无效。

横竖屏切换:设置configChanges值可避免生命周期被回调  android:configChanges="orientation|keyboardHidden|screenSize"

configChanges属性可以设置多个值,中间使用竖线分割;

1. orientation 屏幕在纵向和横向间旋转

2.keyboardHidden 键盘显示或隐藏

3.screenSize 屏幕大小改变了

4.fontScale 用户变更了首选的字体大小

5.locale 用户选择了不同的语言设定

6.keyboard 键盘类型变更,例如手机从12键盘切换到全键盘

7.touchscreen或navigation 键盘或导航方式变化,一般不会发生这样的事件

Android 软件体系结构

应用程序(Application)应用程序框架(Application framewrork) 各种库(Librarys)Android运行环境(RunTime) 操作系统(OS 精简的Linux)

Activity和Fragment

Fragment是Android3.0后引入的一个新的API,他出现的初衷是为了适应大屏幕的平板电脑,当然他现在仍然是平板APP UI设计的宠儿,而且我们普通手机开发也会加入这个Fragment,我们可以把它看成一个小型的Activity,又称Activity片段。

上一篇下一篇

猜你喜欢

热点阅读