Android應用開發-頁面跳轉與資料傳遞(重製版)

來源:互聯網
上載者:User

標籤:

 

  Android四大組件:ActivityServiceBroadcast ReceiverContent Provider

 

 

建立Activity

 

  • 定義Java類,繼承Activity類

  • 在資訊清單檔中配置activity標籤

    • activity標籤下如果帶有下面這部分代碼,則會在系統中多建立一個快捷表徵圖

      <intent-filter>    <action android:name="android.intent.action.MAIN" />    <category android:name="android.intent.category.LAUNCHER" /></intent-filter>

       

    • 一個應用程式可以在案頭建立多個快捷表徵圖。

    • Activity的名稱、表徵圖可以和應用程式的名稱、表徵圖不相同

      android:icon="@drawable/ic_launcher"android:label="@string/app_name"

       

 

Activity的跳轉

 

  Activity的跳轉需要建立Intent對象,通過設定Intent對象的參數指定要跳轉Activity

    通過指定Activity實現跳轉,稱為顯式意圖

    通過指定動作實現跳轉,稱為隱式意圖

 

顯式跳轉
  • 跳轉至同一應用中的Activity

    Intent intent = new Intent();intent.setClass(this, SecondActivity.class);// 指定當前的上下文和目標Activity的位元組碼startActivity(intent);

     

  • 跳轉至不同應用中的Activity

    Intent intent = new Intent();// 指定目標Activity所在的應用的包名和目標Activity的包名加類名,這裡啟動系統內建的撥號器應用intent.setClassName("com.android.dialer", "com.android.dialer.DialtactsActivity");startActivity(intent);

     

 

隱式跳轉
  • 隱式意圖跳轉至打電話Activity

    Intent intent = new Intent();intent.setAction(Intent.ACTION_CALL);intent.setData(Uri.parse("tel:10086"));startActivity(intent);

     

  • 要讓一個Activity可以被隱式啟動,需要在該應用資訊清單檔下的activity標籤下配置intent-filter子標籤

  • 系統會在所有應用的資訊清單檔中尋找與我們建立的隱式Intent匹配的intent-filter,找到則啟動,找不到則拋異常

  • 匹配就是intent-filter中定義了什麼屬性,我們建立的intent中也必須設定什麼屬性

  • 在資訊清單檔的activity標籤下,配置intent-filter子標籤,其中再配置actioncategory

 

 

應用情境
  • 啟動同一應用中的Activity,用顯式Intent。顯式啟動效率明顯高於隱式,因為顯示直接指定了目標Activity,隱式需要遍曆所有應用的資訊清單檔

  • 啟動不同應用中的Activity,用隱式Intent。當使用隱式Intent跳轉到其他應用中的Activity時,如果系統找到了多個intent-filter與我們建立的Intent匹配,就會彈出對話方塊,列舉所有匹配的Activity,讓使用者選擇。比如我們的手機裡如果安裝了多款瀏覽器App,當我們點擊一個URL時,會彈出一個對話方塊讓我們選擇使用哪個瀏覽器來開啟這個網頁,這就是因為跳轉到瀏覽器Activity用的是隱式Intent;有些應用的Activity啟動時需要接收資料,比如打電話Activity需要接收電話號碼,也只能用隱式Intent

 

 

Activity跳轉時的資料傳遞

 

  • Activity跳轉時,可以把資料封裝在Intent中

    Intent intent = new Intent(this, SecondActivity.class);intent.putExtra("name", name);intent.putExtra("age", age);startActivity(intent);

     

  • Intent中可以封裝的資料類型:八大基礎資料型別 (Elementary Data Type)和字串以及它們的數組,還有實現了序列化介面的對象,還有Bundle對象。資料也可以先封裝至Bundle,再把Bundle封裝至Intent

  • 在跳轉到的目標Activity中取出資料

    Intent intent = getIntent();    // 擷取啟動該Activity的IntentString name = intent.getStringExtra("name");int age = intent.getIntExtra("age");

     

 

