2011年12月28日 星期三

Android - Activity設計建議(1)

有關設計建議的詳細內容請參考官網說明

(1)如果你的activity只想被自己設計的application使用,而不想被別的application使用,那就不要建立intent filter,直接使用explicit intents,例如:

   Intent it = new Intent();
   it.setClass(this,MyActivity.class);
   startActivity(it);

這樣就沒有別的applicaton會因為誤發了一個intent而把MyActivity給執行起來。使用intent filter會發佈到Android系統上,讓別的application也有機會執行。


(2)使用intent要特別注意,如果這個intent要呼叫的apk是第三方程式(意即可能被移除),那startActivity()很有可能會產生Exception。兩種解決方式

   (1) try{
           startActivity();
       }catch(ActivityNotFoundException e){
           //do something if the apk is uninstalled
       }

   (2) 利用package manager確定這個apk是否還在Android裝置裡面,做法可參考這篇文章



(3)如果你的Activity可以單獨執行,應該讓使用者在Launcher可以執行它。也就是application中應該有一個activity要有
            <intent-filter>
                <action android:name="android.intent.action.MAIN"></action>
                <category android:name="android.intent.category.DEFAULT"></category>
            </intent-filter>



(4)相較於上者,如果你有一個不常用的小程式,尤其是系統內也內建有類似功能的程式,或者這個小程式是依附在其他程式底下,那也許不用大費周章的為他在Launcher設立一個可以執行的icon。只要有intent filter可以在適當的時候被呼叫起來就好了。



(5) 相較於(3)和(4),如果你有兩支activity可獨立執行,但是有很多資料、程式碼是可以共用的,那可以考慮寫成一支application但是有 兩個可以在Launcher執行的icon,像是Camera 和 Camcorder。在AndroidManifest.xml中,這兩支activity都有

                  <action android:name="android.intent.action.MAIN" />
                  <category android:name="android.intent.category.DEFAULT" />

但是要注意的是要把taskAffinity分開,兩者才不會互相影響。例如
android:taskAffinity="android.task.camera" 和 android:taskAffinity="android.task.Camcorder",

有關taskAffinity可以參考官網的說明

沒有留言:

張貼留言