現(xiàn)在算下來,在互聯(lián)網(wǎng)公司已經(jīng)實習兩個月了,這兩個月收獲頗豐,有很多很多的東西值得去記。(嗯,絕對不是偷懶。干貨都記本地了,等總結好了再發(fā)博客)
近期我準備開一個坑,就是寫《Android開發(fā)須知》這個系列。因為在實習過程中,我發(fā)現(xiàn)在Android開發(fā)過程中有許多很小卻很常見的“深坑”。不說是初來乍到的應屆生,很多老司機會在這些地方翻車。寫這個系列博客 一來,告誡自己在開發(fā)中要謹記這些小事情,避免犯錯。二來,就是與各位準備開發(fā)Android的小伙伴進行探討,避免踩坑。
言歸正傳,咋們從最常見的問題開始
Context開始講起
什么是Context?Android為什么要用context?是我初學Android的困惑。
Context被翻譯為“上下文”。這個概念表面看上去通俗易懂,實際上是“一萬人就有一萬個哈姆雷特”。在這里我表述一下我對context的看法,context就是一個Android系統(tǒng)的高級憑證,重要的類都必須拿憑證打開,不是什么阿貓阿狗都可以隨便new出來的。就比如啟動一個ACtivity:
Intent intent = new Intent(context, MainActivity.class);
context.startActivity(intent);
出于安全考慮,Android系統(tǒng)是不允許Activity憑空出現(xiàn)的。也就說,要持有context憑證才能去啟動一個Activity。保證安全的、正確的開啟下一個重要組件。
除了啟動Android的四大組件以外,通過context還可以訪問APK中的各種資源,訪問Package的相關信息和各種權限管理。
比如去獲取個版本名稱
PackageManager pm = context.getPackageManager();
PackageInfo pi=pm.getPackageInfo(context.getPackageName(), 0);
pi.versionName
Context的生命周期
鋪墊完了,今天我們的兩個主角登場:Activity context與Application context。
我們先來看一個Demo
public class Demo{
private static Demo instance;
private Context context;
private Demo(Context context){
this.context=context;
}
public getDemoInstance(Context context){
if(instance == null){
instance=new Demo(context)
}
return instance
}
}
這是一個很簡單的單例模式,單例模式的特殊性讓它的生命周期和Application一樣長,如果開始就傳入一個Activity context,那么當這個Activity被銷毀后,這個單例依然引用著它的context,使得Activity無法GC,導致內(nèi)存泄漏。
Activity context跟Activity的生命周期是相關的,Activity可以銷毀幾次(反復開啟),那么屬于Activity的context就會銷毀多次
而Application context的生命周期與Application相同,context隨著Application的銷毀而銷毀,伴隨application的一生。并與activity的生命周期無關.可以通過Context.getApplicationContext或者Activity.getApplication方法獲取。
所以Context的生命周期不同,決定了context的使用不同。
Context的用法
1.把控context的生命周期:
使用context,要先明確使用的context生命周期長短。如果是工具類獲取一些信息,就使用Application Context解決問題。如果是啟動一個Activity就使用Activity context。
2.及時釋放context:
如果我們必須使用Activity context讓其他類持有,那么一定要記得在Activity的onDestroy()時或之前把給出的context置空。避免讓“閑雜人等”長期持有。