1 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 2 package="com.example.android.apis"> 3 4 5 <activity android:name="ApiDemos"> 6 <intent-filter> 7 <action android:name="android.intent.action.MAIN" /> 8 <category android:name="android.intent.category.DEFAULT" /> 9 <category android:name="android.intent.category.LAUNCHER" /> 10 </intent-filter> 11 </activity> 12 13 14 <activity android:name=".app.HelloWorld" android:label="@string/activity_hello_world"> 15 <intent-filter> 16 <action android:name="android.intent.action.MAIN" /> 17 <category android:name="android.intent.category.SAMPLE_CODE" /> 18 </intent-filter> 19 </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.example.android.apis",如果activity的實現類ApiDemos 也在這個package下,則android:name為實現的類名,這個類名前加不加點都沒有關系,
如果activity的實現類是在默認包的子包里面,則這個 "." 是必須有的,比如activity的實現是com.android.sample.app.DialogActivity,則android:name必須寫成.app.DialogActivity或者com.android.sample.app.DialogActivity。如果只寫app.DialogActivity,則會報錯。
不論Activity的子類是否在默認package下,還是在默認包的子包下,類名的簡寫方式統統采用“.ClassName”的方式,可避免類似問題!
參考: