activity-alias是Android里為了重復使用Activity而設計的。
1. 含義和作用:
對於activity-alias標簽,它有一個屬性叫android:targentActivity,這個屬性就是用來為該標簽設置目標Activity的,或者說它就是這個目標Activity的別名。
activity-alias作為一個已存在Activity的別名,則應該可以通過該別名標簽聲明快速打開目標Activity。
因此activity-alias可用來設置某個Activity的快捷入口,可以放在桌面上或者通過該別名被其他組件快速調起。
2. 部分屬性說明如下
1. android:enable 該屬性用來決定目標Activity可否通過別名被系統實例化,默認為true。
需要注意的是application也有enable屬性,只用當它們同時為true時,activity-alias的enable才生效。
2. android:exported 該屬性為true的話,則目標Activity可被其他應用調起,如為false則只能被應用自身調起。
其默認值根據activity-alias是否包含intent-filter元素決定,如果有的話,則默認為true;沒有的話則為false。
其實也很好理解,如果有intent-filter,則目標Activity可以匹配隱式Intent,因此可被外部應用喚起;
如果沒有intent-filter,則目標Activity要被調起的話必須知道其精確類名,因為只有應用本身才知道精確類名,所以此時默認為false。
3. android:icon 該屬性就比較好玩了,允許自定義icon,可以不同於應用本身在桌面的icon。如果需要在桌面上創建快捷入口,也許產品會要求換個不同的icon。
4. android:label 該屬性類似於android:icon,圖標都換了,換個名稱也合情合理吧,此屬性就是為此而生的。
5. android:name 該屬性可以為任意字符串,但最好符合類名命名規范。activity元素的name屬性實質上都會指向一個具體的Activity類,而activity-alias的name屬性僅作為一個唯一標識而已。
6. android:permission 該屬性指明了通過別名聲明調起目標Activity所必需的權限。
7. android:targetActivity 該屬性指定了目標Activity,即通過activity-alias調起的Activity是哪個,此屬性其實類似於activity標簽中的name屬性,需要規范的Activity包名類名。
3. 注意:
在AndroidManifest配置文件中,activity-alias標簽元素必須聲明在目標Acitvity對應的activity標簽元素之后,否則會編譯錯誤。
4. 使用案例:
當在Activity的onCreate()方法里,執行getIntent().getComponent().getClassName();
得到的可能不是這個Activity的名字,有可能是別名的名字,例如:在AndroidMenifest.xml有如下配置:
<activity
android:name=".TestAndroid"
android:icon="@drawable/ic_menu_mark">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity-alias
android:name="TestAndroidAlias"
android:targetActivity="TestAndroid"
android:label="testAndroidlias"
android:icon="@drawable/ic_launcher_phone">
<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-alias>
這個應用會在桌面上建兩個進入點,即建兩個可以進入TestAndroid這個Activity的快捷圖標。
這時getIntent().getComponent().getClassName() 得到的名字就不一樣,一個是com.test.TestAndroid,一個是com.test.TestAndroidAlias。