服务客户端(MainActivity):

 
  
  1. package com.example.remoteservicebind; 
  2.  
  3. import android.app.Activity; 
  4. import android.content.ComponentName; 
  5. import android.content.Context; 
  6. import android.content.Intent; 
  7. import android.content.ServiceConnection; 
  8. import android.os.Bundle; 
  9. import android.os.Handler; 
  10. import android.os.IBinder; 
  11. import android.os.Message; 
  12. import android.os.Process; 
  13. import android.os.RemoteException; 
  14. import android.util.Log; 
  15. import android.view.Menu; 
  16. import android.view.View; 
  17. import android.view.View.OnClickListener; 
  18. import android.widget.Button; 
  19. import android.widget.Toast; 
  20.  
  21. public class MainActivity extends Activity { 
  22.  
  23.     private static final String TAG = "BindRemoteService"
  24.     private IRemoteService mRemoteService = null
  25.  
  26.     @Override 
  27.     protected void onCreate(Bundle savedInstanceState) { 
  28.         super.onCreate(savedInstanceState); 
  29.         setContentView(R.layout.activity_main); 
  30.  
  31.         Button bindRemoteService = (Button) findViewById(R.id.bind_remote_service); 
  32.         bindRemoteService.setOnClickListener(mBindListener); 
  33.         Button unBindRemoteService = (Button) findViewById(R.id.unbind_remote_service); 
  34.         unBindRemoteService.setOnClickListener(mUnBindListener); 
  35.         Button remoteServiceMethod = (Button) findViewById(R.id.remote_service_method); 
  36.         remoteServiceMethod.setOnClickListener(mRemoteServiceMethodListener); 
  37.         Button killRemoteServiceProcess = (Button) findViewById(R.id.kill_remote_service_process); 
  38.         killRemoteServiceProcess.setOnClickListener(mKillRemoteServiceProcessListener); 
  39.     } 
  40.  
  41.     private final OnClickListener mBindListener = new OnClickListener() { 
  42.  
  43.         @Override 
  44.         public void onClick(View v) { 
  45.             Log.i(TAG, "Main Activity ----> onClick BindRemoteService"); 
  46.             bindService(new Intent(IRemoteService.class.getName()), mRemoteServiceConnection, Context.BIND_AUTO_CREATE); 
  47.         } 
  48.  
  49.     };  
  50.  
  51.     private final OnClickListener mUnBindListener = new OnClickListener() { 
  52.  
  53.         @Override 
  54.         public void onClick(View v) { 
  55.             Log.i(TAG, "Main Activity ----> onClick unBindService"); 
  56.             unbindService(mRemoteServiceConnection); 
  57.             mRemoteService = null
  58.         } 
  59.  
  60.     }; 
  61.  
  62.     private final OnClickListener mRemoteServiceMethodListener = new OnClickListener() { 
  63.  
  64.         @Override 
  65.         public void onClick(View v) { 
  66.             if (mRemoteService == null) { 
  67.                 Toast.makeText(MainActivity.this"没有绑定到服务", Toast.LENGTH_LONG).show(); 
  68.  
  69.             } else { 
  70.                 try { 
  71.                     Toast.makeText(MainActivity.this, mRemoteService.getName(), Toast.LENGTH_LONG).show(); 
  72.                 } catch (RemoteException e) { 
  73.                      
  74.                 }                 
  75.             } 
  76.         } 
  77.     }; 
  78.  
  79.     private final OnClickListener mKillRemoteServiceProcessListener = new OnClickListener() { 
  80.  
  81.         @Override 
  82.         public void onClick(View v) { 
  83.             int pid; 
  84.             try { 
  85.                 pid = mRemoteService.getPid(); 
  86.                 Process.killProcess(pid); 
  87.             } catch (RemoteException e) { 
  88.                 e.printStackTrace(); 
  89.             } 
  90.         } 
  91.     }; 
  92.  
  93.     private final ServiceConnection mRemoteServiceConnection = new ServiceConnection() { 
  94.  
  95.         @Override 
  96.         public void onServiceDisconnected(ComponentName name) { 
  97.  
  98.         } 
  99.  
  100.         @Override 
  101.         public void onServiceConnected(ComponentName name, IBinder service) { 
  102.             mRemoteService = IRemoteService.Stub.asInterface(service); 
  103.         } 
  104.     }; 
  105.  
  106.     private final Handler mHandler = new Handler(){ 
  107.  
  108.         @Override 
  109.         public void handleMessage(Message msg) { 
  110.             super.handleMessage(msg); 
  111.         } 
  112.  
  113.     }; 
  114.  
  115.     @Override 
  116.     public boolean onCreateOptionsMenu(Menu menu) { 
  117.         // Inflate the menu; this adds items to the action bar if it is present. 
  118.         getMenuInflater().inflate(R.menu.main, menu); 
  119.         return true
  120.     } 
  121.  

远程服务(RemoteService):

 
  
  1. package com.example.remoteservicebind;  
  2.   
  3. import android.app.Service;  
  4. import android.content.Intent;  
  5. import android.os.IBinder;  
  6. import android.os.Process;  
  7. import android.os.RemoteException;  
  8. import android.util.Log;  
  9.   
  10. /**  
  11.  * 远程服务  开启在另外一个进程中  
  12.  * @author Simon Xu  
  13.  *  
  14.  * 2013-4-11上午11:12:44  
  15.  */  
  16. public class RemoteService extends Service {  
  17.   
  18.     private static final String TAG = "BindRemoteService";  
  19.     private static final int REPORT_MSG = 1;      
  20.       
  21. //    private final Handler mHandler = new Handler(){  
  22. //  
  23. //        @Override  
  24. //        public void handleMessage(Message msg) {  
  25. //              
  26. //        }  
  27. //          
  28. //    };  
  29.   
  30.     private final IRemoteService.Stub mRemoteServiceBinder = new IRemoteService.Stub() {  
  31.           
  32.         @Override  
  33.         public int getPid(){  
  34.             Log.i(TAG, "Remote Service ----> IRemoteService & getPid()");  
  35.             return Process.myPid();  
  36.         }  
  37.           
  38.         @Override  
  39.         public void basicTypes(int anInt, long aLong, boolean aBoolean,  
  40.                 float aFloat, double aDouble, String aString)  
  41.                 throws RemoteException {  
  42.               
  43.         }  
  44.   
  45.         @Override  
  46.         public String getName(){  
  47.             Log.i(TAG, "Remote Service ----> IRemoteService & getName()");  
  48.             return "RemoteService diaomao......";  
  49.         }  
  50.     };  
  51.       
  52.     @Override  
  53.     public IBinder onBind(Intent intent) {  
  54.         Log.i(TAG, "Remote Service ----> onBind");  
  55.         if (IRemoteService.class.getName().equals(intent.getAction())) {  
  56.             return mRemoteServiceBinder;  
  57.         } else {  
  58.             return null;  
  59.         }  
  60.   
  61.     }  
  62.   
  63.     @Override  
  64.     public void onCreate() {  
  65.         Log.i(TAG, "Remote Service ----> onCreate");  
  66. //        this.mHandler.sendEmptyMessage(REPORT_MSG);  
  67.     }  
  68.   
  69.     @Override  
  70.     public void onDestroy() {  
  71.         Log.i(TAG, "Remote Service ----> onDestroy");  
  72. //        this.mHandler.removeMessages(REPORT_MSG);  
  73.     }  
  74.   
  75.     @Override  
  76.     public int onStartCommand(Intent intent, int flags, int startId) {  
  77.         Log.i(TAG, "Remote Service ----> onStartCommand");  
  78.         return super.onStartCommand(intent, flags, startId);  
  79.     }  
  80.       
  81. }  

IRemoteService.aidl:

 
  
  1. package com.example.remoteservicebind; 
  2.  
  3. interface IRemoteService{ 
  4.  
  5.     int getPid(); 
  6.      
  7.     String getName(); 
  8.      
  9.     void basicTypes(int anInt, long aLong, boolean aBoolean, 
  10.                 float aFloat, double aDouble, String aString); 
  11.      

 

图片来源于<<Android框架揭秘>>一书