博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux下安装python
阅读量:7060 次
发布时间:2019-06-28

本文共 3328 字,大约阅读时间需要 11 分钟。

Android服务被设计用来执行很多操作,比如说,可以执行运行时间长的耗时操作,比较耗时的网络操作,甚至是在一个单独进程中的永不会结束的操作。实现这些操作之一是通过Android接口定义语言(AIDL)来完成的。AIDL被设计用来执行进程间通信,另一种实现方式见博文Android进程间的通信之Messenger。本文我们将学习如何创建AIDL文件实现Android进程间通信。在正式学习之前,我们先澄清一些“事实”。

关于Android Service

1、Android服务不是后台任务,它们默认只运行在你的app的主线程中2、Android服务可以通过设置来运行在不同进程中3、如果Android服务在不同进程中启动,你将不能使用通常的IBinder接口与其通信

AIDL:Android Interface Definition Language

为了在Android应用中实现进程间通信,我们需要在远端进程中定义一系列可被当前进程访问的方法。通过AIDL我们可以定义这样的一系列方法。AIDL就好像Java中的其它接口一样可以在其中定义一些抽象方法。我们首先需要创建一个以.aidl为后缀的文件并在里面定义所需的抽象方法。

AIDL的一个主要特征是,通过使用AIDL,我们可以在两个不同的应用中进行通信(其实Messenger也可以实现同样的操作,两者区别请见博文Android进程间的通信之Messenger);当然,如果你的应用不需要跟另外一个应用进行通信,那就尽量避免使用AIDL机制吧。aidl文件中定义的抽象方法中,只有一些原始数据类型以及一些基本数据类型如String,lists,maps等可以作为这些方法的参数,如果你想使用一个自定义类作为参数,那么你的自定义类必须实现Parcelable接口,并且该类要被导入AIDL文件中,这一点应该在单独的课程中进行讲解。本文只学习简单的AIDL用法。

AIDL实现思路

AIDL通过定义服务端暴露的接口,以提供给客户端来调用,AIDL使服务端可以并行处理(因此你可能需要考虑多线程并发访问的线程安全性问题)。通过编写aidl文件来设计想要暴露的接口,编译后会自动生成相应的Java文件,服务端将接口的具体实现写入Stub中,通过IBinder对象传递给客户端,客户端bindService时,通过asInterface方法将IBinder还原成接口,供客户端调用其中的方法。

简单示例

AndroidManifest.xml

复制代码

复制代码

    
        
            
            
        
        

复制代码

复制代码

IBoundService.aidl

package yf.exam.service.aidl;interface IBoundService{    int getResult(int a, int b);}

BoundService.java

复制代码

复制代码

public class BoundService extends Service {    private IBoundService.Stub mBinder = new IBoundService.Stub() {        @Override        public int getResult(int a, int b) throws RemoteException {            return a+b;        }    };    @Override    public IBinder onBind(Intent intent) {        return mBinder;    }}

复制代码

复制代码

MainActivity.java

复制代码

复制代码

public class MainActivity extends Activity {    private Button btn = null;    private IBoundService mIBoundService;    private boolean mServiceConnected = false;    private ServiceConnection conn = new ServiceConnection() {        @Override        public void onServiceDisconnected(ComponentName name) {            mServiceConnected = false;        }        @Override        public void onServiceConnected(ComponentName name, IBinder service) {            mIBoundService = IBoundService.Stub.asInterface(service);            mServiceConnected = true;        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        btn = (Button) findViewById(R.id.button1);        Intent intent = new Intent(this, BoundService.class);        bindService(intent, conn, Context.BIND_AUTO_CREATE);        btn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                if (mServiceConnected) {                    try {                        int result = mIBoundService.getResult(2, 4);                        Toast.makeText(MainActivity.this, "result=" + result,                                Toast.LENGTH_SHORT).show();                    } catch (RemoteException e) {                        e.printStackTrace();                    }                }            }        });    }    @Override    protected void onDestroy() {        super.onDestroy();        if (mServiceConnected) {            unbindService(conn);            mServiceConnected = false;        }    }}

复制代码

本文转自  zddnd  51CTO博客,原文链接:http://blog.51cto.com/13013666/1939696

转载地址:http://jmfll.baihongyu.com/

你可能感兴趣的文章
象棋中马行走路线的测试用例设计
查看>>
乌当区前三季度大数据产业实现产值60亿元
查看>>
可以拖动的弹出窗
查看>>
Tiny之Web工程构建
查看>>
android 的android httpClient详解
查看>>
IOS SEL的理解与使用
查看>>
iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式
查看>>
iOS开发之SQLite--C语言接口规范(三)——Binding Values To Prepared Statements
查看>>
gdb 调试 sysbench
查看>>
Oracle官方并发教程之中断
查看>>
使用模板实现编译期间多态
查看>>
[置顶].NET平台开源项目速览(3)小巧轻量级NoSQL文件数据库LiteDB
查看>>
Cocos2D将v1.0的tileMap游戏转换到v3.4中一例(三)
查看>>
iOS Touch ID 简易开发教程
查看>>
结构体类型指针做函数参数(C++)
查看>>
Akka笔记之消息传递
查看>>
带你实现开发者头条(一) 启动页实现
查看>>
Android Listview中Button按钮点击事件冲突解决办法
查看>>
【技术篇】SQL的四种连接-左外连接、右外连接、内连接、全连接
查看>>
可翻折的TextViewExpandableTextView
查看>>