1. 程式人生 > >Activity、Fragment生命週期---橫豎屏切換的生命週期

Activity、Fragment生命週期---橫豎屏切換的生命週期

先貼出一張大家眾所周知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日誌,按下回退鍵

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也會被放入到別的任務當中。

                                                                               使用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就會被清除掉。

-----------------------------------------------------------------------fragment生命週期----------------------------------------------------------------------


程式碼預設定位到朋友介面,但是測試程式碼在通訊錄第二個頁面進行的測試。。

1 是初始化進入

2 是點選button,進入enter頁面

3 是關掉enter頁面,回到fragment頁面

4是鎖螢幕

5是開屏

6是回到桌面

7從桌面進入專案

8是啟動多視窗

9是從任務列表進入

10退出

相關推薦

ActivityFragment生命週期---橫豎切換生命週期

先貼出一張大家眾所周知activity流程圖 onCreate():建立Activity呼叫,用於Activity的初始化,還有個Bundle型別的引數,可以訪問以前儲存的狀態。onStart():Activity在螢幕上對使用者可見時呼叫,但還不可與使用者互動  on

ActivitFragment生命週期橫豎切換的一些問題 及解決方案

Activity 的生命週期: 1.onCreate():表示Activity 正在被建立 第一個方法 載入一些介面佈局檔案,初始化Activity 2.onRestart(): 重新啟動 3.onStart():當前Activity 正在啟動 即將開始 已經可見了。還沒有出現在

FragmentActivity生命週期以及橫豎切換生命週期的影響

生命週期變化 : 切換到該Fragment 05-21 14:26:35.095: D/FragmentDemo(7649): onAttach 05-21 14:26:35.095: D/FragmentDemo(7649): onCreate 05-21 14:26:35.095: D/Frag

android橫豎切換activity生命週期方法是否會回撥

預設情況下的一個應用,沒有在androidmainfest檔案進行任何設定一切都是預設的情況下,我們當改變了他的orientation時候是會銷燬當前activity,新建一個新的activity public void orien(View view)

fragment橫豎切換生命週期的變化

fragment 啟動 08-24 13:48:54.608 11678-11678/I/TAG: onAttach 08-24 13:48:54.608 11678-11678/I/TAG: onC

Android橫豎切換, 手機鎖以及按Home鍵和返回鍵時的Activity生命週期

用手機做了實驗,結果如下: 豎屏切橫屏會呼叫完整的生命週期: 03-09 17:08:35.170: I/MainActivity(14086): MainActivity Paused 03-09 17:08:35.200: I/MainActivity(14086):

橫豎切換時重構Activity生命週期的問題---android:configChanges的用法

public void onConfigurationChanged(Configuration newConfig) {          try {              super.onConfigurationChanged(newConfig);              if (th

橫豎切換時候Activity生命週期

2、執行Activity,得到如下資訊onCreate-->onStart-->onResume-->3、切換成橫屏時 onConfigurationChanged-->onPause-->onSaveInstanceState-->onStop-->onDestro

淺析Activity橫豎切換時的生命週期

1.AndroidManifest沒有設定configChanges屬性豎屏啟動:onCreate -->onStart-->onResume切換橫屏:onPause -->onSaveInstanceState -->onStop -->onD

橫豎切換時候Activity生命週期的總結

曾經遇到過一個面試題,讓你寫出橫屏切換豎屏Activity的生命週期。現在給大家分析一下他切換時具體的生命週期是怎麼樣的: 1、新建一個Activity,並把各個生命週期打印出來 2、執行Activity,得到如下資訊 onCreate--> onStart-

android橫豎切換按home鍵按返回鍵所觸發的生命週期

程式執行:onCreate()->onStart()->onResume() 按home鍵:onPause()->onSaveInstanceState()->onStop

android-----橫豎切換Activity生命週期的影響

       前面我們分析過Activity的生命週期(見:android-----Activity生命週期),但是在現實應用中我們可能會對手機進行橫豎屏切換,那麼這樣的切換對Activity的生命週

橫豎切換activity生命週期變化的總結

activity的生命週期變化想必大家都耳熟能詳,但是橫豎屏切換時activity生命週期變化很多人肯定還很迷糊,最近在網上查詢的資料總結的大都不全面,最後在部落格園上看到一哥們總結的挺好, so,自己也寫了個demo測試了一下,發現橫豎屏切換時activity生命週期不僅

ActivityFragmentServiceView生命週期

1. Activity 生命週期      onCreate : 該方法是在Activity被建立時回撥,它是生命週期第一個呼叫的方法,我們在建立Activity時一般都需要重寫該方法,然後在該方法中做一些初始化的操作,如通過setContentView設

android 橫豎切換生命週期

如下設定,當橫豎屏切換時,activity的狀態是不會改變的 在manifest中設定該Activity的configChanges為android:configChanges="screenSize|keyboardHidden|orientation" 總結如下:

如何處理Activity橫豎切換fragment會新增一個被又new一次的現象

當螢幕發生旋轉,Activity發生重新啟動,依附在Activity中的Fragment也會跟著Activity重新建立; 這樣造成當旋轉的時候,本身存在的Fragment會重新啟動,然後當執行Activity的onCreate時,又會再次例項化一個新的Fragment,這

android 橫豎切換不重走生命周期

orien man ati nta 系統 生命周期 oar hang andro android在系統配置發生改變時,Activity會被重新創建,但是某些情況下我們希望系統配置改變時不會重新創建Activity,這個時候我們可以給Activity指定相對應的configC

應用橫豎切換造成UI改變 資料丟失的處理 onConfigurationChanged

我們直接進入主題 應該如何來解決這個問題呢 步驟一 許可權宣告: <uses-permission android:name="android.permission.CHANGE_CONFI

橫豎切換Fragment

  【1】寫兩個類繼承android.app.Fragment;  【2】在Mainactivity 中獲取視窗大小,判斷橫豎屏進行更換。 FragmentManager 動態注入     protected

ActivityFragment設定切換動畫及ViewGroup中子元素出場方式

1、Activity之間切換的動畫 特別提示:Activity之間的切換動畫有很多種方式,這裡僅僅摘抄上文中提到的部落格(http://www.jianshu.com/p/733532041f46 )中的方法,想要學習更多方法可參考這篇部落格(http://blog.csdn.net/q