getSystemService与getService区别

  Android的后台运行在很多service,它们在系统启动时被SystemServer开启,支持系统的正常工作,比如MountService监听是否有SD卡安装及移除,ClipboardService提供剪切板功能,PackageManagerService提供软件包的安装移除及查看等等,应用程序可以通过系统提供的Manager接口来访问这些Service提供的数据,

       大概实现类似TelephoneManager这样的远程服务,但是由于TelephoneManager是已经封装过的代理类,是被谷歌阉割过的服务对象,其中部分方法我们是获取不到的(@hide),所以我们不需要去获取binder,但是对于调用另一个应用的service或者是调用服务中隐藏的方法的时候,需要通过aidl来通信,首先要获取他的Ibinder对象。下面说下获取阉割过的系统服务对象,以Telephony为例

[java]  view plain  copy
  1. "white-space:pre">    @Override  
  2.     public void onCreate(Bundle savedInstanceState) {  
  3.         super.onCreate(savedInstanceState);  
  4.         setContentView(R.layout.main);  
  5.   
  6.         TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);  
  7.         /** 
  8.          * 返回电话状态 
  9.          *  
  10.          * CALL_STATE_IDLE 无任何状态时  
  11.          * CALL_STATE_OFFHOOK 接起电话时 
  12.          * CALL_STATE_RINGING 电话进来时  
  13.          */  
  14.         tm.getCallState();  
  15.  }  
[java]  view plain  copy
  1. /** @hide */  
  2.     @SystemApi  
  3.     public void dial(String number) {  
  4.         try {  
  5.             getITelephony().dial(number);  
  6.         } catch (RemoteException e) {  
  7.             Log.e(TAG, "Error calling ITelephony#dial", e);  
  8.         }  
  9.     }  
我们发现在TelephonyManager类中的dial()方法是@hide过的(谷歌出于安全考虑,或是二次开发的原因,将这些方法隐藏掉),这就是代理服务的劣势。

下面介绍下通过getService的方式获取系统服务。

public void endCall() {

[java]  view plain  copy
  1.     //IBinder iBinder = ServiceManager.getService(TELEPHONY_SERVICE);  
  2.     try {  
  3.         //加载servicemanager的字节码  
  4.         Class clazz = CallSmsSafeService.class.getClassLoader().loadClass("android.os.ServiceManager");  
  5.         Method method = clazz.getDeclaredMethod("getService", String.class);  
  6.         IBinder ibinder = (IBinder) method.invoke(null, TELEPHONY_SERVICE);  
  7.         ITelephony.Stub.asInterface(ibinder).endCall();"color:#362e2b;">  
  8.     } catch (Exception e) {  
  9.         e.printStackTrace();  
  10.     }  
  11. }  
这种通过反射的方式获取的系统服务能够使用我们的@hide方法。

你可能感兴趣的:(安卓技术)