Activity生命周期---横竖屏切换的生命周期

Activity生命周期---横竖屏切换的生命周期_第1张图片

先贴出一张大家众所周知activity流程图

  1. onCreate():创建Activity调用,用于Activity的初始化,还有个Bundle类型的参数,可以访问以前存储的状态。
  2. onStart():Activity在屏幕上对用户可见时调用,但还不可与用户交互
  3.   onRestart():在activity停止后,在再次启动之前被调用。
  4. onResume():Activity开始和用户交互的时候调用,这时该Activity是在Activity栈的顶部,并接受用户输入
  5. onPause():Activity被暂停时调用,也就是你要对你能看到的这个Activity说byebye的时候调用,这里可以做一些清理和保存工作
  6. onStop():Activity被停止或者Activity变成不可见时调用
  7. onDestroy():Activity被从内存中移除,一般发生在执行finish方法时或者Android回收内存的时候


预想深刻体会生命周期,得需要在实践中慢慢记忆,写个简单的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>


MainActivity--主界面代码

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

}

SecondAty布局只有一个textView,代码直接加载布局即可---这里省略了。。。。。。

Log1、在清除缓存、杀死进程的前提下,启动项目:

Log2、启动项目后,清除Log1日志,按下回退键


Activity生命周期---横竖屏切换的生命周期_第2张图片

Log3、启动项目后,清除Log1日志,然后回到桌面,走蓝色框---桌面启动项目,走黑色框

Activity生命周期---横竖屏切换的生命周期_第3张图片


Log4、启动项目后,清除Log1日志,然后长按进入任务列表界面,走蓝色框---杀掉进程,走onDestroy

Activity生命周期---横竖屏切换的生命周期_第4张图片

Log5、启动项目后,清除Log1日志,点击button进入某个Aty,走蓝色框,然后点击返回键回到主界面,走黑色框


Log6、启动项目后,清除Log1日志,锁屏走蓝色框,开屏走黑色框

Activity生命周期---横竖屏切换的生命周期_第5张图片


基本上项目启动,回退,回到桌面,杀死线程,跳转,锁屏,开屏都测试了,大家还是在项目中慢慢记忆把

接下来看屏幕旋转,首先要在手机设置中进行设置可以进行屏幕旋转操作


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",旋转屏幕至横屏

Activity生命周期---横竖屏切换的生命周期_第6张图片

再由横屏切换会竖屏幕时候

Activity生命周期---横竖屏切换的生命周期_第7张图片

走的流程是一样的


3、加上这行属性 android:configChanges="orientation|keyboardHidden"在进行旋转屏幕--就是多了一个onConfigurationChanged

再由横屏切换会竖屏幕时候

Activity生命周期---横竖屏切换的生命周期_第8张图片

走的流程是一样的



启动模式

singleTask"

检测要启动的这个Activity的affinity和当前任务的affinity是否相同,如果相同的话就会把它放入到现有任务当中,如果不同则会去创建一个新的任务。

如果现有任务当中已经存在一个该Activity的实例了,那么系统就不会再创建一次它的实例,而是会直接调用它的onNewIntent()方法

注意这里我们所说的启动Activity,都指的是启动其它应用程序中的Activity,因为"singleTask"模式在默认情况下只有启动其它程序的Activity才会创建一个新的任务


"singleInstance"

这种启动模式和"singleTask"有点相似,只不过系统不会向声明成"singleInstance"的Activity所在的任务当中再添加其它Activity。也就是说,这种Activity所在的任务中始终只会有一个Activity,通过这个Activity再打开的其它Activity也会被放入到别的任务当中。

                                                                               使用Intent flags

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就会被清除掉。

你可能感兴趣的:(Activity生命周期---横竖屏切换的生命周期)