本文要跟大家介紹Activity的生命週期,如果大家學習過iOS的朋友的話,Activity的生命週期和iOS中ViewController的生命週期非常類似。生命週期,並不難理解。一個人的生命週期莫過於生老病死,花兒的生命週期就是花開花謝了。在Android中Activity的生命週期莫過於Activity的創建到消亡的過程了。本篇部落格就會介紹Activity生命週期中的不同階段,透過實例的形式來窺探Activity的生命週期。搞明白Activity的生命週期是至關重要的,因為只有搞清楚每個生命週期的每個階段,你才能在不同段落中做不同的事情。
接下來我們將透過一個實例來介紹Activity的生命週期,在這個Demo中會有一個MainActivity, MainActivity就是App啟動後第一個顯示的Activity。在MainActivity上有一個按鈕,點擊這個按鈕就會跳到SecondActivity,點擊回鍵就會從SecondActivity中回到MainActivity中,再點擊回傳鍵就會退出App。透過這一些列的Activity的切換,我們將透過列印Log的方式來進行觀察Activity的生命週期。
一.程式碼寫
其實這篇部落格的程式碼是非常簡單的,就是重寫Activity生命週期不同階段的方法,然後在方法中進行Log的列印,從而來標記這個生命週期的階段。而Demo的UI也是灰常的簡單的,所以Activity的layout文件就不做過多的贅述了。接下來看一下兩個Activity中的關鍵程式碼。
1.下方的程式碼是MainActivity中的關鍵程式碼,對Activity生命週期的不同階段進行重寫,然後列印日誌,標記出是哪個Activity中的哪個方法。在onCreate()方法中透過id取得Button, 然後給按鈕綁定上點選事件,點選button時跳到SecondActivity中。具體代碼如下。
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d("lifeCycle", "MainActivity: 我是onCreate方法,我会在Activity第一次被创建是调用"); Button jumpButton = (Button) findViewById(R.id.jump_second_button); jumpButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //跳转到SecondActivity Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivity(intent); } }); } //Ctrl + O 选择父类中的方法进行重写 @Override protected void onStart() { super.onStart(); Log.d("lifeCycle", "MainActivity: 我是onStart方法,我会在Activity由不可见变为可见时调用"); } @Override protected void onResume() { super.onResume(); Log.d("lifeCycle", "MainActivity: 我是onResume方法,我在Activity处于运行状态时调用"); } @Override protected void onPause() { super.onPause(); Log.d("lifeCycle", "MainActivity: 我是onPause方法,我会在Activity暂停时调用"); } @Override protected void onStop() { super.onStop(); Log.d("lifeCycle", "MainActivity: 我是onStop方法,我会在Activity停止时调用"); } @Override protected void onRestart() { super.onRestart(); Log.d("lifeCycle", "MainActivity: 我是onRestart方法,我会在Activty从停止状态变为运行状态时调用"); } @Override protected void onDestroy() { super.onDestroy(); Log.d("lifeCycle", "MainActivity: 我是onDestroy方法,我会在Activty销毁之前调用"); }
2.在SecondActivity中的也是重寫上述方法,唯一的區別就是把上面日誌中的MainActivity改成SecondActivity,代碼類似就不往上粘貼了。
二、運行觀察打印的log
運行我們的app,然後觀察打印的日誌,透過實例來分析Activity的生命週期。具體步驟如下:
1.建立並啟動Activity
首次開啟App所列印的Log如下圖所示。打開App首先看到的時MainActivity, 透過Log我們不難看出在MainActiviy首次出現時要呼叫如下三個方法,經過下方的三個方法,MainActivty就會被創建,然後變為可見,最後處於運行狀態。
(1).onCreate()方法:Activity首次出現建立時會呼叫該方法,在先前的Demo中我們在此方法中載入Activity的佈局和或控制項並關聯事件。
(2).onStar()t方法:接著就會執行onStart()方法,Activity由不可見狀態變成可見狀態會呼叫該方法。
(3).onResume方法:Activity變成可見後接著要呼叫onResume方法來變成運作狀態。
2.Activity間切換
為了更清楚,在點擊按鈕跳到SecondActivity之前,我們可以清除一下Log, 下方左邊有一個垃圾桶的標誌,就是用來清除之前打印的日誌的。下方所列印的日誌就是點擊跳轉按鈕時所列印的日誌。在這個切換過程中,MianActivty會停止運作變成不可見,而SecondActivy就會被建立並且處於運作狀態。具體步驟如下。
(1).onPause()方法:當點擊跳轉按鈕時,運行中MainActivity就會呼叫onPause()變成停止狀態,但仍可見。
(2).接著就是SecondActivity呼叫onCreate()方法進行創建,呼叫onStart()方法進行顯示,呼叫onResume()方法進行運行的過程。
(3).onStop()方法:當SecondActivity處於運作狀態時,MainActivity就完全不可見了,所以就會呼叫onStop()方法,進入完全不可見停止狀態。
3.從另一個Activity返回
從SecondActivity中點擊返回鍵,從SecondActivity中返回MainActivity中。下方的Log是點擊回傳按鈕時所列印的Log.
(1)onPause()方法:點選返回按鈕後,SecondActivity會呼叫onPause()方法,進入暫停運作狀態。
(2)onRestart()方法:接著MainActivity就會呼叫onRestart()方法,由停止狀態變成運作狀態。然後MainActivity會呼叫onStart方法從不可見變成可見,接著會呼叫onResume()方法最終進入運作狀態。
(3)当返回到MainActivity中并且MainActivity处于运行状态后,SecondActivity会调用onStop方法,停止运行并不可见。因为SecondActivty做的事出栈操作,停止运行后,就会调用onDestory方法进行销毁。下此在进入SecondActivity中时,还是从onCreate方法进行执行。
4.Activity退出并销毁
接着在MainActivity中点击返回按钮就会退出App了,下方是退出App时打印的Log信息。MainActivty先调用onPause()方法变为暂停运行状态,然后再调用onStop()方法停止运行,最后调用onDestroy()方法进行销毁。
三.生命周期流程图
1.上面是用语言通过实例打印出的Log来描述两个Activity切换的生命周期,接下来将用一个流程图来描述这一过程,具体流程图如下。
2.通过上面的实例不难分析出一个Activity的生命周期分为哪些阶段,并且很容易的看出哪些阶段在什么时候执行,所以我们很容易的画出一个Activity的生命周期,下方的流程图是一个Activity的生命周期。
四.Activity的加载模式
Activity的启用模式也较为简单,它会在活动切换时用到。Activity的启动模式分为四种,standard、singleTop、singleTask、singleInstance模式。接下来将为大家详细的介绍一下这几种加载模式。
Activity的加载模式可以在配置文件AndroidManifest.xml中进行配置,配置项为android:launchMode具体如下图所示:
1.standard模式
在Activity的栈中无论该活动有没有加入栈,活动就会被创建。测试方式是把MainActivity的launchMode设置成standard, 在MainActivity中添加一个按钮,点击按钮使用Intent跳转到当前Activity,看onCreate方法中打印的Log。点击按钮的方法如下:
Button launchModelButton = (Button) findViewById(R.id.launch_model_button); launchModelButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, MainActivity.class); startActivity(intent); } });
standard加载模式的栈如下所示,无论栈中有没有该对象的实例,都会被创建。
2.singleTop模式
只要被创建的活动不位于栈的顶部,该活动就会被创建入栈。如果将要被创建的活动位于栈的顶部,该活动的实例就不会被创建。测试方法,把上面的模式直接改成singleTop模式,MainActivty往自己身上跳转就不会从新创建一个新的实例,会重用之前在栈顶中的实例。如果是MainActivty跳转到SecondActivty, 然后SecondActivity再次跳转到MainActivty, 那么此时的MainActivity将会被创建,因为栈顶是SecondActivity。如下所示:
3.singleTask模式
单任务模式,这个也不难理解,如果从MainActivty跳转到SecondActivity, 如果再从SecondActivty跳转到MainActivity, 在单任务模式下MainActivity已经在栈中,就会把它之前的Activity出栈,使其处于在栈顶活跃的位置。原理如下图所示:
4.singleInstance
可以看成单例模式,这个比较特殊,被设置成singleInstance的Activity将会放入另一个栈中,因为这样为了便于共用。上面3中模式位于同一个栈中。下方ThirdActivity跳转到一个加载模式为singleInstance的Activity中。
今天的Activity生命週期就先到這兒,相關內容會在下篇部落格中更新。
更多Android開發中Activity的生命週期及加載模式詳解相關文章請關注PHP中文網!

類加載器通過統一的類文件格式、動態加載、雙親委派模型和平台無關的字節碼,確保Java程序在不同平台上的一致性和兼容性,實現平台獨立性。

Java編譯器生成的代碼是平台無關的,但最終執行的代碼是平台特定的。 1.Java源代碼編譯成平台無關的字節碼。 2.JVM將字節碼轉換為特定平台的機器碼,確保跨平台運行但性能可能不同。

多線程在現代編程中重要,因為它能提高程序的響應性和資源利用率,並處理複雜的並發任務。 JVM通過線程映射、調度機制和同步鎖機制,在不同操作系統上確保多線程的一致性和高效性。

Java的平台獨立性是指編寫的代碼可以在任何安裝了JVM的平台上運行,無需修改。 1)Java源代碼編譯成字節碼,2)字節碼由JVM解釋執行,3)JVM提供內存管理和垃圾回收功能,確保程序在不同操作系統上運行。

Javaapplicationscanindeedencounterplatform-specificissuesdespitetheJVM'sabstraction.Reasonsinclude:1)Nativecodeandlibraries,2)Operatingsystemdifferences,3)JVMimplementationvariations,and4)Hardwaredependencies.Tomitigatethese,developersshould:1)Conduc

云计算显著提升了Java的平台独立性。1)Java代码编译为字节码,由JVM在不同操作系统上执行,确保跨平台运行。2)使用Docker和Kubernetes部署Java应用,提高可移植性和可扩展性。

Java'splatformindependenceallowsdeveloperstowritecodeonceandrunitonanydeviceorOSwithaJVM.Thisisachievedthroughcompilingtobytecode,whichtheJVMinterpretsorcompilesatruntime.ThisfeaturehassignificantlyboostedJava'sadoptionduetocross-platformdeployment,s

容器化技術如Docker增強而非替代Java的平台獨立性。 1)確保跨環境的一致性,2)管理依賴性,包括特定JVM版本,3)簡化部署過程,使Java應用更具適應性和易管理性。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

Atom編輯器mac版下載
最受歡迎的的開源編輯器

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。