活動的生命周期
當(dāng)你深入理解活動的生命周期之后强戴,就可以寫出更加連貫流暢的程序挖诸,并在如何合理管理應(yīng)用資源方面發(fā)揮的游刃有余狠轻。
返回棧
首先它是一個棧(后進(jìn)先出)展氓。
Android中的活動是可以層疊的侮繁,每一個新建的活動都會覆蓋在上一個活動上色徘。銷毀只會銷毀最上層的活動各薇。
活動狀態(tài)
每個活動在其生命周期中最多會有4種狀態(tài)
- 運(yùn)行狀態(tài) 當(dāng)一個活動位于返回棧的棧頂
- 暫停狀態(tài) 當(dāng)一個活動不再位于棧頂业岁,但仍然可見鳞仙。
- 停止?fàn)顟B(tài) 當(dāng)一個活動不再位于位于棧頂,并不可見叨襟。
- 銷毀狀態(tài) 當(dāng)一個活動從返回棧中移除就變成了銷毀狀態(tài)繁扎。
活動的生命周期
完整生存期:
活動在onCreate()和onDestory()之間所經(jīng)歷的。一般情況下,一個活動會在onCreate()方法中完成各種初始化操作梳玫,在onDestory()中完成釋放內(nèi)存的操作爹梁。
onCreate() 每個活動都重寫了這個方法,它會在活動第一次被創(chuàng)建時調(diào)用提澎。你應(yīng)該在這個方法中完成活動的初始化操作姚垃。
onDestory() 這個方法在活動被銷毀時調(diào)用,調(diào)用后活動變?yōu)殇N毀狀態(tài)盼忌。
可見生存期
活動在onStart()和onStop()之間所經(jīng)歷的积糯。在可見生存期內(nèi),活動對于用戶中是可見的谦纱,即便有可能無法與用戶進(jìn)行交互看成。我們可以通過這兩個方法合理地管理那些對用戶可見的資源。比如在onStart()中對資源進(jìn)行加載跨嘉,在onStop() 中對資源進(jìn)行釋放川慌。
onStart() 這個方法在活動由不可見變?yōu)榭梢姇r調(diào)用
onStop() 這個方法在活動由可見變?yōu)椴豢梢姇r調(diào)用
前臺生存期
活動在onResume()到onPause()之間所經(jīng)歷的。在前臺生存期內(nèi)祠乃,活動總是處于運(yùn)行狀態(tài)的梦重,此時的活動是可以和用戶進(jìn)行交互的,我們平時看到和接觸最多的也就是這個狀態(tài)下的活動亮瓷。
onResume() 這個方法在系統(tǒng)準(zhǔn)備好和用戶進(jìn)行交互時調(diào)用琴拧。此時的活動已定位于返回棧的棧頂,并處于運(yùn)行狀態(tài)嘱支。
onPause() 這個方法在系統(tǒng)準(zhǔn)備去啟動或恢復(fù)另一個活動的時候調(diào)用蚓胸。我們通常會在這個方法中將一些消耗CPU的資源釋放掉,以及保存一些關(guān)鍵數(shù)據(jù)斗塘,但這個方法的執(zhí)行速度一定要快赢织,不然會影響到新的棧頂活動的調(diào)用。
活動的啟動模式
在AndroidManifest.xml中設(shè)置其<activity>標(biāo)簽中的launchMode屬性
<activity android:name=".NormalActivity"
android:launchMode="XXXX"/>
活動的啟動模式有四:
- standard 默認(rèn)的模式就是此模式馍盟。在此模式下于置,活動的創(chuàng)建并不會做什么檢查,活動會重新創(chuàng)建一個贞岭。
- singleTop 在此模式下八毯,活動創(chuàng)建時會檢測返回棧頂部是否為該活動,如果是的就不會再重新創(chuàng)建瞄桨。但是如果該活動并不存在于返回棧頂部话速,則依然會再次創(chuàng)建。
- singleTask 在此模式下芯侥,活動創(chuàng)建前會遍歷返回棧泊交,如果返回棧中存在該活動就不會再創(chuàng)建新的乳讥。
- singleInstance 在此模式下,活動在創(chuàng)建之前會先創(chuàng)建一個額外的返回棧廓俭,然后再在該額外的返回棧中創(chuàng)建活動云石。銷毀時,會先銷毀默認(rèn)的返回棧的活動并銷毀該返回棧研乒,再銷毀額外的返回棧和其活動汹忠。
幾個活動使用的技巧
知曉當(dāng)前是在哪一個活動中
先寫一個BaseActivity 基類繼承AppCompatActivity,并在此類中重寫onCreate()方法:
public class BaseActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(saveInstanceState);
Log.d("BaseActivity",getClass().getSimpleName());
}
}
我們在寫其他活動時都繼承此基類雹熬。當(dāng)我們進(jìn)入某個活動時宽菜,就會在logcat中輸出相應(yīng)的活動。
隨時隨地退出活動
新建一個ActivityCollector類作為活動管理器竿报,來對所有的活動進(jìn)行管理铅乡。
public class ActivityCollector{
public static List<Activity> activities = new ArrayList<>();
public static void addActivity(Activity){
activitise.add(activity);
}
public static void removeActivity(Activity activity){
activities.remove(activity);
}
public static void finishAll(){
for(Activity activity : activities){
if(!activity.isFinishing()){
activity.finish();
}
}
}
}
然后在BaseActivity中修改:
public class BaseActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(saveInstanceState);
Log.d("BaseActivity",getClass().getSimpleName());
ActivityCollector.addActivity(this);
}
@Override
protected void onDestroy(){
super.onDestroy();
ActivityCollector.removeActivity(this);
}
}
之后,如果想退出程序只要調(diào)用ActivityCollector.finishAll();
當(dāng)然還可以在銷毀所有活動的代碼后面再加上殺掉當(dāng)前進(jìn)程的代碼烈菌,以保證程序完全退出隆判,殺掉進(jìn)程的代碼如下:
android.os.Process.killProcess(android.os.Process.myPid());
killPeocess()方法用于殺掉一個進(jìn)程,它接收一個進(jìn)程的id參數(shù)僧界,我們可以通過myPid()方法來獲得當(dāng)前程序的進(jìn)程id。需要注意的是臭挽,killProcess()方法只能用于殺掉當(dāng)前程序的進(jìn)程,我們不能使用這個方法去殺掉其他程序捂襟。
啟動活動的最佳寫法
public class SecondActivity extends BaseActivity {
public static void actionStart(Context context , String data1 , String data2){
Intent intent = new Intent(context , SecondActivity.class);
intent.putExtra("param1",data1);
intent.putExtra("param2",data2);
context.startActivity(intent);
}
}
我們在SecondActivity 中添加了一個actionStart()
方法,在這個方法中完成了Intent的構(gòu)建欢峰,另外所有SecondActivity 中需要的數(shù)據(jù)都是通過actionStart()
方法的參數(shù)傳遞葬荷。
SecondActivity.actionStart(FirstActivity.this , "data1" , "data2");