Activity 使用方法詳解

2021-03-06 程式設計師Android

和你一起終身學習,這裡是程式設計師Android

經典好文推薦,通過閱讀本文,您將收穫以下知識點:

一、Activity 概覽
二、Activity 生命周期
三、Activity 的註冊方法
四、App的MainActivity
五、Activity 的啟動方法
六、Activity結束方法
七、Activity狀態保存,恢復的方法
八、面試中經常問到題型

一、Activity 概覽

Activity是Android最基本的四大組件之一(Activity 活動,Service 服務,ContentProvider內容提供者,BroadcastReceiver 廣播),Activity主要負責與用戶進行交互,是每位Android開發必須掌握的知識點。四大組件必須在AndroidMainfest.xml 文件中聲明。

Activity 繼承關係如下:

java.lang.Object
↳ android.content.Context
↳ android.content.ContextWrapper
↳ android.view.ContextThemeWrapper
↳ android.app.Activity

理解完Activity的繼承關係後,我們開始了解Activity的聲明周期,Activity的生命周期直接影響到與用戶的交互,此生命周期很重要。

二、Activity 生命周期

Activity 生命周期圖如下:

Activity 生命周期圖


在代碼中Activity生命周期回調方法如下:

// Activity 創建方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i(TAG, "----onCreate----");
setContentView(R.layout.activity_methods);
}

// Activity 在最新任務列表中打開時候會走此方法
@Override
protected void onRestart() {
super.onRestart();
Log.i(TAG, "----onRestart----");
}

// Activity 在onCreate 或者 onRestart之後執行
@Override
protected void onStart() {
super.onStart();
Log.i(TAG, "----onStart----");
}

// 正在與用戶交互的界面
@Override
protected void onResume() {
super.onResume();
Log.i(TAG, "----onResume----");
}

// 被其他與用戶交互的Activity 部分覆蓋
@Override
protected void onPause() {
super.onPause();
Log.i(TAG, "----onPause----");
}

// 被其它與用戶交互的Activity 全部覆蓋
@Override
protected void onStop() {
super.onStop();
Log.i(TAG, "----onStop----");
}

// Activity 銷毀時候調用此方法
@Override
protected void onDestroy() {
super.onDestroy();
Log.i(TAG, "----onDestroy----");
}

根據不同的生命周期狀態,Activity可以分為以下四種生命周期狀態

1.Active 運行狀態

2.Pause 暫停狀態

3.Stop 停止狀態

4.Killed 消亡狀態

三、 Activity的註冊方法

Activity是四大組件之一,Android規定四大組件必須在AndroidMainfest.xml 中註冊,Activity如果不註冊,則會引起 App Crash。比如以下常見的ActivityNotFoundException。

例如以下ActivityNotFoundException報錯信息:


//提示未在 AndroidMainfest.xml 中找到Activity類的聲明
android.content.ActivityNotFoundException:
Unable to find explicit activity class
//具體類名,包名如下:
{com.wj.utils/com.wj.utils.basewidget.BaseButtonMethods};
//需要在AndroidManifest 中聲明
have you declared this activity in your AndroidManifest.xml?

ActivityNotFoundException 異常Log 分析 

因此,我們在使用Activity的時候必須在AndroidMainfest.xml中註冊,註冊方法如下:

<manifest ... >
<application ... >
<activity android:name=".BaseButtonMethods" />
...
</application ... >
...
</manifest >

四、App的MainActivity

一個App會有多個Activity,那麼我們如何知道哪個Activity是 Main Activity呢?
其實Android 是通過android.action.MAIN 標籤來區別當前App的入口 Main Activity類。

另外 一半跟隨著android.action.MAIN標籤的地方,同時還有
android.intent.category.LAUNCHER這個標籤,它表示 此Action 會被Launcher掃描到,並可以顯示在Launcher的app list列表中。如果去掉此Action標籤,則無法在Launcher中查看到此app的圖標。

常見舉例如下:

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

五、Activity 的啟動方法

Activity 的啟動方法大致分顯示啟動、隱式啟動、帶返回參數啟動三種。

1. 顯示啟動

顯示啟動常用於app 內部Activity 的啟動,使用方法如下:


Intent intent = new Intent(ActivityMethods.this, OtherActivity.class)
startActivity(intent);

2. 隱式啟動

隱式啟動即可以調用App內部Activity ,也可以調用其他過濾到包含啟動Action 的Activity。使用方法如下:


Intent intent = new Intent("string_action");
//或者分開設置Action也可以
// intent.setAction("string_action");
startActivity(intent);

3. 啟動帶返回值的Activity

開發過程中我們經常需要啟動一個Activity ,然後返回一些數據給啟動的Activity,這時候,使用以下啟動帶返回值的Activity 是最合適的方法。使用方法舉例如下:

... ...
// 1.啟動要返回數據的Activity
Intent intent = new Intent();
intent.setClass(ActivityMethods.this, OtherActivity.class);
startActivityForResult(intent, mRequestCode);
... ...

// 2.獲取並處理 啟動返回Activity 返回結果攜帶的數據
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == mRequestCode && resultCode == mResultCode) {
String result = data.getStringExtra("str_set_result");
Toast.makeText(this, "result :" + result, Toast.LENGTH_SHORT).show();
}

}

2. 設置並返回 Bundle 數據類型的數據給啟動的Activity


int resultCode = 101;
Intent intent = new Intent();
intent.putExtra("str_set_result", "帶返回結果的Activity");
setResult(resultCode, intent);

六、Activity結束 方法

如果想結束掉當前Activity ,可以調用一下方法


//1.直接調用finish方法 ,結束當前Activity
finish();
//2.根據請求碼結束Activity
finishActivity(int requestCode);

七、 Activity狀態保存,恢復的方法

當Activity異常退出時候,Activity會自動保存一些數據。為了安全起見,如果是App重要的數據,還請在代碼中手動保存Bundle類型的數據,防止Activity自動保存的數據沒有保存完整。

Activity 狀態保存與恢復的周期圖如下:

Activity 狀態保存生命周期圖

代碼中 Activity狀態保存與恢復的回調方法如下:


// Activity 恢復數據的方法,經常在 oncreate 方法中恢復數據
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.i(TAG, "----onRestoreInstanceState----");
}

// Activity 保存數據的方法,經常在 onPause 方法中保存數據
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
super.onSaveInstanceState(outState, outPersistentState);
Log.i(TAG, "----onSaveInstanceState----");
}

八、 面試中常問的題型1. Activity A 啟動 Activity B, 然後再返回A,簡述一下 A與B生命周期的調用方法。

01-02 21:25:22.357 21225-21225/com.android.program.programandroid I/ActivityMethods wjwj:: ----onCreate----
01-02 21:25:22.396 21225-21225/com.android.program.programandroid I/ActivityMethods wjwj:: ----onStart----
01-02 21:25:22.402 21225-21225/com.android.program.programandroid I/ActivityMethods wjwj:: ----onResume----

01-02 21:28:30.617 23845-23845/com.android.program.programandroid I/ActivityMethods wjwj:: ----onPause----
01-02 21:28:30.723 23845-23845/com.android.program.programandroid I/OtherActivity wjwj:: ----onCreate----
01-02 21:28:30.729 23845-23845/com.android.program.programandroid I/OtherActivity wjwj:: ----onStart----
01-02 21:28:30.738 23845-23845/com.android.program.programandroid I/OtherActivity wjwj:: ----onResume----
01-02 21:28:31.320 23845-23845/com.android.program.programandroid I/ActivityMethods wjwj:: ----onStop----

01-02 21:29:38.646 23845-23845/com.android.program.programandroid I/OtherActivity wjwj:: ----onPause----
01-02 21:29:38.668 23845-23845/com.android.program.programandroid I/ActivityMethods wjwj:: ----onRestart----
01-02 21:29:38.672 23845-23845/com.android.program.programandroid I/ActivityMethods wjwj:: ----onStart----
01-02 21:29:38.674 23845-23845/com.android.program.programandroid I/ActivityMethods wjwj:: ----onResume----
01-02 21:29:39.058 23845-23845/com.android.program.programandroid I/OtherActivity wjwj:: ----onStop----
01-02 21:29:39.059 23845-23845/com.android.program.programandroid I/OtherActivity wjwj:: ----onDestroy----

總結:
Activity A啟動 Activity B, 簡述一下其生命周期?大致流程如下圖:

Activity A 啟動 Activity B, 然後再返回A生命周期大致圖

