標籤:
Android四大組件:Activity,Service,Broadcast Receiver,Content 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子標籤,其中再配置action和category
應用情境
啟動同一應用中的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
Activity的橫豎屏切換
Activity銷毀時返回資料
步驟:
指定請求碼requestCode啟動新的Activity
startActivityForResult(intent, requestCode);
在新的Activity中設定要返回的資料
Intent data = new Intent();data.putExtra("tel", tel);setResult(resultCode, data); // 指定一個結果碼resultCode,並把資料會返回給原Activityfinish();
在原Activity裡面實現方法
//通過data擷取返回的資料onActivityResult(int requestCode, int resultCode, Intent data) {}
通過判斷請求碼和結果碼確定傳回值data的作用
Android應用開發-頁面跳轉與資料傳遞(重製版)