編輯:關於Android編程
??Activity作為四大組件之一,出現的頻率相當高,基本上我們在android的各個地方都能看見它的蹤影,因此深入了解Activity,對於開發高質量應用程序是很有幫助的。今天我們就來詳細地聊聊Activity的生命周期,以便我們在以後的開發中能如魚得水。
??在日常應用中Activity是與用戶交互的接口,它提供了一個用戶完成相關操作的窗口。當我們在開發中創建Activity後,通過調用setContentView(View)方法來給該Activity指定一個布局界面,而這個界面就是提供給用戶交互的接口。Android系統中是通過Activity棧的方式來管理Activity的,而Activity自身則是通過生命周期的方法來管理的自己的創建與銷毀,既然如此,現在我們就來看看Activity生命周期是如何運作的。
Active/Running:
Activity處於活動狀態,此時Activity處於棧頂,是可見狀態,可與用戶進行交互。
Paused:
當Activity失去焦點時,或被一個新的非全屏的Activity,或被一個透明的Activity放置在棧頂時,Activity就轉化為Paused狀態。但我們需要明白,此時Activity只是失去了與用戶交互的能力,其所有的狀態信息及其成員變量都還存在,只有在系統內存緊張的情況下,才有可能被系統回收掉。
Stopped:
當一個Activity被另一個Activity完全覆蓋時,被覆蓋的Activity就會進入Stopped狀態,此時它不再可見,但是跟Paused狀態一樣保持著其所有狀態信息及其成員變量。
Killed:
當Activity被系統回收掉時,Activity就處於Killed狀態。
Activity會在以上四種形態中相互切換,至於如何切換,這因用戶的操作不同而異。了解了Activity的4種形態後,我們就來聊聊Activity的生命周期。
這裡我們先來看看這一張經典的生命周期流程圖:
??相信大部分人對這種流程圖並不陌生,嗯,我們下面主要聊得話題就是圍繞這張流程圖了。我們先有個大概印象,後面我們分析完後再回來看,就相當清晰了。
??所謂的典型的生命周期就是在有用戶參與的情況下,Activity經歷從創建,運行,停止,銷毀等正常的生命周期過程。我們這裡先來介紹一下幾個主要方法的調用時機,然後再通過代碼層面來驗證其調用流程。
onCreate : 該方法是在Activity被創建時回調,它是生命周期第一個調用的方法,我們在創建Activity時一般都需要重寫該方法,然後在該方法中做一些初始化的操作,如通過setContentView設置界面布局的資源,初始化所需要的組件信息等。
onStart : 此方法被回調時表示Activity正在啟動,此時Activity已處於可見狀態,只是還沒有在前台顯示,因此無法與用戶進行交互。可以簡單理解為Activity已顯示而我們無法看見擺了。
onResume : 當此方法回調時,則說明Activity已在前台可見,可與用戶交互了(處於前面所說的Active/Running形態),onResume方法與onStart的相同點是兩者都表示Activity可見,只不過onStart回調時Activity還是後台無法與用戶交互,而onResume則已顯示在前台,可與用戶交互。當然從流程圖,我們也可以看出當Activity停止後(onPause方法和onStop方法被調用),重新回到前台時也會調用onResume方法,因此我們也可以在onResume方法中初始化一些資源,比如重新初始化在onPause或者onStop方法中釋放的資源。
onPause : 此方法被回調時則表示Activity正在停止(Paused形態),一般情況下onStop方法會緊接著被回調。但通過流程圖我們還可以看到一種情況是onPause方法執行後直接執行了onResume方法,這屬於比較極端的現象了,這可能是用戶操作使當前Activity退居後台後又迅速地再回到到當前的Activity,此時onResume方法就會被回調。當然,在onPause方法中我們可以做一些數據存儲或者動畫停止或者資源回收的操作,但是不能太耗時,因為這可能會影響到新的Activity的顯示——onPause方法執行完成後,新Activity的onResume方法才會被執行。
onStop : 一般在onPause方法執行完成直接執行,表示Activity即將停止或者完全被覆蓋(Stopped形態),此時Activity不可見,僅在後台運行。同樣地,在onStop方法可以做一些資源釋放的操作(不能太耗時)。
onRestart :表示Activity正在重新啟動,當Activity由不可見變為可見狀態時,該方法被回調。這種情況一般是用戶打開了一個新的Activity時,當前的Activity就會被暫停(onPause和onStop被執行了),接著又回到當前Activity頁面時,onRestart方法就會被回調。
onDestroy :此時Activity正在被銷毀,也是生命周期最後一個執行的方法,一般我們可以在此方法中做一些回收工作和最終的資源釋放。
下面我們通過程序來驗證上面流程中的幾種比較重要的情況,同時觀察生命周期方法的回調時機。
我們案例代碼如下:
package com.cmcm.activitylifecycle;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
Button bt;
/**
* Activity創建時被調用
* @param savedInstanceState
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LogUtils.e("onCreate is invoke!!!");
bt= (Button) findViewById(R.id.bt);
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(MainActivity.this,SecondActivity.class);
startActivity(i);
}
});
}
/**
* Activity從後台重新回到前台時被調用
*/
@Override
protected void onRestart() {
super.onRestart();
LogUtils.e("onRestart is invoke!!!");
}
/**
*Activity創建或者從後台重新回到前台時被調用
*/
@Override
protected void onStart() {
super.onStart();
LogUtils.e("onStart is invoke!!!");
}
/**
*Activity創建或者從被覆蓋、後台重新回到前台時被調用
*/
@Override
protected void onResume() {
super.onResume();
LogUtils.e("onResume is invoke!!!");
}
/**
* Activity被覆蓋到下面或者鎖屏時被調用
*/
@Override
protected void onPause() {
super.onPause();
LogUtils.e("onPause is invoke!!!");
}
/**
*退出當前Activity或者跳轉到新Activity時被調用
*/
@Override
protected void onStop() {
super.onStop();
LogUtils.e("onStop is invoke!!!");
}
/**
*退出當前Activity時被調用,調用之後Activity就結束了
*/
@Override
protected void onDestroy() {
super.onDestroy();
LogUtils.e("onDestroy is invoke!!!");
}
}
1.我們先來分析Activity啟動過程中所調用的生命周期方法,運行程序截圖如下:
從Log中我們可以看出Activity啟動後,先調用了onCreate方法,然後是onStart方法,最後是onResume方法,進入運行狀態,此時Activity已在前台顯示。因此,
Activity啟動–>onCreate()–>onStart()–>onResume()依次被調用
2.當前Activity創建完成後,按Home鍵回到主屏。按如上操作運行截圖:
我們在Activity創建完成後,點擊Home回調主界面時,可以發現此時onPause方法和onStop方法被執行,也就是點擊Home鍵回到主界面(Activity不可見)–>onPause()–>onStop()依次被調用
3.當我們點擊Home鍵回到主界面後,再次點擊App回到Activity時,調用結果如下:
我們可以發現重新回到Activity時,調用了onRestart方法,onStart方法,onResume方法。因此,
當我們再次回到原Activity時–>onRestart()–>onStart()–>onResume()依次被調用
4.當我們在原有的Activity的基礎上打新的Activity時,調用結果如下:
我們可看到原來的Activity調用的了onPause方法和onStop方法。也就是說
在原Activity的基礎上開啟新的Activity,原Activity生命周期執行方法順序為–>onPause()–>onStop(),事實上跟點擊home鍵是一樣的。但是這裡有點要注意的是如果新的Activity使用了透明主題,那麼當前Activity不會回調onStop方法。同時我們發現新Activity(SecondActivity)生命周期方法是在原Activity的onPause方法執行完成後才可以被回調,這也就是前面我們為什麼說在onPause方法不能操作耗時任務的原因了。
5 當我們點擊Back鍵回退時,回調結果如下:
從Log我們可以看出,當點擊Back鍵回退時,相當於退出了當前Activity,Activity將被銷毀,因此
退出當前Activity時–>onPause()–>onStop()–>onDestroy()依次被調用
小結:到這裡我們來個小結,當Activity啟動時,依次會調用onCreate(),onStart(),onResume(),而當Activity退居後台時(不可見,點擊Home或者被新的Activity完全覆蓋),onPause()和onStop()會依次被調用。當Activity重新回到前台(從桌面回到原Activity或者被覆蓋後又回到原Activity)時,onRestart(),onStart(),onResume()會依次被調用。當Activity退出銷毀時(點擊back鍵),onPause(),onStop(),onDestroy()會依次被調用,到此Activity的整個生命周期方法回調完成。現在我們再回頭看看之前的流程圖,應該是相當清晰了吧。嗯,這就是Activity整個典型的生命周期過程。下篇我們再來聊聊Activity的異常生命周期。
大多數場景下,會單單使用viewPager+Fragment來完成項目需求,但也有一些特殊情況需要用到viewPager的多重嵌套。一、例如:我的想法是:①用viewPa
關鍵詞:藍牙blueZ A2DP、SINK、sink_connect、sink_disconnect、sink_suspend、sink_resume、sink_is_
Binder用於完成進程間通信(IPC),即把多個進程“別”在一起,從線程的角度來講,Binder驅動代碼運行在內核態,客戶端程序調用Binder是通過系統調用完成的。B
最近群裡有人問如何在mac下進行apk反編譯,我也沒試過,以前都是在windows下進行反編譯的,windows下很簡單,有許多比較好的集成工具,如apkide(改之理)