从AndroidManifest.xml中获取已注册Activity的方法
2014-05-01 22:53
309 查看
契机:
在学习并积累自定义控件,为了看效果,需要放到Activity中来显示。
每次写新的自定义控件,不可能都放到同一个Activity中,为了更好观看效果,每个Activity中只放少数控件。
如此,随着自定义控件增多,Activity也逐渐增多,相应的需要在AndroidManifest中配置,还需要想办法(例如写个按钮)能够访问每个Activity。
于是,有没有办法自动从AndroidManifest.xml中获取所有已经注册过的Activity,放到ListView中显示呢。
写了以下工具类:
调用:
activities作为数据源与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)));
相关文章推荐
- Android intent 传值不更新的原因和解决办法
- Android启动器(Launcher)开发详解
- 对比Windows Phone与iOS、Android开发的不同[转]
- android ActionBar(官方指导)
- 玩转华为C8812[2]--- 曾经出过并解决的问题
- android中ListView圆角
- Android SQLite的使用,基本的增删改查效果,以及ListView的效果显示
- Android调用C#的WebService
- android 逐帧动画的播放与播放结束操作对象
- Android调用 Webservice报org.ksoap2.serializa 异常
- android 自己创建一个注释模板
- bvnc
- Android应用资源的使用方法(数组、颜色、尺寸、字符串、布尔、整数)
- 玩转华为C8812[1]--- 突破运营商的重重限制
- 启动AVD时log提示“emulator-X disconnected! Cancelling 'X activity launch'!”
- Android SDK Manager配置中遇到 连接被拒绝, 连接超时问题解决办法之一
- Android内核--Activity调度机制
- Android Graphics专题(1)--- Canvas基础
- android 使用canvas绘图保留痕迹
- android设计模式之代理模式