Android多进程间采用AIDL方式进行通信

在上一节中,我介绍了Android中Service的生命周期以及一些有关知识。在这一节中,我采用代码编写的方式来介绍一下不同程序之间也就是不同进程之间通信采用AIDL方式。

首先我需要解释一下,不同程序进程间采用AIDL方式启动服务,我们可以看作成client客户端与server服务端之间的通信,无非c/s都是安装在了我们的智能手机设备Android系统之上。好了,理解到这里我们就可以继续往下介绍了。

首先我们编写server服务端程序:

1)我们新建一个应用程序S,它的应用程序架构如下:

2)我们在com.lgy.s包下编写S.aidl文件,具体代码如下:(aidl编码格式不再叙述)

package com.lgy.s; 

interface S{
  String getStr(String name);
}

编写好S.aidl文件我们就可以使用S.stub类下的相关方法。

3)我们可以自定义我们的Service了,具体代码如下:

package com.lgy.s; 

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

public class MyService extends Service { 

  private static final String TAG = "MyService";
  private S.Stub server; 

  @Override
  public void onCreate() {
    Log.i(TAG, "onCreate");
    server = new S.Stub() {
      @Override
      public String getStr(String name) throws RemoteException {
        Log.i(TAG, name);
        return name;
      }
    };
    super.onCreate();
  } 

  @Override
  public boolean onUnbind(Intent intent) {
    Log.i(TAG, "onUnbind");
    return super.onUnbind(intent);
  } 

  @Override
  public void onDestroy() {
    Log.i(TAG, "onDestroy");
    server = null;
    super.onDestroy();
  } 

  @Override
  public IBinder onBind(Intent intent) {
    Log.i(TAG, "onBind"); 

    return server;
  } 

}

4)我们进行服务端Server最后一步,在AndroidManifest.xml文件中注册服务Service

<service android:name="com.lgy.s.MyService">
      <intent-filter >
        <action android:name="android.lgy.myService" />
      </intent-filter>
    </service>

-----------到此我们服务器端就编写完毕------------------------

下面我们编写客户端client应用程序:

1)我们新建一个应用程序C,具体应用架构如下:

2)我们将在服务器端S写的aidl原封不动的移到客户端C上来(注包文件名都原封不动),移动后架构如下图:

3)我们就可以在客户端MainActivity中直接调用绑定服务器上的服务,具体代码如下:

package com.lgy.c; 

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import android.view.View; 

import com.lgy.s.S; 

public class MainActivity extends Activity { 

  protected static final String TAG = "MainActivity";
  private S s;
  private ServiceConnection conn = new ServiceConnection() {
    @Override
    public void onServiceDisconnected(ComponentName name) { 

    } 

    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
      s = S.Stub.asInterface(service);
      Log.i(TAG, "onServiceConnected client");
    }
  }; 

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
  } 

  public void bindBtn(View v){
    Intent mIntent = new Intent("android.lgy.myService");
    bindService(mIntent, conn, BIND_AUTO_CREATE);
  } 

  public void greetBtn(View v){
    try {
      Log.i(TAG, s.getStr("client"));
    } catch (RemoteException e) {
      e.printStackTrace();
    }
  } 

  public void unbindBtn(View v){
    unbindService(conn);
  } 

}

4)MainActivity对应的布局文件代码如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:paddingBottom="@dimen/activity_vertical_margin"
  android:paddingLeft="@dimen/activity_horizontal_margin"
  android:paddingRight="@dimen/activity_horizontal_margin"
  android:paddingTop="@dimen/activity_vertical_margin"
  tools:context="com.lgy.c.MainActivity" > 

  <Button
    android:id="@+id/button1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:onClick="bindBtn"
    android:text="绑定服务器Service" /> 

  <Button
    android:id="@+id/button2"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/button1"
    android:layout_below="@+id/button1"
    android:onClick="greetBtn"
    android:text="传递参数给服务器获取返回的数据" /> 

  <Button
    android:id="@+id/button3"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/button2"
    android:layout_below="@+id/button2"
    android:onClick="unbindBtn"
    android:text="解除绑定服务" /> 

</RelativeLayout>

至此为止客户端代码我们已经编写完毕。

下面我们开始测试:

我们不运行服务器端,而是直接运行客户端的话,相对应的效果会怎么样呢?具体效果如下解析:

第一、我们点击绑定服务的话,系统程序无任何反应,这个时候在客户端服务已经绑定,但是没有连接到服务端。接着我们再次点解读取数据的话,系统将会崩溃。因为没有连接到服务器端方法没有具体实现。

第二、我们点击绑定服务的话,系统程序无任何反应,这个时候在客户端服务已经绑定,但是没有连接到服务端,接着我们点击解除服务绑定的话,系统仍然没有任何反应,我们要是再接着点击解除服务绑定的话,系统就会崩溃,这也就从而再次证明了服务只会绑定一次,多次绑定的话服务不会做出任何反应;服务解除绑定只能仅只能解除绑定一次,多次解除绑定服务的话,系统就会崩溃。

第三、我们直接点击接受数据,系统程序也会崩溃,原因就是在于服务没有绑定,服务端根本就没有连接,相当于数据读取方法没有实现。

第四:我们直接点击解除绑定的话,系统程序也会崩溃,原因就是在于服务一次也没有绑定。

我们现在运行服务器,相对应的效果又会怎么样呢?具体效果如下解析:

第一、我们点击绑定服务,可以观察到后台logcat日志信息:

从日志我们可以看出在客户端C绑定服务同时连接服务端,可以看到服务端Service的启动onCreate和服务Service绑定onBind。

第二、我们点击获取数据,可以观察到后台logcat日志信息:

从日志图中我们可以看出客户端将client字符串数据传递给服务器端,服务器端接受并返回一个字符串数据。

第三、我们点击解除绑定服务,具体logcat如下:

第四:如果我们不点击绑定服务,而是直接点获取数据,或者解除绑定的话,系统都将会崩溃,具体原因前面已经解释清楚,在此不作过多重复。

以上就是AIDL在多进程中通信调用的简单应用(C应用程序启动S应用程序服务Service)。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • Android使用AIDL方式实现播放音乐案例
  • Android AIDL实现两个APP间的跨进程通信实例
  • Android使用AIDL实现两个App间通信
  • Android应用程序四大组件之使用AIDL如何实现跨进程调用Service
  • 使用Android studio创建的AIDL编译时找不到自定义类的解决办法
  • Android 使用【AIDL】调用外部服务的解决方法
  • 基于Android AIDL进程间通信接口使用介绍
  • Android程序设计之AIDL实例详解
  • 实例讲解Android中的AIDL内部进程通信接口使用
  • Android Studio创建AIDL文件并实现进程间通讯实例
(0)

