`
abc20899
  • 浏览: 933986 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

建立AIDL服务的步骤(1)

阅读更多

8.4.2  建立AIDL服务的步骤(1)

建立AIDL服务要比建立普通的服务复杂一些,具体步骤如下:

(1)在Eclipse Android工程的Java包目录中建立一个扩展名为aidl的文件。该文件的语法类似于Java代码,但会稍有不同。详细介绍见实例52的内容。

(2)如果aidl文件的内容是正确的,ADT会自动生成一个Java接口文件(*.java)。

(3)建立一个服务类(Service的子类)。

(4)实现由aidl文件生成的Java接口。

(5)在AndroidManifest.xml文件中配置AIDL服务,尤其要注意的是,<action>标签中android:name的属性值就是客户端要引用该服务的ID,也就是Intent类的参数值。这一点将在实例52和实例53中看到。

实例52:建立AIDL服务

AIDL服务工程目录:src\ch08\ch08_aidl

客户端程序工程目录:src\ch08\ch08_aidlclient

本例中将建立一个简单的AIDL服务。这个AIDL服务只有一个getValue方法,该方法返回一个String类型的值。在安装完服务后,会在客户端调用这个getValue方法,并将返回值在TextView组件中输出。建立这个AIDL服务的步骤如下:

(1)建立一个aidl文件。在Java包目录中建立一个IMyService.aidl文件。IMyService.aidl文件的位置如图8.24所示。




IMyService.aidl文件的内容如下:
package net.blogjava.mobile.aidl; 
interface IMyService 

    String getValue(); 
}

IMyService.aidl文件的内容与Java代码非常相似,但要注意,不能加修饰符(例如,public、private)、AIDL服务不支持的数据类型(例如,InputStream、OutputStream)等内容。

(2)如果IMyService.aidl文件中的内容输入正确,ADT会自动生成一个IMyService.java文件。读者一般并不需要关心这个文件的具体内容,也不需要维护这个文件。关于该文件的具体内容,读者可以查看本节提供的源代码。

(3)编写一个MyService类。MyService是Service的子类,在MyService类中定义了一个内嵌类(MyServiceImpl),该类是IMyService.Stub的子类。MyService类的代码如下:
package net.blogjava.mobile.aidl; 

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

public class MyService extends Service 
{  
    public class MyServiceImpl extends IMyService.Stub 
    { 
        @Override 
        public String getValue() throws RemoteException 
        { 
            return "Android/OPhone开发讲义"; 
        } 
    } 
    @Override 
    public IBinder onBind(Intent intent) 
    {         
        return new MyServiceImpl(); 
    } 
}

在编写上面代码时要注意如下两点:

IMyService.Stub是根据IMyService.aidl文件自动生成的,一般并不需要管这个类的内容,只需要编写一个继承于IMyService.Stub类的子类(MyServiceImpl类)即可。

onBind方法必须返回MyServiceImpl类的对象实例,否则客户端无法获得服务对象。

(4)在AndroidManifest.xml文件中配置MyService类,代码如下:
<service android:name=".MyService" >
    <intent-filter>  
        <action android:name="net.blogjava.mobile.aidl.IMyService" />
    </intent-filter>
</service>

其中"net.blogjava.mobile.aidl.IMyService"是客户端用于访问AIDL服务的ID。

下面来编写客户端的调用代码。首先新建一个Eclipse Android工程(ch08_aidlclient),并将自动生成的IMyService.java文件连同包目录一起复制到ch08_aidlclient工程的src目录中,如图8.25所示。





调用AIDL服务首先要绑定服务,然后才能获得服务对象,代码如下:

package net.blogjava.mobile; 

import net.blogjava.mobile.aidl.IMyService; 
import android.app.Activity; 
import android.content.ComponentName; 
import android.content.Context; 
import android.content.Intent; 
import android.content.ServiceConnection; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 

public class Main extends Activity implements OnClickListener 

    private IMyService myService = null; 
    private Button btnInvokeAIDLService; 
    private Button btnBindAIDLService;  
    private TextView textView; 
    private ServiceConnection serviceConnection =
new ServiceConnection() 
    { 
        @Override 
        public void onServiceConnected(ComponentName
name, IBinder service) 
        { 
            //  获得服务对象 
            myService = IMyService.Stub.asInterface(service); 
            btnInvokeAIDLService.setEnabled(true); 
        } 
        @Override 
        public void onServiceDisconnected(ComponentName name) 
        { 
        } 
    }; 
    @Override 
    public void onClick(View view) 
    { 
        switch (view.getId()) 
        { 
            case R.id.btnBindAIDLService: 
                //  绑定AIDL服务 
                bindService(new Intent("net.blogjava.
mobile.aidl.IMyService"), 
                        serviceConnection, Context.BIND_AUTO_CREATE); 
                break; 
            case R.id.btnInvokeAIDLService: 
                try 
                { 
                    textView.setText(myService.
getValue());     //  调用服务端的getValue方法 
                } 
                catch (Exception e) 
                { 
                } 
                break; 
        } 
    } 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
        btnInvokeAIDLService = (Button) findViewById
(R.id.btnInvokeAIDLService); 
        btnBindAIDLService = (Button) findViewById
(R.id.btnBindAIDLService); 
        btnInvokeAIDLService.setEnabled(false); 
        textView = (TextView) findViewById(R.id.textview); 
        btnInvokeAIDLService.setOnClickListener(this); 
        btnBindAIDLService.setOnClickListener(this); 
    } 
}
  • 大小: 14.4 KB
  • 大小: 13 KB
分享到:
评论

相关推荐

    AIDL服务使用

    1. **定义AIDL接口**:在项目的`src/main/aidl`目录下创建一个`.aidl`文件,定义服务的接口。 2. **实现服务端**:创建一个继承自`Binder`的服务类,并实现上一步定义的接口中的方法。 3. **注册服务**:在服务端的...

    Andriod 服务Servive详解

     8.1 Service起步  8.1.1 Service的生命周期  8.1.2 绑定Activity和Service  ... 8.4.1 什么是AIDL服务  8.4.2 建立AIDL服务的步骤(1)  8.4.2 建立AIDL服务的步骤(2)  8.4.2 建立AIDL服务的步骤

    AndroidAIDL

    - 绑定服务:客户端通过Binder机制与服务建立连接,获取到Stub的代理对象。 - 跨进程调用:客户端调用Stub对象的方法,实际调用会被封装成Parcel数据并发送到服务端,服务端接收到Parcel后,反序列化执行相应方法,...

    AIDL for HALs测试客户端

    1. **创建AIDL接口**:根据HAL的服务接口,创建相应的AIDL文件。 2. **编译AIDL**:Android Studio或构建系统会自动生成对应的Java代码。 3. **连接服务**:在客户端应用中,通过`IBinder`对象获取服务的引用,并...

    AIDL双向绑定kotlin版本

    通过以上步骤,我们可以构建一个基于AIDL的双向绑定服务,利用Kotlin的简洁性和强大功能,提升代码可读性和维护性。双向绑定的实现不仅需要对AIDL有深入理解,还需要掌握Android服务的生命周期管理以及进程间通信的...

    AIDL bindservice流程图

    1. **定义接口**:在Android项目中创建一个.aidl文件,例如`IService.aidl`,在这个文件中定义服务需要暴露的接口方法。这些方法会自动生成对应的Java代码,客户端和服务端都会使用这些代码进行交互。 2. **实现...

    android AIDL服务

    在客户端,我们需要做以下步骤来使用AIDL服务: 1. 创建并注册服务:在服务端,你需要创建一个实现AIDL接口的类,并在AndroidManifest.xml中注册服务。 2. 绑定服务:在客户端,通过`bindService()`方法绑定到服务...

    Android AIDL 简易demo

    4. **在客户端调用服务**:在需要调用服务的Activity或BroadcastReceiver中,使用`bindService()`方法建立连接。首先创建一个`Intent`,指定要绑定的服务,然后创建一个`ServiceConnection`,在`onServiceConnected...

    aidl服务端和客户端例子

    2. **建立连接**:客户端通过`bindService()`方法连接到服务端,传入一个`Intent`来指定要绑定的服务和一个`ServiceConnection`,在连接成功时回调`onServiceConnected()`。 3. **获取AIDL接口代理对象**:在`...

    跨进程通信AIDL

    1. 接口定义:AIDL文件以`.aidl`为扩展名,用于声明服务提供的接口。在AIDL文件中,我们可以定义方法和参数类型,这些定义会被编译成Java代码。 2. 数据类型:AIDL支持基本的数据类型,如int、String、boolean等,...

    android aidl 之 system service 架构

    4. 实现客户端:在客户端(应用或其他系统组件)中,导入由AIDL生成的Java接口,通过IBinder接口与服务端建立连接并调用服务端方法。 总结起来,AIDL在Android System Service架构中扮演着桥梁的角色,它使得系统...

    AndroidStudio使用AIDL简单完成IPC

    以下是使用AIDL完成IPC的步骤: 1. **创建AIDL文件** 在Android Studio的项目目录下,新建一个.aidl文件,例如`IAidlInterface.aidl`。在该文件中,你可以声明服务提供的接口,包括方法名、参数类型和返回值。例如...

    跨应用调用之AIDL

    当连接建立后,可以获取到服务提供的Binder对象,通过这个Binder对象调用AIDL接口定义的方法。 5. **处理回调**: 客户端需要实现接口中的回调方法,以便接收服务端的响应。 ### 三、注意事项 1. **数据类型限制**...

    一个简单的AIDL例子

    2. 获取服务:客户端可以通过`startService`或`bindService`与服务建立连接。`bindService`通常用于需要长时间交互的情况。 3. 调用服务方法:使用`ServiceConnection`回调中的`onServiceConnected`方法获取到`...

    xamarin学习笔记A19(安卓AIDL)

    1. **定义接口**:首先,你需要创建一个.AIDL文件,其中声明服务需要暴露的接口。例如: ```aidl package com.example.myapp; interface IMyService { void sendMessage(int msg); } ``` 这个接口定义了一...

    两个APK间AIDL通信

    在Activity中,可以通过startService()或bindService()方法与服务建立连接,然后通过返回的IBinder接口调用服务端的方法。 **实现步骤:** 1. **创建AIDL文件**:在项目的res/aidl目录下创建.AIDL文件,定义接口。 ...

    aidl简单实例

    1. **定义接口**:首先,你需要创建一个.aidl文件,该文件中声明了服务提供的接口方法。接口定义类似于Java接口,但支持更有限的数据类型,如基本数据类型、List、Map和自定义的Parcelable对象。 例如: ```java ...

    AIDL实现MP3播放进度控制

    1. **AIDL基础**:AIDL文件是一种接口定义,包含方法签名和参数类型。它会自动生成相应的Java代码,用于在客户端和服务端之间建立通信桥梁。例如,`ServicePlayer.aidl`可能包含如下内容: ``` interface ...

    Android Service讲解 和 aidl 实现

    1. 创建一个新的`.aidl`文件,例如`IAidlInterface.aidl`,在其中定义接口和方法。 2. 在接口定义中,可以声明基本数据类型、List、Map以及其他的AIDL接口作为参数或返回值。 3. 编译后,Android编译系统会自动生成...

    使用 AIDL实现进程间通信

    1. **定义接口**:创建一个AIDL文件,例如`IAidlInterface.aidl`,在其中声明服务提供的接口方法和数据类型。例如: ```aidl package com.example.aidlexample; interface IAidlInterface { void sendString...

Global site tag (gtag.js) - Google Analytics