Android四大組件——Activity

一. 什麼是Activity?

  1. Activity是android四大組件之一!!
  2. Activity 是一個應用組件,用戶可與其提供的屏幕進行交互
  3.  每個 Activity 都會獲得一個用於繪製其用戶界面的窗口。窗口通常會充滿屏幕,但也可小於屏幕並浮動在其他窗口之上。
  4.  一個應用通常由多個彼此鬆散聯繫的 Activity 組成。 一般會指定應用中的某個 Activity 爲“主” Activity, 即首次啓動應用時呈現給用戶的那個 Activity 
  5.  當一個 Activity 因某個新 Activity 啓動而停止時,系統會通過該 Activity 的生命週期回調方法通知其這一狀態變化

二. 基本狀態

android 中,Activity 擁有四種基本狀態:

  1. Active/Running
    一個新 Activity 啓動入棧後,它顯示在屏幕最前端,處理是處於棧的最頂端(Activity棧頂),此時它處於可見並可和用戶交互的激活狀態,叫做活動狀態或者運行狀態(active or running)。
  2. Paused
    當 Activity失去焦點, 被一個新的非全屏的Activity 或者一個透明的Activity 被放置在棧頂,此時的狀態叫做暫停狀態(Paused)。此時它依然與窗口管理器保持連接,Activity依然保持活力(保持所有的狀態,成員信息,和窗口管理器保持連接),但是在系統內存極端低下的時候將被強行終止掉。所以它仍然可見,但已經失去了焦點故不可與用戶進行交互。
  3. Stopped
    如果一個Activity被另外的Activity完全覆蓋掉,叫做停止狀態(Stopped)。它依然保持所有狀態和成員信息,但是它不再可見,所以它的窗口被隱藏,當系統內存需要被用在其他地方的時候,Stopped的Activity將被強行終止掉。
  4. Killed
    如果一個Activity是Paused或者Stopped狀態,系統可以將該Activity從內存中刪除,Android系統採用兩種方式進行刪除,要麼要求該Activity結束,要麼直接終止它的進程。當該Activity再次顯示給用戶時,它必須重新開始和重置前面的狀態。

三. Activity的創建

  1. 創建對應的佈局
  2. 創建一個類去繼承Activity或者其子類
    可以創建一個Activity的子類,做一些公共的事情,讓所有Activity繼承他!!
  3. 重寫onCreate生命週期方法
  4. onCreate方法中,添加setContentView方法,參數可以是layout中寫好的佈局,也可以是在java代碼中添加的view
  5. 在清單文件中註冊

注意:在清單文件中<activity>的name屬性是隱藏了包名

<activity android:name="com.yjh.createactivity.and_createactivity.SecondActivity"/>

在實際開發中最好是寫全路徑的名稱,以防止activity創建在其他包下導致頁面跳轉失敗

四. Activity生命週期

生命週期

1、一個Activity的創建和銷燬生命週期

        --當Activity運行時所走的生命週期

            當Activity初次運行的時候:onCreate() --> onStart() --> onResume

            當Activity銷燬的時候:onPause() --> onStop() --> onDestory()

            當點擊了菜單鍵,Activity被切換到了後臺後又被切換到前臺,重新獲取焦點的時候:

                        onPause() --> onStop() --> onRestart() --> onStart() --> onResume()

2、可見和前端生命週期

            可見的生命週期     (onStart() -----> onStop)兩者之間都是可見的,但是不包括這兩個方法

            前端生命週期        (onResume -----> onPause)兩者之間都是在最前端的,可與用戶交互

        onStart()在Activity即將對用戶可見之前是調用

        onStop()

3、兩個Activity切換,所走的生命週期

        onPause()  暫停  當頁面失去焦點的時候調用的生命週期! 可能預示着用於不會再回來了,需要保留用戶的頁面的數據!

        注意:onPause()方法中,不能做耗時操作!

        原因:因爲第一個頁面只有當第一個onPause()執行完畢後纔會創建下一個頁面!如果做耗時操作,影響下一個頁面的跳出

                        降低用戶體驗度!!

4、 生命週期如何使用: 合理利用生命週期 讓程序開發更靈活更強大

onCreate:全局變量的初始化、 layout加載

onstart:註冊廣播

onResume :生命優先級最高

onPause:可以保存一些數據,******但是必須是耗時操作小的動作!!!!!

       如果做過多耗時操作,影響下一個頁面開啓

onStop:可以做一下輕量級的耗時操作,去保存數據!!

onDestory: 釋放資源、 全局變量置空

