service实现AIDL

实现远程结构(AIDL)

当然你费很大功夫写了一个程序,肯定会考虑到跟其他应用程序的“交流”问题(执行其他调用),所以很明显的就会涉及到接口(远程接口)问题,AIDL就是解决这个问题的核心所在了。你要定义远程接口,首先你必须创建一个AIDL文件,在文件中声明接口,然后实现这个接口,并且在onBind()方法被调用时返回这个接口(感觉不太清楚,看代码应该是,创建了一个类来实现这个接口,返回这个类的实例)的实例。

咳咳,自己第一次做的时候连eclipse怎么创建一个AIDL文件都不知道,不过总是有好心人在某个角落留下了例子(链接:http://my.oschina.net/u/779520/blog/79936)。

接着我们就可以通过其接口来实用服务了,这时候就涉及到ServiceConnection的两个方法,onServiceConnected()和onServiceDisconnected()来实现Service的连接和释放连接(注:远程接口调用将进行跨线程的操作,并且同步完成,如果调用需要消耗比较长的时间,那么应该向其他的耗时调用一样在另外的线程中进行处理)。

注:在另外的程序中需要使用这个接口的时候,需要在工程中添加AIDL文件以及相应的包(说的普通点就是涉及到的程序中都要有这个接口文件,一个(主人家)是实现,剩下的(客人)用来调用它)。

实例:

package com.qimu.service;

interface IRemoteInterface {
    String getValue();
}

package com.qimu.service;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;

public class Aidl_Service extends Service {

    public class aidlService extends IRemoteInterface.Stub {

        @Override
        public String getValue() throws RemoteException {
            return "Service 连接成功!";
        }
        
    }
    
    @Override
    public IBinder onBind(Intent intent) {
        
        return new aidlService();
    }
}

服务端Service实现

package com.qimu.service;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener {
    
    TextView tv_service;
    Button bt_1, bt_2;
    private IRemoteInterface iremoteInterface = null;

    private ServiceConnection serviceconnection = new ServiceConnection() {
        
        @Override
        public void onServiceDisconnected(ComponentName arg0) {
        }
        
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {

            iremoteInterface = IRemoteInterface.Stub.asInterface( service );
            bt_2.setEnabled( true );
        }
    };

    @Override
    public void onClick( View view ) {
        // TODO Auto-generated method stub
        switch ( view.getId() ) {
        
        case R.id.button1:
            
            tv_service.setText( "Service starting! " );
            bindService( new Intent("com.example.aidlservice.Aidl_Service"), serviceconnection, Context.BIND_AUTO_CREATE );
            break;
            
        case R.id.button2:
            
            try {
                tv_service.setText( iremoteInterface.getValue() );
            } catch (RemoteException e) {
                System.out.println("Error");
            }
            break;
            
        default:
            break;
        }
    }

}

客服端调用

很简单的一个例子,在客服端程序中有2个Button,1个TextView,点击bt_1绑定并启用服务,点击bt_2获取服务端实现的功能(返回一个字符串)。


实现可包装类(Parcelable)

Parcelable类主要是用来封装数据,便于传输,关于它的实用附上链接:http://blog.sina.com.cn/s/blog_78e3ae430100pxba.html,没什么太多好看的,书上提到了也就看了一下。


IntentService类

在程序设计中,你会需要处理很多高频率的请求,将这些需要周期性执行的任务放在一个工作队列中,会使得你的程序简单而高效,同时还可以避免创建一个完整的麻烦的Service,IntentService是一个简单的服务,它可以用Intent请求的方法来处理异步的任务,每个Intent都会被添加到与IntentService相关的工作队列中,然后序列化的进行处理,对于返回结果,你可以选择通过广播( sendBroadcast()方法 )向应用程序发送Intent对象,并使用应用程序中的广播接收器(BroadcastReceiver)来捕获这些结果。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值