共计 8858 个字符,预计需要花费 23 分钟才能阅读完成。
Android 四大组件详解 —Activity
一:Activity
Activity 是一个 Android 的利用组件,它提供屏幕进行交互。每一个 Activity 都会取得一个用于绘制其用户界面的窗口,窗口能够充斥屏幕也能够小于屏幕并浮动在其余窗口上。
// 清单文件中配置启动
//Intent 在由以下几个局部组成:动作(action),数据(data),分类(Category),类型(Type),组件(Component),和扩大信息(Extra)。<activity android:name=".FourTeenActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />// 动作,应用程序的入口
<category android:name="android.intent.category.LAUNCHER" />// 示意指标 Activity 是应用程序中最优先被执行的 Activity
</intent-filter>
</activity>
public class FourTeenActivity extends AppCompatActivity {private static final String TAG= FourTeenActivity.class.getSimpleName();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.activity_four_teen);
Log.d(TAG,"onCreate()");
}
}
** 常见的 Activity Action Intent 常量 **
常量名称 常量值 意义
ACTION_MAIN android.intent.action.MAIN 应用程序入口
ACTION_VIEW android.intent.action.VIEW 显示数据给用户
ACTION_ATTACH_DATA android.intent.action.ATTACH_DATA 指明附加信息给其余中央的一些数据
ACTION_EDIT android.intent.action.EDIT 显示可编辑的数据
ACTION_PICK android.intent.action.PICK 抉择数据
ACTION_CHOOSER android.intent.action.CHOOSER 显示一个 Activity 选择器
ACTION_GET_CONTENT android.intent.action.GET_CONTENT 取得内容
ACTION_DIAL android.intent.action.GET_CONTENT 显示打电话面板
ACITON_CALL android.intent.action.DIAL 间接打电话
ACTION_SEND android.intent.action.SEND 间接发短信
ACTION_SENDTO android.intent.action.SENDTO 抉择发短信
ACTION_ANSWER android.intent.action.ANSWER 应答电话
ACTION_INSERT android.intent.action.INSERT 插入数据
ACTION_DELETE android.intent.action.DELETE 删除数据
ACTION_RUN android.intent.action.RUN 运行数据
ACTION_SYNC android.intent.action.SYNC 同步数据
ACTION_PICK_ACTIVITY android.intent.action.PICK_ACTIVITY 抉择 Activity
ACTION_SEARCH android.intent.action.SEARCH 搜寻
ACTION_WEB_SEARCH android.intent.action.WEB_SEARCH Web 搜寻
ACTION_FACTORY_TEST android.intent.action.FACTORY_TEST 工厂测试入口点
** 常见的 Category 常量 **
Category 字符串常量 形容
CATEGORY_BROWSABLE 指标 Activity 能通过在网页浏览器中点击链接而激活(比方,点击浏览器中的图片链接)CATEGORY_GADGET 示意指标 Activity 能够被内嵌到其余 Activity 当中
CATEGORY_HOME 指标 Activity 是 HOME Activity,即手机开机启动后显示的 Activity,或按下 HOME 键后显示的 Activity
CATEGORY_LAUNCHER 示意指标 Activity 是应用程序中最优先被执行的 Activity
CATEGORY_PREFERENCE 示意指标 Activity 是一个偏爱设置的 Activity
1.Activity 的生命周期
Activity 实质上有四种状态:
运行(Active/Running):Activity 处于沉闷状态,此时 Activty 处于栈顶,是可见状态,能够与用户交互
暂停(Paused): 当 Activity 失去焦点时,Activity 就转化成 Paused 状态。此刻并不会被销毁,常识失去了与用户交互的能力,只有在烯烃内存资源有余的状况下,才有可能被零碎回收掉
进行(Stopped): 当 Activity 被零碎齐全笼罩时,被笼罩的 Activity 就会进去 Stopped 状态,此时已不再可见,然而资源还是没有被回收
零碎回收(Killed): 当 Activity 被零碎回收掉,Activity 就处于 Killed 状态
当一个流动在处于进行或者暂停的状态下,零碎内存不足时会将其完结(finish)或者杀死(Kill). 这种非正常的状况下,零碎在杀死或者完结之前会调用 onSaveInstance()办法来保存信息,同时当 Actvity 被挪动带前台时,重启该 Activity 并调用 onRestoreInstance()办法加载保留的信息,以放弃原来的状态
onCreate() 首次创立 Activity 时调用,此办法执行所有失常的动态设置 – 创立视图,数据绑定到列表等
onStart() 此办法被回调示意 Activity 已处于可见状态,只是还没有在前台显示,因而无奈与影虎进行交互。能够简略了解为 Activity 已显示然而咱们无奈看见
onResume() 回调此办法时,阐明 Activity 已在前台可见,能够与用户交互了(Activie/Running 状态)
onPause() 以后 Activity 正在进行(Paused 状态),零碎行将开始另一个 Activity 时调用此办法
onStop() Activity 对用户不再可见的时调用,如果 Activity 被销毁或者另一个 Activity 继续执行并将其笼罩
onDestory() 在 Activity 被销毁前调用。这是 Activity 将收到的最初调用,当 Activity 完结(调用 finish())或者零碎为节俭空间而销毁该 Activity 实例
onRestart() 在 Activity 已进行并行将再次启动前调用,后接 onStart()
1. 当在手机加载利用至界面时,Activity 启动 –>onCreate()–>onStart()–>onResume()
FourTeenActivity: onCreate()
FourTeenActivity: onStart()
FourTeenActivity: onResume()
2. 按下 home 键回到主界面(Activity 不可见)—>onPause()—>onStop()
FourTeenActivity: onPause()
FourTeenActivity: onStop()
3. 当从新回到原 Activity 时,调用 onRestart()–>onStart()–>onResume()
FourTeenActivity: onRestart()
FourTeenActivity: onStart()
FourTeenActivity: onResume()
4. 当按下返回键(back),利用退出 Activity 被销毁
FourTeenActivity: onPause()
FourTeenActivity: onStop()
FourTeenActivity: onDestroy()
5. 当点击按钮进行页面跳转时
FourTeenActivity: onPause()
FiveTeenActivity: onCreate()
FiveTeenActivity: onStart()
FiveTeenActivity: onResume()
FourTeenActivity: onStop()
6. 点击 back 键回退时(回退的话会销毁这个 Activity),然而如果咱们在 FiveTeenActivity 点击跳转的话 FiveTeenActivity 不走 onDestory()办法
FiveTeenActivity: onPause()
FourTeenActivity: onRestart()
FourTeenActivity: onStart()
FourTeenActivity: onResume()
FiveTeenActivity: onStop()
FiveTeenActivity: onDestroy()
Activity 流动,了解为手机屏幕,与用户交互的可视化界面;Activity 存储在 Activity 存储在 Activity 栈中,后进先出
Activity 的 onSaveInstanceState() 办法调用
static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
// 保留用户自定义的状态
savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);
super.onSaveInstanceState(outState);
}
在 Android P 之前:这个办法将在 onStop()之后被调用
在 targetSdkVersion 小于 11 时,如果要执行 onSaveInstanceState 办法,则会在 onPause 之前执行。当 targetSdkVersion 大于等于 11 时,是在 onPause 之后执行的,然而都肯定会在 onStop 之前。
数据保留:Activity 申明周期完结时候,须要保留 Activity 状态的时候会将保留的数据已键值对的模式保留在 Bundle 对象中。
复原你的 Activity 状态
当你的 Activity 之前被毁坏后从新创立时,你能够从 Bundle 零碎通过你的保留状态。这 2 个办法 onCreate()和 onRestoreInstanceState()回调办法都会收到 Bundle
@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {super.onRestoreInstanceState(savedInstanceState);
mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
}
onCreate()和 onRestoreInstanceState()调用的复原数据的区别
1. 因为 onSaveInstanceState 不肯定会被调用,所以 onCreate() 里的 Bundle 参数可能为空,如果应用 onCreate()来复原数据,肯定要做非空判断。
2. 而 onRestoreInstanceState 的 Bundle 参数肯定不会是空值,因为它只有在上次 activity 被回收了才会调用。
3. 而且 onRestoreInstanceState 是在 onStart()之后被调用的。有时候咱们须要 onCreate()中做的一些初始化实现之后再复原数据,用 onRestoreInstanceState 会比拟不便。
二:Android 四大启动模式
1.standard(默认规范)
零碎默认的启动模式,Android 是应用返回栈来治理流动的,每次启动一个 Activity 都会又一次创立一个新的实例入栈,无论这个实例是否存在 。
1. 在 A 中跳转 B,B 中跳转 A
A Activity–>B Activity–>A Activity–>B Activity
这样栈里有 4 个 Activity 栈顶是 B
2.SingleTop 栈顶复用模式
须要创立的 Activity 曾经处于栈顶时,此时会间接复用栈顶的 Activity, 不会再创立新的 Activity, 若不在栈顶,此时会一次又一次创立 Activity 同 Standard 模式一样
<activity android:name=".FiveTeenActivity"
android:launchMode="singleTop"/>// 在 AndroidMainfest 中设置启动模式为 singleTop
当咱们设置了启动模式,在 FiveTeenActivity 去跳转到本人,就会走栈顶复用模式,走 onNewIntent()办法
D/FiveTeenActivity: onCreate()
D/FiveTeenActivity: onStart()
D/FiveTeenActivity: onResume()
D/FiveTeenActivity: onPause()
// 第二次调用
D/FiveTeenActivity: onNewIntent()
D/FiveTeenActivity: onResume()
3.SingleTask 栈内复用模式
若须要创立 Activity 曾经处于栈中时,此时不会创立新的 Activity,而是将存在栈中的 Activity 下面的其余 Activity 所有销毁,使它成为栈顶。
以后栈内曾经有了 FourTeenActivity,FiveTeenActivity 且位于栈顶,
在栈顶 FiveTeenActivity 中去启动 FourTeenActivity 且 FourTeenActivity 启动模式为 SingleTask,这样
<activity android:name=".FourTeenActivity"
android:launchMode="singleTask">// 这样就会移除 FourTeenActivity 下面所有的 Activity 且置于栈顶
// 代表 FiveTeenActivity 出现进去
D/FiveTeenActivity: onCreate()
D/FiveTeenActivity: onStart()
D/FiveTeenActivity: onResume()
D/FourTeenActivity: onStop()
// 点击跳转到 FourTeenActivity,这样 FourTeenActivity 会回调 onNewIntent()
D/FiveTeenActivity: onPause()
D/FourTeenActivity: onNewIntent()
D/FourTeenActivity: onRestart()
D/FourTeenActivity: onStart()
D/FourTeenActivity: onResume()
// 而后跳转销毁栈顶上的 FiveTeenActivity
D/FiveTeenActivity: onStop()
D/FiveTeenActivity: onDestroy()
// 在点击 back, 间接就退出利用阐明栈内只有一个 Activity
D/FourTeenActivity: onPause()
D/FourTeenActivity: onStop()
D/FourTeenActivity: onDestroy()
4.SingleInstance 单例模式
是全局单例模式,此模式的 Activity 仅仅能独自位于一个工作栈中
<activity android:name=".FiveTeenActivity"
android:launchMode="singleInstance"/>
除了在 Manifest.xml 中指定 Activity 启动模式
还能够在 Intent 中指定启动模式
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);//singleTop 模式
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//singleTask 模式
这种没法为 Activity 指定 singleInstance 模式。
三:Android 横竖屏切换
1. 竖屏切换横屏不配置
D/FourTeenActivity: onPause()
D/FourTeenActivity: onStop()
D/FourTeenActivity: onDestroy()
// 重走一次生命周期
D/FourTeenActivity: onCreate()
D/FourTeenActivity: onStart()
D/FourTeenActivity: onResume()
2. 横屏切换竖屏不配置
D/FourTeenActivity: onPause()
D/FourTeenActivity: onStop()
D/FourTeenActivity: onDestroy()
// 也只走一次生命周期办法,之前 Android 零碎走两次
D/FourTeenActivity: onCreate()
D/FourTeenActivity: onStart()
D/FourTeenActivity: onResume()
备注:对于局部材料说的不配置 orientation 属性切换竖屏会执行两次的论断,我在 4.0 之后的手机上测试都是只执行一次,不晓得之前版本的零碎是不是这样,待验证
3.Activity 配置 configChanges=””
<activity android:name=".FourTeenActivity"
android:configChanges="orientation|screenSize">
横竖屏切换后生命周期办法
// 切换横屏
D/FourTeenActivity: onConfigurationChanged()
D/FourTeenActivity: 横屏
D/FourTeenActivity: onConfigurationChanged2
// 切换竖屏
D/FourTeenActivity: onConfigurationChanged()
D/FourTeenActivity: 竖屏
D/FourTeenActivity: onConfigurationChanged1
重写 onConfigurationChanged,这里解决切屏布局变动和数据的存储复原
@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {super.onConfigurationChanged(newConfig);
Log.d(TAG,"onConfigurationChanged()");
int orientation=newConfig.orientation;
if (orientation==ORIENTATION_LANDSCAPE){Log.d(TAG,"横屏");
}else {Log.d(TAG,"竖屏");
}
Log.d(TAG,"onConfigurationChanged"+orientation);
}
configChanges 的可配置属性如下:
mcc:IMSI 挪动台国家代码(MCC)发生变化
keyboardHidden: 键盘的可拜访性发生变化
orientation:屏幕方向发生变化 - 用户旋转了屏幕
screenSize : 以后屏幕大小发生变化
。。。。
咱们还能够间接通过 Activity 的 screenOrientation 属性管制,
<activity android:name=".FourTeenActivity"
android:screenOrientation="portrait"> 横屏
<activity android:name=".FourTeenActivity"
android:screenOrientation="landscape"> 竖屏
screenOrientation 属性管制
unspecified: 默认值,零碎主动抉择屏幕方向
behind: 跟 activity 堆栈中的上面一个 activity 的方向统一
landscape: 横屏方向
portrait: 竖屏方向
sensor: 由设施的物理方向传感器决定,如果用户旋转了设施,这屏幕就会横竖屏切换
nosensor: 疏忽物理方向传感器
reverseLandscape:api9 以上,反向横屏
reversePortrait:api9 以上,反向竖屏
END: 凡心所向,素履以往;生如逆旅,一苇以航。