<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.apis">
<activity android:name="ApiDemos">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".app.HelloWorld" android:label="@string/activity_hello_world">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.SAMPLE_CODE" />
</intent-filter>
</activity>
activity組件的android:name屬性採用類名的簡寫方式,查看文檔類名的簡寫格式為“.ClassName”,但為什麼<activity android:name="ApiDemos">裡的android:anem="ApiDemos",而不是android:anem=".ApiDemos"呢? 而後面的所有Activity組件的android:name的值都是“.ClassName”格式呢?馬上google查詢android:name屬性值的說明,但未查到有類名前不加“.”的說明!
無奈,那就實際測實驗證吧,結果"ApiDemos"與".ApiDemos"的寫法都能正確運行程式。難道類名前有“.”與沒有“.”是一樣的? 明明文檔中說明的是“.ClassName”格式啊!於是把其它的Activity的android:name的值字串中的第一個“.”去掉,再運行程式,卻不行,越發的感覺奇怪!鬱悶!經過反覆的測試,發現了一個規則:
如果manifest中指定了package屬性,比如指定為"com.android.sample",如果activity的實作類別也在這個package下,則android:name為實現的類名,這個類名前加不加點都沒有關係,如果activity的實作類別是在預設包的子包裡面,則這個“.”是必須有的,比如activity的實現是com.android.sample.app.DialogActivity,則android:name必須寫成.app.DialogActivity或者com.android.sample.app.DialogActivity。如果唯寫app.DialogActivity,則會報錯。
呵呵,感覺Android的這個設計有點失敗,統一格式,強制簡寫方式必須有“.”不就得了嗎,免得讓人暈乎!官方的例子裡居然還特意這樣設計,難道這有特殊的用意?
管它呢!不論Activity的子類是否在預設package下,還是在預設包的子包下,類名的簡寫方式統統採用“.ClassName”的方式!