先贴出一张大家众所周知activity流程图
预想深刻体会生命周期,得需要在实践中慢慢记忆,写个简单的demo,log出每个周期的轨迹算是基本了解吧
先看主界面布局activity_main.xml--点击button跳转到某个activity
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.screendemo.MainActivity" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/textView1" android:text="跳转到下一个aty" /> </RelativeLayout>
package com.example.screendemo; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.res.Configuration; import android.os.Bundle; import android.util.AttributeSet; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; public class MainActivity extends Activity { @Override public void onAttachedToWindow() { super.onAttachedToWindow(); Log.e("TAG", "onAttachedToWindow"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.e("TAG", "onCreate"); findViewById(R.id.button).setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(MainActivity.this, SecondAty.class)); } }); } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); Log.e("TAG", "onPostCreate"); } @Override protected void onStart() { super.onStart(); Log.e("TAG", "onStart"); } @Override protected void onRestart() { super.onRestart(); Log.e("TAG", "onRestart"); } @Override protected void onResume() { super.onResume(); Log.e("TAG", "onResume"); } @Override protected void onPostResume() { super.onPostResume(); Log.e("TAG", "onPostResume"); } @Override protected void onPause() { super.onPause(); Log.e("TAG", "onPause"); } @Override protected void onStop() { super.onStop(); Log.e("TAG", "onStop"); } @Override protected void onDestroy() { super.onDestroy(); Log.e("TAG", "onDestroy"); } @Override public void onBackPressed() { super.onBackPressed(); Log.e("TAG", "onBackPressed"); } @Override public void onDetachedFromWindow() { super.onDetachedFromWindow(); Log.e("TAG", "onDetachedFromWindow"); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); Log.e("TAG", "onRestoreInstanceState"); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); Log.e("TAG", "onSaveInstanceState"); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); Log.e("TAG", "onConfigurationChanged"); } }
Log1、在清除缓存、杀死进程的前提下,启动项目:
Log2、启动项目后,清除Log1日志,按下回退键
Log3、启动项目后,清除Log1日志,然后回到桌面,走蓝色框---桌面启动项目,走黑色框
Log4、启动项目后,清除Log1日志,然后长按进入任务列表界面,走蓝色框---杀掉进程,走onDestroy
Log5、启动项目后,清除Log1日志,点击button进入某个Aty,走蓝色框,然后点击返回键回到主界面,走黑色框
Log6、启动项目后,清除Log1日志,锁屏走蓝色框,开屏走黑色框
基本上项目启动,回退,回到桌面,杀死线程,跳转,锁屏,开屏都测试了,大家还是在项目中慢慢记忆把
接下来看屏幕旋转,首先要在手机设置中进行设置可以进行屏幕旋转操作
1、首先在MainActivity进行属性设置,屏幕不管如何旋转,就只支持竖屏,生命周期也不会调用
<activity android:name=".MainActivity" android:screenOrientation="portrait" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
2、如果去掉 android:screenOrientation="portrait",旋转屏幕至横屏
再由横屏切换会竖屏幕时候
走的流程是一样的
3、加上这行属性 android:configChanges="orientation|keyboardHidden"在进行旋转屏幕--就是多了一个onConfigurationChanged
再由横屏切换会竖屏幕时候
走的流程是一样的
启动模式
singleTask"
检测要启动的这个Activity的affinity和当前任务的affinity是否相同,如果相同的话就会把它放入到现有任务当中,如果不同则会去创建一个新的任务。
如果现有任务当中已经存在一个该Activity的实例了,那么系统就不会再创建一次它的实例,而是会直接调用它的onNewIntent()方法
注意这里我们所说的启动Activity,都指的是启动其它应用程序中的Activity,因为"singleTask"模式在默认情况下只有启动其它程序的Activity才会创建一个新的任务
"singleInstance"
这种启动模式和"singleTask"有点相似,只不过系统不会向声明成"singleInstance"的Activity所在的任务当中再添加其它Activity。也就是说,这种Activity所在的任务中始终只会有一个Activity,通过这个Activity再打开的其它Activity也会被放入到别的任务当中。
FLAG_ACTIVITY_NEW_TASK
设置了这个flag,新启动Activity就会被放置到一个新的任务当中(与"singleTask"有点类似,但不完全一样),当然这里讨论的仍然还是启动其它程序中的Activity。这个flag的作用通常是模拟一种Launcher的行为,即列出一推可以启动的东西,但启动的每一个Activity都是在运行在自己独立的任务当中的。
FLAG_ACTIVITY_SINGLE_TOP
设置了这个flag,如果要启动的Activity在当前任务中已经存在了,并且还处于栈顶的位置,那么就不会再次创建这个Activity的实例,而是直接调用它的onNewIntent()方法。这种flag和在launchMode中指定"singleTop"模式所实现的效果是一样的。
FLAG_ACTIVITY_CLEAR_TOP
设置了这个flag,如果要启动的Activity在当前任务中已经存在了,就不会再次创建这个Activity的实例,而是会把这个Activity之上的所有Activity全部关闭掉。比如说,一个任务当中有A、B、C、D四个Activity,然后D调用了startActivity()方法来启动B,并将flag指定成FLAG_ACTIVITY_CLEAR_TOP,那么此时C和D就会被关闭掉,现在返回栈中就只剩下A和B了。
finishOnTaskLaunch
这个属性和clearTaskOnLaunch是比较类似的,不过它不是作用于整个任务上的,而是作用于单个Activity上。如果某个Activity将这个属性设置成true,那么用户一旦离开了当前任务,再次返回时这个Activity就会被清除掉。