Android Context的幾點看法
經過大量搜索,對context這個難以理解的術語有了點清晰的認識。
1.首先什麼是context?
文檔語焉不詳,說是resource什麼的,反正是沒看懂,實際上可以認爲它是一個指向parent對象的指針,受到那個parent對象的控制。
2.爲什麼需要context?
試想一下這個語句:
Button myButton =newButton(this);
這個this就是context,前面說了它指向了parent對象,那指向了哪裏?爲什麼需要這麼做?原因是Button爲了能完成自己的使命(響應各種操作)就得讓Android系統知道自己是屬於哪個Activity的,這個信息是必須的,因爲只有這樣Android系統纔會對其進行管理,比如響應onClick()事件,否則系統連Button是屬於哪個Activity的都不知道,怎麼響應呢?如果Button的context和Activity的context是一樣的,那麼它們都是可見的,比如上面那個button跟Activity一樣是可見的,它們的context指向另一個不可見的對象,也就是它們受那個不可見的對象控制,我理解爲系統。
3.Application context和Activity context。
這是兩種不同的context,也是最常見的兩種。第一種中context的生命週期與Application的生命週期相關的,context隨着Application的銷燬而銷燬,第二種中的context跟Activity的生命週期是相關的,但是對一個Application來說,Activity可以銷燬幾次,那麼屬於Activity的context就會銷燬多次。至於用哪種context,得看應用場景,個人感覺用Activity的context好一點,不過也有的時候必須使用Application的context。
舉例來說:SQLite建立時是需要context的,那麼我們怎麼傳呢?
一、建立SQLiteOpenHelper 的子類
public class mySQLiteHelper extends SQLiteOpenHelper {
..........
public DBOpenHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
// TODO Auto-generated constructor stub
}
.......
}
二、我們用另一個類封裝一下這個類,完善數據查詢、插入、刪除、更新等操作,具體方法不表。
public class DBManager {
//定義上面那個類對象;
private mySQLiteHelper dbHelper;
//注意這裏得定義一個context,你想直接得到是得不到的,需要調用這個類的對象自己傳一個context過來,這個context再將得到的context傳到mySQLiteHelper 那個類去。
private Context context;
//構造方法
public DBManager (Context context) {
this.context = context;
dbHelper = new DBOpenHelper(context,DB_NAME,null,VERSION);
db = dbHelper.getWritableDatabase();
}
}
三、最後,我們在一個Activity中進行調用
public class myActivity extends Activity {
private DBManager db;
public void onCreate(Bundle savedInstanceState) {
........
//dbmgr = new DataManager(getApplicationContext()); 第一種
dbmgr = new DataManager(this); //第二種
//兩種方法都可以,第一種是Application的context,第二種是Activity的context
.........
}
}