5.Android硬件访问服务使用反射
2017-08-06 21:07
232 查看
1>. 采用反射机制的方式去访问硬件
1<. 优化安装包大小步骤:
1<. File -> Project Structure -> Modules ->
2<. app -> Dependencies -> Scope -> Provided
2<. 开始使用反射机制的改写
1<. 开始代码转换
**[!原来的]** iLedService = ILedService.Stub.asInterface(ServiceManager.getService("leds"));
**[!现在的]** Method getService = Class.forName("android.os.ServiceManager").getMethod("getService", String.class); Object ledService = getService.invoke(null, "leds"); Method asInterface = Class.forName("android.os.ILedService$Stub").getMethod("asInterface", IBinder.class); Proxy = asInterface.invoke(null, ledService); ledCtrl = Class.forName("android.os.ILedService$Stub$Proxy").getMethod("ledCtrl", int.class, int.class);
2<. 使用:
ledCtrl.invoke(Proxy, 0, 0);
示例代码
1<. MainActivity.java –APP层package com.becauseican.app_0001_leddemo; import android.app.Activity; import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; import android.os.ServiceManager; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.CheckBox; import android.widget.Toast; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; //import android.os.ILedService; public class MainActivity extends Activity { private Button buttonLead = null; private boolean boolLead = false; private CheckBox checkBoxLed1 = null; private CheckBox checkBoxLed2 = null; private CheckBox checkBoxLed3 = null; private CheckBox checkBoxLed4 = null; //private ILedService iLedService = null; Object Proxy = null; Method ledCtrl = null; /* 自己定义的类 */ class MyButtonListener implements View.OnClickListener { @Override public void onClick(View v) { boolLead = !boolLead; if (boolLead) { buttonLead.setText("Close All"); checkBoxLed1.setChecked(true); checkBoxLed2.setChecked(true); checkBoxLed3.setChecked(true); checkBoxLed4.setChecked(true); /* 全部点亮 */ for (int i = 0; i < 4; ++i) { try { ledCtrl.invoke(Proxy, i, 1); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } }else { buttonLead.setText("Open All"); checkBoxLed1.setChecked(false); checkBoxLed2.setChecked(false); checkBoxLed3.setChecked(false); checkBoxLed4.setChecked(false); /* 全部熄灭 */ for (int i = 0; i < 4; ++i) { try { ledCtrl.invoke(Proxy, i, 0); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } } } } public void onCheckboxClicked(View view) { // Is the view now checked? boolean checked = ((CheckBox) view).isChecked(); // Check which checkbox was clicked try { switch(view.getId()) { case R.id.CheckBoxLed4: if (checked) { Toast.makeText(getApplicationContext(), "CheckBoxLed4 on", Toast.LENGTH_SHORT).show(); ledCtrl.invoke(Proxy, 3, 1); } // Put some meat on the sandwich else { Toast.makeText(getApplicationContext(), "CheckBoxLed4 off", Toast.LENGTH_SHORT).show(); ledCtrl.invoke(Proxy, 3, 0); } // Remove the meat break; case R.id.CheckBoxLed3: if (checked) { Toast.makeText(getApplicationContext(), "CheckBoxLed3 on", Toast.LENGTH_SHORT).show(); ledCtrl.invoke(Proxy, 2, 1); } // Cheese me else { Toast.makeText(getApplicationContext(), "CheckBoxLed3 off", Toast.LENGTH_SHORT).show(); ledCtrl.invoke(Proxy, 2, 0); } // I'm lactose intolerant break; case R.id.CheckBoxLed2: if (checked) { Toast.makeText(getApplicationContext(), "CheckBoxLed2 on", Toast.LENGTH_SHORT).show(); ledCtrl.invoke(Proxy, 1, 1); } // Put some meat on the sandwich else { Toast.makeText(getApplicationContext(), "CheckBoxLed2 off", Toast.LENGTH_SHORT).show(); ledCtrl.invoke(Proxy, 1, 0); } // Remove the meat break; case R.id.CheckBoxLed1: if (checked) { Toast.makeText(getApplicationContext(), "CheckBoxLed1 on", Toast.LENGTH_SHORT).show(); ledCtrl.invoke(Proxy, 0, 1); } // Put some meat on the sandwich else { Toast.makeText(getApplicationContext(), "CheckBoxLed1 off", Toast.LENGTH_SHORT).show(); ledCtrl.invoke(Proxy, 0, 0); } // Remove the meat break; // TODO: Veggie sandwich } } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); buttonLead = (Button) findViewById(R.id.ButtonLead); /* 获得硬件访问服务的实例化对象 */ /* 利用反射机制实现硬件访问服务 * iLedService = ILedService.Stub.asInterface(ServiceManager.getService("leds")); */ try { Method getService = Class.forName("android.os.ServiceManager").getMethod("getService", String.class); IBinder ledService = (IBinder) getService.invoke(null, "leds"); Method asInterface = Class.forName("android.os.ILedService$Stub").getMethod("asInterface", IBinder.class); Proxy = asInterface.invoke(null, ledService); ledCtrl = Class.forName("android.os.ILedService$Stub$Proxy").getMethod("ledCtrl", int.class, int.class); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } checkBoxLed1 = (CheckBox) findViewById(R.id.CheckBoxLed1); checkBoxLed2 = (CheckBox) findViewById(R.id.CheckBoxLed2); checkBoxLed3 = (CheckBox) findViewById(R.id.CheckBoxLed3); checkBoxLed4 = (CheckBox) findViewById(R.id.CheckBoxLed4); /* // 采用匿名类的方式 buttonLead.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v){ boolLead = !boolLead; if (boolLead) { buttonLead.setText("Close All"); }else { buttonLead.setText("Open All"); } } }); */ //使用自定义类的方式 buttonLead.setOnClickListener(new MyButtonListener()); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } @Override protected void onDestroy() { for (int i = 0; i < 4; ++i) { try { ledCtrl.invoke(Proxy, i, 0); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } super.onDestroy(); } }
相关文章推荐
- Android 6.0中应用程序使用硬件访问服务实例
- 开发Android应用程序来使用硬件访问服务
- 在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口
- 在Ubuntu上为Android系统的Application Frameworks层增加硬件访问服务
- 在Ubuntu上为Android系统的Application Frameworks层增加硬件访问服务
- 在Ubuntu上为Android系统的Application Frameworks层增加硬件访问服务
- 在Ubuntu上为Android系统的Application Frameworks层增加硬件访问服务
- 在Ubuntu上为Android系统的Application Frameworks层增加硬件访问服务
- 在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口
- 在Ubuntu上为Android系统的Application Frameworks层增加硬件访问服务
- 在Ubuntu上为Android系统的Application Frameworks层增加硬件访问服务
- 为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口
- 在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口
- (四)在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口
- 在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口
- 在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口
- 在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口
- 在Ubuntu上为Android系统的Application Frameworks层增加硬件访问服务
- 为Android系统的Application Frameworks层增加硬件访问服务
- 在Ubuntu上为Android系统的Application Frameworks层增加硬件访问服务