Activity的生命週期

 

 

  • onCreate():建立Activity時被回調

  • onStart():在螢幕上可見,但是還沒有獲得焦點

  • onResume():可見並且獲得焦點

  • onPause():可見,但是失去焦點

  • onStop():不可見

  • onDestroy():銷毀時調用

  • onRestart():Activity從不可見變為可見時調用

 

  • 按返回鍵,系統依次回調onPause()onStop()onDestroy(),Activity被銷毀,進程還在;若再次進入該Activity,系統會依次回調onCreate()onStart()onResume(),Activity重新進入運行狀態

    • 按返回鍵,Android系統會回調onBackPressed()方法,該方法調用了finish(),所以Activity會被銷毀
  • 按Home鍵,系統依次回調onPause()onStop(),Activity進入停止狀態,進程還在;若再次進入該Activity,系統會依次回調onRestart()onStart()onResume(),Activity重新進入運行狀態

  • 手機記憶體不足時,會殺死之前啟動的進程,按照LRU(最近最少使用)演算法鎖定殺死哪個進程

 

 

Activity的四種啟動模式

 

  每個應用有一個Activity Task棧,存放已啟動的Activity。Activity的啟動模式決定了Task棧的操作規則

 

  • standard:預設就是標準模式,每次通過這種模式來啟動目標Activity時,Android總會為目標Activity建立一個新的執行個體,並將該Activity執行個體添加到Task棧中

  • singleTop:Task棧頂單例模式,與標準模式僅有一點不同:當要啟動的目標Activity已經位於Task棧頂時,系統不會重新建立目標Activity的執行個體,而是直接複用已有的Activity執行個體

    • 應用:瀏覽器書籤記錄介面CombinedBookmarkHistoryActivity
    • 應用:簡訊會話記錄介面ConversationList
  • singleTask:Task棧內單例模式,採用這種啟動模式的Activity在同一個Task棧內只能有一個執行個體。如果Activity沒有被建立任何執行個體,那麼啟動時會建立併入棧;如果已經被建立了一個執行個體,那麼啟動時會返回(退棧)至該Activity

    • 應用:瀏覽器瀏覽介面BrowserActivity
  • singleInstance:全域單例模式,採用這種啟動模式的Activity在整個Android系統記憶體中只能有一個執行個體。如果將要啟動的目標Activity不存在,系統會先建立一個全新的Task棧,再建立目標Activity的執行個體,並將他壓入新的Task棧頂;如果將要啟動的目標Activity已經存在,無論它位於哪個應用程式中、位於哪個Task棧中,系統都會把該Activity所在的Task棧轉到前台,從而使該Activity顯示出來。需要指出的是,採用singleInstance模式啟動的Activity總是位於Task棧頂,且該Task棧中只有該Activity

    • 應用:來電介面InCallScreen

 

 

Activity的橫豎屏切換

 

  • 預設情況橫豎屏切換會使Activity銷毀重建,觸發生命週期方法重新執行

  • 在一些特殊的應用程式中,比如遊戲,不希望橫豎屏切換導致Activity被銷毀重建,如果不儲存會丟失遊戲資料

    • 在資訊清單檔中用以下代碼讓橫豎屏切換時不重建Activity

      android:configChanges="orientation|screenSize|keyboardHidden"

       

    • 在資訊清單檔中可用以下代碼寫死Activity的螢幕方向

      android:screenOrientation="portrait"     <!-- 豎屏-->android:screenOrientation="landscape"    <!-- 橫屏-->

       

    • 在java檔案中可用以下代碼寫死Activity的螢幕方向(會覆蓋資訊清單檔中的設定)

      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);  // 豎屏setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); // 橫屏

       

 

Activity銷毀時返回資料

 

步驟:
  1. 指定請求碼requestCode啟動新的Activity

    startActivityForResult(intent, requestCode);

     

  2. 在新的Activity中設定要返回的資料

    Intent data = new Intent();data.putExtra("tel", tel);setResult(resultCode, data);  // 指定一個結果碼resultCode,並把資料會返回給原Activityfinish();

     

  3. 在原Activity裡面實現方法

    //通過data擷取返回的資料onActivityResult(int requestCode, int resultCode, Intent data) {}

     

  4. 通過判斷請求碼和結果碼確定傳回值data的作用

    • 先通過請求碼requestCode判斷返回的data來自哪個Activity

    • 再通過該Activity返回的結果碼resultCode判斷data中是該Activity所返回的哪一個資料

 

Android應用開發-頁面跳轉與資料傳遞(重製版)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.