• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

匪徒在线的博客

路漫漫其修远兮,吾将上下而求索。
  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

初识安卓之服务:客户端绑定服务和服务端如何返回客户请求的结果

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

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>

posted on 2012-12-01 18:14  匪徒在线  阅读(377)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3