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

前段时间做项目,一个项目中包含几十个activity,这些activity数目会有一些变化或者扩展,需要通过一个固定的菜单调用,activity之间也会按顺序的互相调用。需要一种机制,能够实现根据activity的个数生成菜单,当activity个数变化时,菜单个数也跟着变化,并且菜单能够和相应的activity对应,并且activity之间也可以按顺充调用,比如a调用b,b调用cc调用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 block

Log.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 block

Log.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;

}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值