至此,本篇已結束。轉載網絡的文章,小編覺得很優秀,歡迎點擊閱讀原文,支持原創作者,如有侵權,懇請聯繫小編刪除。同時感謝您的閱讀,期待您的關注。

相關焦點

  • Activity 使用詳解
    因此,我們在使用Activity的時候必須在AndroidMainfest.xml中註冊,註冊方法如下:<manifest ... ><application ...顯示啟動顯示啟動常用於app 內部Activity 的啟動,使用方法如下:Intent intent = new Intent(ActivityMethods.this, OtherActivity.class) startActivity(intent);
  • 微波爐使用方法詳解
    【導讀】微波爐是利用微波輻射進行加熱的,食物中一般都含有一定的水分,而水是由極性分子所組成的,這種極性分子會隨著微波磁場的變動而變化。食物中極性分子會和相鄰分子之間相互產生作用,使水溫不斷的升高,食物的溫度也隨之升高。微波爐使用時要安放在平整、通風的臺面或擱架上。
  • PS中濾鏡如何使用?PS濾鏡的使用方法詳解
    PS中濾鏡如何使用?PS濾鏡的使用方法詳解!ps中的濾鏡非常強大,往往可以做出我們意想不到的好看畫面,想要熟練的運用這個工具,這就需要大家在平時自己多多實踐,有事沒事就練練。這裡微課菌就做個簡單的例子來讓你體會一下濾鏡的強悍。
  • 《明日之後》攀爬繩索怎麼使用 攀爬繩索使用方法詳解
    不過很多新手玩家還不太了解明日之後攀爬繩索怎麼用,下面小編就為大家帶來明日之後攀爬繩索使用方法詳解,一起來看看吧。 攀爬繩索可以在破損的屋頂下使用,因此玩家要想通過繩索從一樓爬到二樓的話,需要先將二樓的地板擊破,接著只要將繩索往上面扔,就能形成一個繩子讓玩家爬上去了。
  • 畫中畫使用方法教程圖文詳解
    畫中畫使用方法教程圖文詳解時間:2020-11-24 23:41   來源:今日頭條   責任編輯:毛青青 川北在線核心提示:原標題:剪映畫中畫視頻怎麼弄?畫中畫使用方法教程圖文詳解 剪映畫中畫視頻怎麼製作?剪映視頻製作軟體的功能還是很強大的,現在小編給大家說下畫中畫使用方法教程圖文詳解,希望可以幫到大家。
  • 使命召喚手遊閃光彈怎麼用 閃光彈使用方法詳解
    今天小編就為大家介紹下閃光彈使用方法詳解,我們一起來看看吧! 使命召喚手遊閃光彈使用方法詳解: 閃光彈可以幹擾敵人的視覺和聽覺,但是動作不受太大影響,同時也可以幹擾敵人的絆雷、哨戒機槍和防空飛彈,在攻堅戰時是必不可少的戰術裝備。
  • Android中的窗口——Activity
    本書適合具備一定軟體開發經驗、想快速進入Android開發領域的程式設計師,具備一些手機開發經驗的開發者和Android開發愛好者學習使用;也適合作為相關培訓學校的Android培訓教材。圖書封面:
  • Activity的四種狀態
    下圖說明了 Activity 在不同狀態間轉換的時機和條件:程式設計師可以啟動一個 activity,但是卻不能手動的「結束」一個 activity。當你調用 Activity.finish()方法時,這是一個結束activity的動作,當此方法調用的時候,系統會將其棧頂的activity移出,並沒有及時的釋放資源,Android系統當沒有可用的資源時候會按照優先級,釋放掉一部分。
  • 直播貼紙功能設置和使用方法圖文詳解
    直播貼紙功能設置和使用方法圖文詳解時間:2020-11-18 23:43   來源:今日頭條   責任編輯:毛青青 川北在線核心提示:原標題:快手直播貼紙怎麼設置?直播貼紙功能設置和使用方法圖文詳解 快手直播貼紙怎麼弄?很多用戶還不會設置,現在小編給大家說下直播貼紙功能設置和使用方法圖文詳解。
  • 星界邊境秘籍大全 控制臺指令匯總使用方法詳解
    《星界邊境》指令怎麼使用?遊戲中使用控制臺的話可省去不少精力,今天小編帶來「justin5566」分享的《星界邊境》控制臺指令使用方法詳解,一起來看吧。以上就是《星界邊境》控制臺指令使用方法詳解,希望對各位有所幫助。
  • 學習安卓開發[2]-在Activity中託管Fragment
    為什麼需要Fragment單純使用Activity的局限Fragment介紹如何使用Fragment代碼實現容器視圖和ActivityFragmentManagerFragment的生命周期為什麼需要Fragment單純使用Activity的局限為什麼需要Fragment呢,這要從Activity的局限說起。
  • 數位電視機機頂盒安裝連接方法以及使用方法詳解
    下面就是一起裝修網小編給大家帶來的關於數位電視機機頂盒安裝連接方法以及數位電視機機頂盒使用方法內容,一起去看看吧。數位電視機機頂盒安裝連接方法2、使用三色音視頻線路將機頂盒和電視機連接起來,它的一端需要對照相應的插口顏色分別插入到機頂盒後面的音視頻輸出口的地方,另一端使用同樣的方法將三色音視頻接線插入到電視機的音視頻輸入口這個地方。
  • Python用PyQt5製作窗體狀態欄,基本控制項QStatusBar使用方法詳解
    前情提要Python用PyQt5創建時間日期控制項,Qt圖形界面編程之QDateTimeEdit「五一」快到了,用Python中PyQt5做一個日曆,QCalendar控制項詳解Python用PyQt5設計界面,如何正確顯示一幅圖片,QPixmap控制項詳解另外,我們詳細介紹了QMainWindow窗體的一些基本控制項為界面添加功能豐富的工具箱,Python中PyQt5之QToolBar類的使用Python用PyQt5設計界面之菜單製作,QMenuBar詳解
  • Pokemon Go定位器使用教學 定位器pokevision使用詳解
    Pokemon Go定位器使用教學,定位器pokevision使用詳解。今天小編給大家帶來的是Pokemon Go定位器使用教學,定位器pokevision使用詳解,下面一起來看看。
  • Django基礎(24): aggregate和annotate方法使用詳解與示例
    但如果查詢本身比較複雜,比如需要對查詢集(queryset)的某些欄位進行計算或進行分組計算或排序, 這時我們就需要使用更高級的aggregate和annotate方法了。小編我今天就帶你看下什麼情況下需要使用aggregate和annotate方法以及如何使用它們。本文比較抽象,但非常有用, 看不懂的可以先加入微信收藏以後多看幾遍哦。
  • 深入講解Android中Activity launchMode
    以郵件客戶端為例,InboxActivity目的就是為了展示收件箱,這個Activity不建議創建成多個實例。而ComposeMailActivity則是用來撰寫郵件,可以實例化多個此Activity對象。合理地設計Activity對象是否使用已有的實例還是多次創建,會使得互動設計更加良好,也能避免很多問題。至於想要達到前面的目標,就需要使用今天的Activity啟動模式。如
  • 明日之後鑄鐵鑽頭用法詳解 鑄鐵鑽頭使用方法
    明日之後鑄鐵鑽頭可以用來開墾土地,但是遊戲中的萌新拿到鑄鐵鑽頭不知道到底它的用法,下面就讓小編來叫大家鑄鐵鑽頭的具體使用技巧吧!
  • 尼爾機械紀元不自爆看2B姐內褲方法 道具使用圖文詳解
    尼爾機械紀元不自爆看2B姐內褲方法 道具使用圖文詳解 3DMGAME
  • 今日單詞 activity
    activity [ktvt]n. 活動;行動;活躍(據柯林斯詞典統計,activity屬於最常用1000詞之一。)[單詞助記]act行動,活動,做+ivity特性→活動[常用短語]economic activity 經濟活動
  • 家用漏電保護器安裝方法詳解 漏電保護器的注意詳解
    下面一起裝修網小編給大家介紹一下漏電保護器安裝方法。家用漏電保護器安裝方法詳解 家用漏電保護器安裝方法(1)漏電保護器安裝方法時必須嚴格區分中性線和保護線(設備外殼接地線)。家用漏電保護器安裝方法(2)漏電保護器負載側的中性線不得與其它迴路共用。家用漏電保護器安裝方法(3)漏電保護器標有負載側和電源側時,應嚴格按其規定。家用漏電保護器安裝方法(4)安裝漏電保護器後,不得撤掉低壓供電線路和電氣設備的接地保護措施。