zoukankan      html  css  js  c++  java
  • 初识安卓之服务:客户端绑定服务和服务端如何返回客户请求的结果

    客户端请求绑定一个服务和得到服务返回值的过程

    public class MainActivity extends Activity {
        /** Called when the activity is first created. */
         private InvokeInterface ii;
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
        }
        //在主界面一调用客户端的绑定(onBind)方法,就要传一个链接对象给服务端,它就会返回一个
        //IBinder给链接对象中的 onServiceConnected用
        private ServiceConnection conn=new ServiceConnection() {
            
            //链接丢失或服务被杀死的时候执行的回调函数
            @Override
            public void onServiceDisconnected(ComponentName name) {
                
            }
            //链接上后执行的回调函数
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
      //aidl技术:服务端生成一个InvokeInterface.aidl文件,客户端拿到这个文件,这个文件起了很重要的作用:
                //两者可以通过这个文件互相发送数据:
      //当客户端调用自己的aidl对象的业务方法(接口里定义了的)时,给方法传个参数,存到客户端的aidl中
                //就可以把参数传到服务端的aidl文件里,服务端拿到这个参数,调用它那边对这个接口的实现类,服务端就把
    这个实现类对象的父类传到这里来,也就是service,这时还不能调用业务方法,把这个对象的父类类型
                //强转成接口类型,就可以得到一个包含了处理具体业务的对象,用对象调用方法就可以得到结果了
                
                ii = Stub.asInterface(service);            
                System.out.println("绑定成功,得到IBinder!");
            }
        };
        public void onclick(View view) throws Exception{
            Intent intent=new Intent("com.itheima.service.RemoteServeice");
             switch (view.getId()) {
            case R.id.start:
           //利用意图对象按照指定动作开启一个服务
                startService(intent);
                break;
            case R.id.bind:
                //绑定一个服务需要的参数:用于打开服务的intent,用来连接上服务的conn,固定参数:自动绑定
                bindService(intent, conn,BIND_AUTO_CREATE);
                break;
            case R.id.invoke:
                //ii是回调回来的对象,里面包含了具体处理参数的逻辑方法,调用即可
                System.out.println(ii.sayHello("lsk"));
                break;
            case R.id.unbind:
                    unbindService(conn)    ;
                break;
            case R.id.stop:
                stopService(intent);
                break;
            }
        }
    }

    服务端如何定义一个服务,并对外提供业务方法处理客户端请求

    public class RemoteServeice extends Service {
        
        //自定义的返回类对象,这个对象实现了公用接口,覆盖了接口中的方法,
        //该方法若在客户端被传入参数进行调用,则会返回此处外部类对象的业务方法的处理结果
        private class MyBinder extends Stub {
            @Override
            public String sayHello(String name) {
                return RemoteServeice.this.sayHello(name);
            }
        }
        public String sayHello(String name){
            return "Hello"+name;
        }
        @Override
        public void onCreate() {
            // TODO Auto-generated method stub
            super.onCreate();
            System.out.println("s onCreate");
        }
        //启动服务和绑定服务没有任何先后顺序之分,是平行的,但创建服务一定是最先的
        @Override
        public void onStart(Intent intent, int startId) {
            // TODO Auto-generated method stub
            super.onStart(intent, startId);
            System.out.println("s onStart");
        }
     
        @Override
        public void onDestroy() {
            // TODO Auto-generated method stub
            super.onDestroy();
            System.out.println("s onDestroy");
        }
     
        @Override
        public IBinder onBind(Intent intent) {
            // TODO Auto-generated method stub
            System.out.println("s onBind");
            //返回的是自定义的MyBinder类对象,这个类继承了Stub,而Stub继承了IBinder的子实现类Binder,
            //同时Stub也实现了服务和客户端共同的借口,也就是aidl技术处理的那个借口
            return new MyBinder();
        }
     
        @Override
        public boolean onUnbind(Intent intent) {
            // TODO Auto-generated method stub
            System.out.println("s onUnbind");
            return super.onUnbind(intent);
        }
    }

    需要使用aidl(Android interface definition language)技术处理的公共接口:

    interface InvokeInterface {
    String sayHello(String name);
    }

    如何在清单文件中配置一个服务:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.itheima.remotserveice"
        android:versionCode="1"
        android:versionName="1.0" >
     
        <uses-sdk android:minSdkVersion="10" />
     
        <application
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name" >
            <service android:name=".RemoteServeice">
                <intent-filter >
                    使用意图对象开启一个服务时,需要这个动作
              <action android:name="com.itheima.service.RemoteServeice"/>
                </intent-filter>
            </service>
        </application>
     
    </manifest>
  • 相关阅读:
    PHP中的list(),each(),reset()函数应用
    echo(),print(),print_r()
    Math.floor() 与 parseInt()
    利用Node.js轻松创建web服务器
    MySQL中Datetime与Timestamp
    修正正则匹配日期---基于网络未知大神的正则
    数据结构随笔-php实现栈
    数据结构随笔-php实现队列
    Js 获取时间戳
    linux 安装nginx+php+mysql
  • 原文地址:https://www.cnblogs.com/94007boy/p/2797512.html
Copyright © 2011-2022 走看看