您的位置:首页 > 移动开发 > Android开发

Android中使用反射实现类似于C语言指针的调用

2013-07-20 17:47 441 查看
前段时间做项目,一个项目中包含几十个activity,这些activity数目会有一些变化或者扩展,需要通过一个固定的菜单调用,activity之间也会按顺序的互相调用。需要一种机制,能够实现根据activity的个数生成菜单,当activity个数变化时,菜单个数也跟着变化,并且菜单能够和相应的activity对应,并且activity之间也可以按顺充调用,比如a调用b,b调用c,c调用d,当b不再起作用时,a能直接略过b而调用c。这如果是使用C语言,把所有的窗口直接使用函数指针数组,可以很方便实现,可惜的是java中没有指针。最后使用反射予以实现。创建一个application类,在该类中定义包含所有activity类名字字符串的数组。最后完美解决。代码如下:publicclasshardwareAppTest extendsApplication{ //privatestatic List<Activity> activityList = newLinkedList<Activity>();
publicString[] a= newString[] {"com.magcomm.newhardware40.TPActivityTest", "com.magcomm.newhardware40.LCDActivityTest", "com.magcomm.newhardware40.BacklightActivityTest", "com.magcomm.newhardware40.FrontCamActivityTest", "com.magcomm.newhardware40.BackCamActivityTest", "com.magcomm.newhardware40.FlashlightActivityTest", "com.magcomm.newhardware40.WifiActivityTest", "com.magcomm.newhardware40.BTActivityTest", "com.magcomm.newhardware40.FmActivityTest", "com.magcomm.newhardware40.SensorActivityTest", "com.magcomm.newhardware40.ReceiveActivityTest", "com.magcomm.newhardware40.SpkActivityTest", "com.magcomm.newhardware40.MotoActivityTest", "com.magcomm.newhardware40.EarphoneActivityTest", "com.magcomm.newhardware40.SIMActivityTest", "com.magcomm.newhardware40.TcardActivityTest", "com.magcomm.newhardware40.LightSersorActivityTest" }; publicList<String> activityList= Arrays.asList(a);//newArrayList();
@Override publicvoidonConfigurationChanged(Configuration newConfig) { //TODOAuto-generated method stub super.onConfigurationChanged(newConfig); }
@Override publicvoidonCreate() { //TODOAuto-generated method stub super.onCreate(); }
publicbooleanonOptionsItemSelected(MenuItem item, Class<?> cls, Context c) { Stringcur_name = cls.getName(); intindex = activityList.indexOf(cur_name); Classcls1 = null; Stringstr; Log.i("BBBBBBBB","XXXXXXX, index ="+index); Log.i("BBBBBBBB","XXXXXXX, cur_name ="+cur_name); Log.i("BBBBBBBB","XXXXXXX, item.getItemId()="+item.getItemId()); switch(item.getItemId()) { case1: break; case2: break; case3: str= activityList.get(index-1); Log.i("BBBBBBBB","XXXXXXX, str ="+str); //str= str.substring(str.lastIndexOf(".")+1, str.length()); Log.i("BBBBBBBB","YYY, str ="+str); try{ cls1= Class.forName(str); }catch(ClassNotFoundException e) { //TODOAuto-generated catch blockLog.i("hardwareAppTest",str+" activity not find!"); e.printStackTrace(); } break; case4: str= activityList.get(index+1); Log.i("BBBBBBBB","ZZZZ, str ="+str); //str= str.substring(str.lastIndexOf(".")+1, str.length()); Log.i("BBBBBBBB","NNNN, str ="+str); try{ cls1= Class.forName(str); }catch(ClassNotFoundException e) { //TODOAuto-generated catch blockLog.i("hardwareAppTest",str+" activity not find!"); e.printStackTrace(); } break; case5: break; case6: break; default: str= activityList.get(index-3); Log.i("BBBBBBBB","ZZZZ, str ="+str); //str= str.substring(str.lastIndexOf(".")+1, str.length()); Log.i("BBBBBBBB","NNNN, str ="+str); try{ cls1= Class.forName(str); }catch(ClassNotFoundException e) { //TODOAuto-generated catch block Log.i("hardwareAppTest",str+" activity not find!"); e.printStackTrace(); } break; } //cls.newInstance(); Log.i("BBBBBBBB","XXXXXXX, cls1 ="+cls1.getName()); IntentmIntent = newIntent(); mIntent.setClass(c,cls1); c.startActivity(mIntent); //返回true表示处理完菜单项的事件,不需要将该事件继续传播下去了 returntrue; } }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: