從AndroidManifest.xml中獲取已註冊Activity的方法
阿新 • • 發佈:2019-02-06
契機:
在學習並積累自定義控制元件,為了看效果,需要放到Activity中來顯示。
每次寫新的自定義控制元件,不可能都放到同一個Activity中,為了更好觀看效果,每個Activity中只放少數控制元件。
如此,隨著自定義控制元件增多,Activity也逐漸增多,相應的需要在AndroidManifest中配置,還需要想辦法(例如寫個按鈕)能夠訪問每個Activity。
於是,有沒有辦法自動從AndroidManifest.xml中獲取所有已經註冊過的Activity,放到ListView中顯示呢。
寫了以下工具類:
呼叫:
在學習並積累自定義控制元件,為了看效果,需要放到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)));