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; } }
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; } }
相关文章推荐
- Android 使用反射调用自定义AIDL **.Stub.asInterface(IBinder obj)、反射实现关机shutdown
- 【Android开发经验】使用反射,得到的类的字段、方法、并实现了简单的调用
- android j使用JNI实现ava语言调用C语言
- 使用反射技术在Android平台上实现本进程内Activity切换时的拦截
- 使用SWIG实现C/C++与其他语言间的互相调用 zz
- Android IPC机制(三)在Android Studio中使用AIDL实现跨进程方法调用
- 在android中使用xml调用webservice,实现自己的单词查询
- 轻松实现Android 更换皮肤(主题) - 资源打包为apk,使用AssetManager动态解析调用
- Windows 平台上的使用 Java 语言实现 appium 自动化程序 for Android(完整版)
- android之使用Soap协议调用webservice实现手机归属地查询
- 使用COM方式实现不同语言之间的调用
- 使用Android应用调用WebService实现天气预报
- Windows 平台上的使用 Java 语言实现 appium 自动化程序 for Android(完整版)
- C#使用反射调用SpVoice实现播放文本
- Android使用 Java 反射实现 API Hook
- vlc-android 中调用用libvlcjni.so实现流媒体播放,自己使用libvlcjni.so
- Android Service 的使用(五)----如何实现AIDL文件中含有对象的调用
- Android使用ksoap2调用C#中的webservice实现图像上传
- Appium :Windows 平台上的使用 Java 语言实现 appium 自动化程序 for Android
- 利用反射调用android系统已实现的功能