Android Service(7)--完结篇

简介:

傻蛋在Android Service(4) 中讲述了使用AIDL语言,来让ADT帮助我们自动生成一个Stub类(Binder的子类),来实现不同进程中Service的调用。通过研究ADT自动生成的代码可以发现,这段代码其实是帮我们实现了一个代理类,这个代理能够通过进行不同进程间的通信。我们Activity调用这个代理类,而这个调用远程Service中的方法。从而实现了远程通信。

今天傻蛋自己写了一个底层远程通信的代理类(具体通信方式傻蛋在第6篇中已经讲了),同样实现了远程调用Service的效果。基本结构和ADT自动生成的代码相似,但是清晰了很多,使用方法和第四篇中的使用一某一样,十分通用。

 

?[Copy to clipboard] Download IMyMusicService.java
 

  
  
  1. /**  
  2.  * IMusicService.java  
  3.  * com.androidtest.service.mediaplayer  
  4.  *  
  5.  * Function: TODO  
  6.  *  
  7.  *   ver     date           author  
  8.  * ──────────────────────────────────  
  9.  *           2011-6-22      Leon  
  10.  *  
  11.  * Copyright (c) 2011, TNT All Rights Reserved.  
  12.  */  
  13.    
  14. package com.androidtest.service.remoteplayer;  
  15.    
  16. import android.os.Binder;  
  17. import android.os.IBinder;  
  18. import android.os.Parcel;  
  19. import android.os.RemoteException;  
  20. import android.util.Log;  
  21.    
  22. /**  
  23.  * ClassName:IMusicService Function: TODO ADD FUNCTION Reason: TODO ADD REASON  
  24.  *  
  25.  * @author Leon  
  26.  * @version  
  27.  * @since Ver 1.1  
  28.  * @Date 2011-6-22  
  29.  */  
  30. public interface IMyMusicService {  
  31.    
  32.     static final String TAG = IMyMusicService.class.getSimpleName();  
  33.     static final int TRANSACTION_PLAY = android.os.IBinder.FIRST_CALL_TRANSACTION + 0;  
  34.     static final int TRANSACTION_PAUSE = android.os.IBinder.FIRST_CALL_TRANSACTION + 1;  
  35.     static final int TRANSACTION_STOP = android.os.IBinder.FIRST_CALL_TRANSACTION + 2;  
  36.    
  37.     public void play() throws RemoteException ;  
  38.    
  39.     public void pause()throws RemoteException ;  
  40.    
  41.     public void stop() throws RemoteException ;  
  42.    
  43.     public static abstract class Stub extends Binder implements IMyMusicService {  
  44.         //用于Service的接收  
  45.         @Override  
  46.         protected boolean onTransact(int code, Parcel data, Parcel reply,  
  47.                 int flags) throws RemoteException {  
  48.    
  49.             // TODO Auto-generated method stub  
  50.             switch (code) {  
  51.             case TRANSACTION_PLAY:  
  52.                 this.play();  
  53.                 /**  
  54.                  * 注意 readString 是这样解释  
  55.                  * Read a string value from the parcel at the current dataPosition().  
  56.                  * 第二次读的话data position就会前移,此处就为null了  
  57.                  */  
  58.                 String temp = data.readString();  
  59.                 Log.v(TAG,"The Message From  Clinet : "+temp);  
  60.                 reply.writeString(temp);  
  61.                 return true;  
  62.             case TRANSACTION_PAUSE:  
  63.                 this.pause();  
  64.                 Log.v(TAG,"The Message From  Clinet : "+data.readString());  
  65.                 reply.writeString(data.readString());  
  66.                 return true;  
  67.             case TRANSACTION_STOP:  
  68.                 this.stop();  
  69.                 Log.v(TAG,"The Message From  Clinet :"+data.readString());  
  70.                 reply.writeString(data.readString());  
  71.                 return true;  
  72.             }  
  73.             return super.onTransact(code, data, reply, flags);  
  74.    
  75.         }  
  76.         //模板模式  
  77.         public abstract void play() throws RemoteException ;  
  78.    
  79.         public abstract void pause() throws RemoteException ;  
  80.    
  81.         public abstract void stop() throws RemoteException ;  
  82.    
  83.         //其实就是获取代理类,供Activity来调用  
  84.         public static IMyMusicService asInterface(IBinder iBinder){  
  85.             return new Proxy(iBinder);  
  86.         }  
  87.    
  88.         //Activity其实就是通过此代理和远程的Stub进行通信  
  89.         private static class Proxy implements IMyMusicService{  
  90.             private IBinder iBinder;  
  91.             public  Proxy(IBinder iBinder) {  
  92.                 this.iBinder =iBinder;  
  93.             }  
  94.    
  95.             @Override  
  96.             public void pause() {  
  97.                 Parcel sendData = Parcel.obtain();  
  98.                 Parcel replyData =Parcel.obtain();  
  99.                 sendData.writeString("pause");  
  100.                 try {  
  101.                     iBinder.transact(TRANSACTION_PAUSE, sendData, replyData, 0);  
  102.                     Log.v(TAG, "The Message From Service " + replyData.readString() );  
  103.                 } catch (RemoteException e) {  
  104.                     // TODO Auto-generated catch block  
  105.                     e.printStackTrace();  
  106.                 }  
  107.                 // TODO Auto-generated method stub  
  108.             }  
  109.    
  110.             @Override  
  111.             public void play() {  
  112.    
  113.                 // TODO Auto-generated method stub  
  114.                 Parcel sendData = Parcel.obtain();  
  115.                 Parcel replyData =Parcel.obtain();  
  116.                 sendData.writeString("play");  
  117.                 try {  
  118.                     iBinder.transact(TRANSACTION_PLAY, sendData, replyData, 0);  
  119.                     Log.v(TAG, "The Message From Service " + replyData.readString());  
  120.                 } catch (RemoteException e) {  
  121.                     // TODO Auto-generated catch block  
  122.                     e.printStackTrace();  
  123.                 }  
  124.    
  125.             }  
  126.    
  127.             @Override  
  128.             public void stop() {  
  129.    
  130.                 // TODO Auto-generated method stub  
  131.                 Parcel sendData = Parcel.obtain();  
  132.                 Parcel replyData =Parcel.obtain();  
  133.                 sendData.writeString("stop");  
  134.                 try {  
  135.                     iBinder.transact(TRANSACTION_STOP, sendData, replyData, 0);  
  136.                     Log.v(TAG, "The Message From Service " + replyData.readString() );  
  137.                 } catch (RemoteException e) {  
  138.                     // TODO Auto-generated catch block  
  139.                     e.printStackTrace();  
  140.                 }  
  141.    
  142.             }  
  143.    
  144.         }  
  145.    
  146.     }  
 

  
  
  1. /**  
  2.  * MyRemoteBinder.java  
  3.  * com.androidtest.service.remoteplayer  
  4.  *  
  5.  * Function: TODO  
  6.  *  
  7.  *   ver     date           author  
  8.  * ──────────────────────────────────  
  9.  *           2011-6-22      Leon  
  10.  *  
  11.  * Copyright (c) 2011, TNT All Rights Reserved.  
  12. */  
  13.    
  14. package com.androidtest.service.remoteplayer;  
  15.    
  16. import android.media.MediaPlayer;  
  17. import android.os.RemoteException;  
  18.    
  19. import com.androidtest.service.mediaplayer.MyMediaController;  
  20.    
  21. /**  
  22.  * ClassName:MyRemoteBinder  
  23.  * Function: TODO ADD FUNCTION  
  24.  * Reason:   TODO ADD REASON  
  25.  *  
  26.  * @author   Leon  
  27.  * @version  
  28.  * @since    Ver 1.1  
  29.  * @Date     2011-6-22  
  30.  */  
  31. public class MyCustomRemoteBinder extends IMyMusicService.Stub{  
  32.    
  33.     public  MyCustomRemoteBinder(MediaPlayer mediaPlayer){  
  34.         MyMediaController.mediaPlayer=mediaPlayer ;  
  35.     };  
  36.     @Override  
  37.     public void play() throws RemoteException {  
  38.    
  39.         // TODO Auto-generated method stub  
  40.         MyMediaController.play.execute();  
  41.    
  42.     }  
  43.    
  44.     @Override  
  45.     public void pause() throws RemoteException {  
  46.    
  47.         // TODO Auto-generated method stub  
  48.         MyMediaController.pause.execute();  
  49.    
  50.     }  
  51.    
  52.     @Override  
  53.     public void stop() throws RemoteException {  
  54.    
  55.         // TODO Auto-generated method stub  
  56.         MyMediaController.stop.execute();  
  57.    
  58.     };   
  59.    

本篇是Android Service的思考(7)的完结篇,Service用起来不难,但是理解其中的机制就有一定的难度了,尤其是远程调用一定要对远程代理有深刻的认识才行。本系列设计的源码很多,如果有人需要请加最牛网的群找傻蛋索要。



本文转自 最牛傻蛋 51CTO博客,原文链接:http://blog.51cto.com/zuiniuwang/718284,如需转载请自行联系原作者

相关文章
|
6月前
|
Android开发
Android 11 添加Service服务SELinux问题
Android 11 添加Service服务SELinux问题
338 1
|
6月前
|
Android开发
Android基础知识:请解释Service是什么,它与IntentService的区别是什么?
Android基础知识:请解释Service是什么,它与IntentService的区别是什么?
109 0
|
6月前
|
XML Java Android开发
Android Studio App开发之服务Service的讲解及实战(包括启动和停止,绑定与解绑,推送服务到前台实现音乐播放器,附源码)
Android Studio App开发之服务Service的讲解及实战(包括启动和停止,绑定与解绑,推送服务到前台实现音乐播放器,附源码)
843 0
|
5月前
|
调度 Android开发
43. 【Android教程】服务:Service
43. 【Android教程】服务:Service
56 2
|
6月前
|
Android开发
Android Service Call /dev/xxx SELinux
Android Service Call /dev/xxx SELinux
107 1
|
3月前
|
编解码 网络协议 Android开发
Android平台GB28181设备接入模块实现后台service按需回传摄像头数据到国标平台侧
我们在做Android平台GB28181设备对接模块的时候,遇到这样的技术需求,开发者希望能以后台服务的形式运行程序,国标平台侧没有视频回传请求的时候,仅保持信令链接,有发起视频回传请求或语音广播时,打开摄像头,并实时回传音视频数据或接收处理国标平台侧发过来的语音广播数据。
|
6月前
|
存储 监控 Java
Android Service之设备存储空间监控 DeviceStorageMonitorService
Android Service之设备存储空间监控 DeviceStorageMonitorService
126 2
|
6月前
|
Android开发 数据库管理
Android如何在Activity和Service之间传递数据
Android如何在Activity和Service之间传递数据
292 3
|
6月前
|
Android开发
Android Service的两种使用方法
Android Service的两种使用方法
47 2
|
6月前
|
数据可视化 Android开发
[Android 四大组件] --- Service
[Android 四大组件] --- Service
49 0