5、發生異常時候的生命週期

        橫豎屏的切換!!!

        思考  手機橫豎屏切換回影響生命週期嗎?

        答:會!會銷燬當前頁面,並且重新加載!!

        現場保護:在發生異常的時候,保存之前的狀態

            1、不讓生命週期重新執行

android:configChanges="orientation|screenSize|keyboardHidden"

            2、把屏幕的方向直接控制住  水平或者垂直

                    landscape  水平

                    portrait      垂直

            3、發生異常在對應的方法中

                    onSaveInstanceState 在onPause方法之後調用,我們可以進行數據的保存!!

                    onRestoreInstanceState 在重啓後onStart方法進行調用,我們可以拿出保留的數據!!

五. Activity基本頁面跳轉及傳值

1、頁面跳轉

實現界面跳轉的四種方式(顯示意圖):

方式一:Intent(Context, Class<?>)

// 參數一:上下文;參數二:目的界面對應的Class的實例
startActivity(new Intent(this, NewActivity.class));

方式二:intent.setClassName(packageContext, className);

// 參數一:上下文;參數二:目的界面對應的類的全限定名
Intent intent = new Intent();
intent.setClassName(this, "com.pinkcandy.day07_03_activitycreatedemo.NewActivity");
startActivity(intent);

方式三:intent.setClassName(packageName, className)

// 參數一:源界面的包名;參數二:目的界面對應的類的全限定名
Intent intent = new Intent();
intent.setClassName(getPackageName(), "com.l000phone.day07_03_activitycreatedemo.NewActivity");
startActivity(intent);

方式四:intent.setClassName(packageName, className)

// 參數一:源界面的包名;參數二:目的界面對應的類的全限定名
Intent intent = new Intent();
ComponentName component = new ComponentName(this, NewActivity.class);
intent.setComponent(component);
startActivity(intent);

2、傳值

    1、直接傳值

            直接將值放到Intent中  intent.putExtra(key,valuse);

            getIntent() 獲取其他頁面傳遞過來的數據

            Intent中取值

            intent.get類型Extra(key,defultVal)

    2、Bundle傳值

            直接傳值,在連續多頁面的時候,會比較麻煩,所以我們可以把數據放到Bundle中在進行傳遞!

            放值intent.putExtras(Bundle);

            取值Bundle bundle = intent.getExtras ();

    3、傳遞對象

        傳遞對象需要利用 1  2 種方法,需要對象類序列化  實現Serializable

    4、利用Application傳值

        1、創建一個類來繼承Application

        2、在清單文件中,application標籤下聲明  android:name屬性  並指向Application

 如何獲取Application中的對象!!

getApplication() 單例模式可以獲取對象,賦值或者取值

奇葩的寫法:(不推薦)

將靜態屬性的特徵發揮到極致,設計一個全局類,該類中所有的屬性都是public static的全局變量。

跳轉至其他程序:

          //利用顯示意圖,跳轉到其他程序的Activity
          Intent intent3 = new Intent();

          //注意:目標程序已經在手機安裝過
          //參數1: 目標程序的包名    (清單文件中)
          //參數2: 目標程序Activity的全路徑
          ComponentName componentName = new  ComponentName("com.example.android_day06_launch02", "com.example.android_day06_launch02.MainActivity" );
          intent3.setComponent(componentName);
          startActivity(intent3);

六. 啓動Activity回傳數據

Activity具有返回值的頁面跳轉

需求:用戶登錄界面,根據用戶的賬號和姓名進行登錄操作,數據傳遞到目的界面後,目的界面進行check,若與後臺保存的信息吻合,就向源界面提示

“登錄成功信息!”,否則,就提示“登錄失敗信息!”。

請求碼的作用:

用來標識源界面上到底是哪個控件觸發的界面跳轉事件

結果碼的作用:

用來標識目的界面上到底是哪個控件觸發數據回傳的動作。

        1.在首頁跳轉時添加請求碼

        //跳轉頁面並要求返回值
        //參數1: 意圖
        //參數2: 請求碼 區分請求
        startActivityForResult(intent, REQUEST_CODE);

        2.第二個頁面設置結果

        Intent intent = new Intent();
        intent.putExtra("data", "我是第二個頁面傳遞的數據");
        setResult( RESULT_OK, intent);
        finish(); //關閉當前頁面

        3.第一個頁面獲取結果(重寫回調方法onActivityResult)

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        // 進行邏輯操作
    }

七. Activity啓動模式及Intent屬性的特點及用法

詳解Activity啓動模式

Intent屬性的特點及用法

後期進行詳細介紹

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章