相关推荐

  • Android使用AIDL实现两个App间通信

    今天开发了一个功能,通过Android的AIDL机制完成两个app间的通信.功能需求很简单,一个客户端app,叫做client,一个服务端app叫orderManager:客户端负责展示订单列表,并且可以向服务端添加订单:服务端负责管理订单,可以对外提供订单信息. 闲言少叙,下面直接上代码. 1.编写bean类. 首先在client中定义OrderBean类,字段很简单,注意需要实现Parcelable接口: package com.example.wang.client.bean; impor

  • 基于Android AIDL进程间通信接口使用介绍

    AIDL:Android Interface Definition Language,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口. ICP:Interprocess Communication ,内部进程通信. 使用: 1.先创建一个aidl文件,aidl文件的定义和java代码类似,但是!它可以引用其它aidl文件中定义的接口和类,但是不能引用自定义的java类文件中定义的接口和类,要引用自定义的接口或类,需要为此类也定义一个对应的aidl文件,并且此

  • Android 使用【AIDL】调用外部服务的解决方法

    在Android 中有一种服务说是服务其实倒不如说是一个接口,这个接口名为:Android Interface Definition Language ,这个接口可提供跨进程访问服务,英文缩写为:AIDL. 此种服务的好处在于,多个应用程序之间建立共同的服务机制,通过AIDL在不同应用程序之间达到数据的共享和数据相互操作,下面将通过一个DEMO 演示AIDL 是如何为应用程序之间提供服务的.本文大纲为:•1.创建AIDL 服务端.•2.创建AIDL 客户端.•3.客户端调用服务端提供的服务接口.

  • Android使用AIDL方式实现播放音乐案例

    本文实例为大家分享了Android使用AIDL方式实现播放音乐的具体代码,供大家参考,具体内容如下 思路: ① 新建两个APP项目或者Module,一个作为服务端,一个作为客户端,在服务端创建service ② 在两个module的main文件中分别新建两个aidl文件(接口),里边定义处理音乐的方法 ③ 在两个AIDL文件定义过方法后在任务栏给他们makeproject,编译成Java文件,才能在service和acvitity中使用 interface.Stub需要实例化,实现远程方法 ④.

  • Android AIDL实现两个APP间的跨进程通信实例

    本文为大家分享了Android AIDL实现两个APP间的跨进程通信实例,供大家参考,具体内容如下 1 Service端创建 首先需要创建一个Android工程然后创建AIDL文件,创建AIDL文件主要为了生成继承了Binder的Stub类,以便应用Binder进行进程间通信 servier端结构如下 AIDL代码如下 // IBookManager.aidl package com.example.bookserver.aidl; // Declare any non-default type

  • 使用Android studio创建的AIDL编译时找不到自定义类的解决办法

    使用AS创建ADIL文件时AS会在main文件夹下给我们生成一个aidl文件夹和一个相同包名的包,通常我们会把所有和ADIL相关的类或文件放在这个包下,但是如果存在自定义的类时,程序编译时无法通过,提示找不到自定义的包.解决办法如下,在启动Module的build.gradle中加入如下代码: sourceSets { main { manifest.srcFile 'src/main/AndroidManifest.xml' java.srcDirs = ['src/main/java', '

  • Android Studio创建AIDL文件并实现进程间通讯实例

    在Android系统中,跨进程通信是非常普遍的事情,它用到了Binder机制处理进程之间的交互.Binder机制会开放一些接口给Java层,供android开发工程师调用进程之间通信.这些接口android封装到了AIDL文件里,当我们项目用到跨进程通信时可以创建.aidl文件,.aidl文件可以协助我们达到跨进程的通信.下面简单介绍用AndroidStudio创建AIDL文件的过程. a.新建AIDL文件 1.项目文件夹右键---> new --->选择AIDL 2.自定义一个接口名称 3.

  • Android程序设计之AIDL实例详解

    通常来说,AIDL这项技术在我们的应用开发过程中并不是很常用,虽然新浪微博提供了SSO登录,但是其原理就是使用AIDL.本文就以完整的实例形式讲述了AIDL的原理及实现方法. AIDL(AndRoid接口描述语言)是一种借口描述语言; 编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的. 如果需要在一个Activity中, 访问另一个Service中的某个对象, 需要先将对象转化成 AIDL可识别的参数(可能是多个参数), 然后使用AIDL来传递这些参数,

  • Android应用程序四大组件之使用AIDL如何实现跨进程调用Service

    一.问题描述 Android应用程序的四大组件中Activity.BroadcastReceiver.ContentProvider.Service都可以进行跨进程.在上一篇我们通过ContentProvider实现了不同应用之间的跨进程调用,但ContentProvider主要是提供数据的共享(如sqlite数据库),那么我们希望跨进程调用服务(Service)呢?Android系统采用了远程过程调用(RPC)方式来实现.与很多其他的基于RPC的解决方案一样,Android使用一种接口定义语言

  • 实例讲解Android中的AIDL内部进程通信接口使用

    首先描述下我们想要实现的内容,我们希望在一个应用中通过点击按钮,去操作另一个进程中应用的音乐播放功能. 如图,我们点击"播放"时,系统就会去远程调用我们提供的一个service(与当前service不是同一个应用哦),然后操作service中的音乐播放,点击"停止"则会终止播放.想要重新播放的话,必须先点"销毁service",再点播放按钮哦.(至于这里为什么要先点销毁按钮才能播放,完全是为了给大家展示下,远程调用service时,怎么去解绑se

随机推荐