• Android service ( 二) 远程服务


       

    通常每个应用程序都在它自己的进程内运行,但有时需要在进程间传递对象,你可以通过应用程序UI的方式写个运行在一个不同的进程中的service。在android平台中,一个进程通常不能访问其他进程中的内存区域。所以,他们需要把对象拆分成操作系统能理解的简单形式,以便伪装成对象跨越边界访问。编写这种伪装代码相当的枯燥乏味,好在android为我们提供了AIDL工具可以来做这件事。

     

    AIDL(android接口描述语言)是一个IDL语言,它可以生成一段代码,可以使在一个android设备上运行的两个进程使用内部通信进程进行交互。如果你需要在一个进程中(例如:在一个Activity中)访问另一个进程中(例如:一个Service)某个对象的方法,你就可以使用AIDL来生成这样的代码来伪装传递各种参数。

     

    要使用AIDL,Service需要以aidl文件的方式提供服务接口,AIDL工具将生成一个相应的java接口,并且在生成的服务接口中包含一个功能调用的stub服务桩类。Service的实现类需要去继承这个stub服务桩类。Service的onBind方法会返回实现类的对象,之后你就可以使用它了,参见下例:

     
    先创建一个IMyRemoteService.aidl文件

    package org.allin.android.remote;
    interface IMusicControlService{
            void play(); 
            void stop(); 
            void pause();
    }

     


     
    如果你正在使用eclipse的Android插件,则它会根据这个aidl文件生成一个Java接口类。生成的接口类中会有一个内部类Stub类,你要做的事就是去继承该Stub类: 
     

    /**
     * @author allin.dev
     * http://allin.cnblogs.com/
     *
     */
    public class RemoteMusicService extends Service {
     
        private static final String TAG = "RemoteMusicService";
        private MediaPlayer mediaPlayer;
     
        /*
         * (non-Javadoc)
         * 
         * @see android.app.Service#onBind(android.content.Intent)
         */
        @Override
        public IBinder onBind(Intent intent) {
            return binder;
        }
     
        private final IMusicControlServic<script type="text/javascript"><!--mce:1--></script>e.Stub binder = new IMusicControlService.Stub() {
     
            @Override
            public void stop() throws RemoteException {
                Log.d(TAG,"stop....");
                if (mediaPlayer != null) {
                    mediaPlayer.stop();
                    try {
                        // 在调用stop后如果需要再次通过start进行播放,需要之前调用prepare函数
                        mediaPlayer.prepare();
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    }
                }
     
            }
     
            @Override
            public void play() throws RemoteException {
                Log.d(TAG,"play....");
                if (mediaPlayer == null) {
                    mediaPlayer = MediaPlayer.create(RemoteMusicService.this,
                            R.raw.tmp);
                    mediaPlayer.setLooping(false);
                }
                if (!mediaPlayer.isPlaying()) {
                    mediaPlayer.start();
                }
            }
     
            @Override
            public void pause() throws RemoteException {
                Log.d(TAG,"pause....");
                 
                if (mediaPlayer != null && mediaPlayer.isPlaying()) {
                    mediaPlayer.pause();
                }           
            }
     
        };
         
         
        @Override
        public void onDestroy() {
            super.onDestroy();
             
            Log.d(TAG, "onDestroy");
            if(mediaPlayer != null){
                mediaPlayer.stop();
                mediaPlayer.release();
            }
        }
    }


    当客户端应用连接到这个Service时,onServiceConnected方法将被调用,客户端就可以获得IBinder对象。参看下面的客户端onServiceConnected方法:
     

    private ServiceConnection sc = new ServiceConnection() {
             
            @Override
            public void onServiceDisconnected(ComponentName name) {
                musicService = null;
                Log.d(TAG, "in onServiceDisconnected");
            }
             
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                musicService = IMusicControlService.Stub.asInterface(service);
                Log.d(TAG, "in onServiceConnected");
            }
        };

     

  • 相关阅读:
    使用 Markdown Flow 画流程图
    两串锂电池的电池匹配
    笔记: CC2540 和 CC2541 的区别
    Elasticsearch 5.x 关于term query和match query的认识
    es 批量导入文件
    mac 下搭建Elasticsearch 5.4.3分布式集群
    Elastic Search 5.4.3 java api 入门
    solr java demo 基础入门
    创建索引并进行查询
    RabbitMq 之简单队列
  • 原文地址:https://www.cnblogs.com/ldq2016/p/5216886.html
Copyright © 2020-2023  润新知