1. 程式人生 > >從AndroidManifest.xml中獲取已註冊Activity的方法

從AndroidManifest.xml中獲取已註冊Activity的方法

契機:
在學習並積累自定義控制元件,為了看效果,需要放到Activity中來顯示。
每次寫新的自定義控制元件,不可能都放到同一個Activity中,為了更好觀看效果,每個Activity中只放少數控制元件。
如此,隨著自定義控制元件增多,Activity也逐漸增多,相應的需要在AndroidManifest中配置,還需要想辦法(例如寫個按鈕)能夠訪問每個Activity。
於是,有沒有辦法自動從AndroidManifest.xml中獲取所有已經註冊過的Activity,放到ListView中顯示呢。

寫了以下工具類:
public final class ClassUtils {
        private final static String TAG = "ClassUtils";
        private ClassUtils(){}
        
        /**
         * 返回AndroidManifest.xml中註冊的所有Activity的class
         * @param context                環境
         * @param packageName  包名
         * @param excludeList        排除class列表
         * @return
         */
        public final static List<Class> getActivitiesClass(Context context, String packageName, List<Class> excludeList){
                
                List<Class> returnClassList = new ArrayList<Class>();
                try {
                        //Get all activity classes in the AndroidManifest.xml
                        PackageInfo packageInfo = context.getPackageManager().getPackageInfo(packageName, PackageManager.GET_ACTIVITIES);
                        if(packageInfo.activities!=null){
                                Log.d(TAG, "Found "+packageInfo.activities.length +" activity in the AndrodiManifest.xml");
                                for(ActivityInfo ai: packageInfo.activities){
                                        Class c;
                                        try {
                                                c = Class.forName(ai.name);
                                                // Maybe isAssignableFrom is unnecessary
                                                if(Activity.class.isAssignableFrom(c)){
                                                        returnClassList.add(c);
                                                        Log.d(TAG, ai.name +"...OK");
                                                }
                                        } catch (ClassNotFoundException e) {
                                                Log.d(TAG, "Class Not Found:"+ai.name);
//                                                e.printStackTrace();
                                        }
                                }
                                Log.d(TAG, "Filter out, left "+ returnClassList.size()  +" activity," + Arrays.toString(returnClassList.toArray()));
                                
                                //Exclude some activity classes
                                if(excludeList!=null){
                                        returnClassList.removeAll(excludeList);
                                        Log.d(TAG, "Exclude " + excludeList.size() +" activity,"+ Arrays.toString(excludeList.toArray()));
                                }
                                Log.d(TAG, "Return "+ returnClassList.size()  +" activity," + Arrays.toString(returnClassList.toArray()));
                        }
                } catch (NameNotFoundException e) {
                        e.printStackTrace();
                }

                return returnClassList;
        }

}


呼叫:
                List<Class> excludeList = new ArrayList<Class>();
                excludeList.add(this.getClass());
                List<Class> activities = ClassUtils.getActivitiesClass(this, getPackageName(), excludeList);



activities作為資料來源與ListView繫結在一起,點選的時候跳轉

            startActivity(new Intent(MainActivity.this, activities.get(position)));