正如《Android Activity的啟動和跳轉》一文所說,在Android APP中啟動一個Activity都是通過startActivity()或startActivityForResult()來實現,并不會直接在APP代碼中new一個Activity對象來使用,直接new出來的Activity對象是無法使用的。一般來說我們在實現一個Activity類時會將初始化的一些操作放到onCreate()中執行,并不會實現其構造方法。但是這并不是說Activity類沒有構造方法,或者構造方法不會被調用。
事實上,調用startActivity()或startActivityForResult()之后,Android框架中的代碼會完成Activity對象的創建。在創建Activity對象時仍然會執行Activity類的構造方法。
在android.app.Instrumentation類中有一個newActivity方法。Android框架正是通過此方法來創建一個Activity對象的。其代碼如下。
public Activity newActivity(ClassLoader cl, String className, Intent intent) throws InstantiationException, IllegalaccessException, ClassNotFoundException { return (Activity)cl.loadClass(className).newInstance();}可以看到,這里通過ClassLoader的loadClass()方法來加載指定的Activity類,得到對應的Class對象,然后再調用Class對象的newInstance()方法創建Activity對象。
由于Class對象的newInstance()方法在創建對象時會調用該類的無參構造方法,因此,如果確實需要在Activity構造的時候執行一些操作,可以在這個Activity類中增加一個無參的構造方法,這個構造方法會在newInstance()時被自動調用。
這里有兩點需要注意:
一個Activity類中只有無參的構造方法會被執行,定義有參數的構造方法是沒有意義的。一個Activity類中如果沒有無參構造方法,或者無參構造方法不是public的,則在執行newInstance()的時候會產生異常。新聞熱點
疑難解答