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:凡心所向,素履以往;生如逆旅,一苇以航。