【安卓】Android 四大组件的详解之Activity篇

Android 四大组件的详解之Activity篇

Rocky_ruan发布于 1 分钟前

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()");

}

}

【安卓】Android 四大组件的详解之Activity篇

**常见的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()方法加载保留的信息,以保持原来的状态
【安卓】Android 四大组件的详解之Activity篇
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:凡心所向,素履以往;生如逆旅,一苇以航。

android

阅读 5发布于 1 分钟前

本作品系原创,采用《署名-非商业性使用-禁止演绎 4.0 国际》许可协议

avatar

Rocky_ruan

1 声望

0 粉丝

0 条评论

得票时间

avatar

Rocky_ruan

1 声望

0 粉丝

宣传栏

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()");

}

}

【安卓】Android 四大组件的详解之Activity篇

**常见的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()方法加载保留的信息,以保持原来的状态
【安卓】Android 四大组件的详解之Activity篇
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:凡心所向,素履以往;生如逆旅,一苇以航。

以上是 【安卓】Android 四大组件的详解之Activity篇 的全部内容, 来源链接: utcz.com/a/112338.html

回到顶部