Android 中 AIDL 的理解与使用

1.跨应用启动Service

  设置启动Service的Intent

  serviceIntent = new Intent();
  serviceIntent.setComponent(new ComponentName("com.example.startservicefromanotherapp", "com.example.startservicefromanotherapp.AppService"));

  com.example.startservicefromanotherapp是Service所在的包(package)名

  com.example.startservicefromanotherapp.AppService是Service的名字

2.跨应用绑定Service

  在Service所在的工程创建一个以aidl为后缀名的文件,eclipse会自动在gen目录下生成对应的java文件

  例如

  package com.example.startservicefromanotherapp;
  interface IAppServiceRemoteBinder{
  void setData(String data);
  }

  再新建一个工程,并把aidl文件拷贝到src目录下新建的相同的包名

3.跨应用Service通信

  Service端的onBind方法

  

public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
return new IAppServiceRemoteBinder.Stub() {

@Override
public void setData(String data) throws RemoteException {
// TODO Auto-generated method stub
AppService.this.data = data;
}

};

  在ServiceConnection的onServiceConnected方法中

  binder = IAppServiceRemoteBinder.Stub.asInterface(service);

  同步数据

  binder.setData(edtInput.getText().toString());

4.所有代码

Service端

package com.example.startservicefromanotherapp;

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

public class AppService extends Service {
public AppService() {
}
private String data = "默认数据";
private boolean running = false;
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
return new IAppServiceRemoteBinder.Stub() {

@Override
public void setData(String data) throws RemoteException {
// TODO Auto-generated method stub
AppService.this.data = data;
}

};
}
@Override
public void onCreate() {
super.onCreate();
System.out.println("service onCreate");
running = true;
new Thread(){
public void run() {
while (running) {
try {
sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(data);

}
};
}.start();
};
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
running = false;
System.out.println("service onDestroy");

}
}

aidl文件

package com.example.startservicefromanotherapp;
interface IAppServiceRemoteBinder{
void setData(String data);
}

客户端

文件结构

package com.example.anotherapp;

import android.support.v7.app.ActionBarActivity;

import com.example.startservicefromanotherapp.IAppServiceRemoteBinder;

import android.annotation.SuppressLint;
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.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;

@SuppressLint("NewApi")
public class AnotherApp extends ActionBarActivity implements OnClickListener, ServiceConnection {
Intent serviceIntent;
EditText edtInput;
private IAppServiceRemoteBinder binder = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_another_app);
serviceIntent = new Intent();

serviceIntent.setComponent(new ComponentName("com.example.startservicefromanotherapp", "com.example.startservicefromanotherapp.AppService"));
edtInput = (EditText) findViewById(R.id.etInput);
findViewById(R.id.btnStartService).setOnClickListener(this);
findViewById(R.id.btnStopService).setOnClickListener(this);
findViewById(R.id.btnBindService).setOnClickListener(this);
findViewById(R.id.btnUnbindService).setOnClickListener(this);
findViewById(R.id.btnSyncData).setOnClickListener(this);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.another_app, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.btnStartService:
startService(serviceIntent);
break;
case R.id.btnStopService:
stopService(serviceIntent);
break;
case R.id.btnBindService:
bindService(serviceIntent, this, BIND_AUTO_CREATE);
break;
case R.id.btnUnbindService:
unbindService(this);
break;
case R.id.btnSyncData:
if (binder != null) {
try {
binder.setData(edtInput.getText().toString());
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
};
break;
default:
break;
}
}

@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
System.out.println("service connected");
binder = IAppServiceRemoteBinder.Stub.asInterface(service);
}

@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
binder = null;
}
}

  

时间: 2024-12-15 07:15:37

Android 中 AIDL 的理解与使用的相关文章

彻底明白Android中AIDL及其使用

1.为什么要有AIDL? 无论学什么东西,最先得弄明白为什么要有这个东西,不要说存在即是合理,存在肯定合理,但是你还是没有明白.对于AIDL有一些人的浅显概念就是,AIDL可以跨进程访问其他应用程序,和其他应用程序通讯,那我告诉你,很多技术都可以访问,如广播(应用A在AndroidManifest.xml中注册指定Action的广播)应用B发送指定Action的广播,A就能收到信息,这样也能看成不同应用之间完成了通讯(但是这种通讯是单向的):还如ContentProvider,通过URI接口暴露

Android技术22:Android中AIDL

在Android中进程内部通过全局变量,文件,preference,数据库作为数据的载体实现数据共享和通信.然后在进程之间则需要借助Binder实现IPC调用.Android进程通信框架:服务端,客户端,Linux binder驱动.Binder驱动成为连接两端的桥梁.我们首先通过aidl语言实现一个简单的多进程通信.具体实现步骤如下: 1.定义aidl文件 IService.aidl,定义一个接口,test() ,不包含负责的类和数据. 1 package com.demo.ipc; 2 3

Android 中AIDL的使用与理解

AIDL的使用: 最常见的aidl的使用就是Service的跨进程通信了,那么我们就写一个Activity和Service的跨进程通信吧. 首先,我们就在AS里面新建一个aidl文件(ps:现在AS建aidl不要求和java包名相同了): package aidl; interface IMyInterface { String getInfor(String s); } 可以看到,在这里面我们就一个方法getInfor(String s),接受一个字符串参数,然后返回一个字符串,恩,相当的简单

Android中AIDL实现进程通信(附源码下载)

AIDL概述 之前的博客<Android中通过Messenger与Service实现进程间双向通信>演示了如何通过Messenger实现与Service进行跨进程通信,即IPC.但用Messenger实现的IPC存在一点不足:Service内部维护着一个Messenger,Messenger内部又维护着一个Hanlder,当多个client向该Service发送Message时,这些Message需要依次进入Hanlder的消息队列中,Hanlder只能处理完一个Message之后,再从消息队

《Android笔记3.6》 Android 中 Context 的理解及使用

课程背景:Context 是 Android 中一个非常重要的概念,用于访问全局信息,几乎所有的基础组件都继承自 Context,理解 Context 对于学习 Android 四大基本组件非常有帮助. 核心内容:1.理解 Context2.理解 Application Context 的作用 用于访问全局的资源 很多常用组件都是继承自Context,就是为了方便访问资源. private TextView tv; @Override protected void onCreate(Bundle

【三】6.Android 中 Context 的理解及使用

[一]Context的作用:访问全局信息 Context是访问全局信息的接口,比如说应用程序的资源(图片资源.字符串资源.其他资源...), 所以一些常用组件就会继承Context,目的就是为了访问资源,比如说Activity以及将要学习的Service. 创建项目来看下如何通过Context进行资源的访问. public class MainActivity extends Activity{     private TextView tv;          @Override     pr

Android中Context的理解与使用技巧

Context类,时刻的在与它打交道,例如:Service.BroadcastReceiver.Activity等都会利用到Context的相关方法. 但是不懂Context的原理.类结构关系.一个简单的问题是,一个应用程序App中存在多少个Context实例对象呢? Context,中文直译为"上下文",SDK中对其说明如下: Interface to global information about an application environment. This is an ab

彻底明确Android中AIDL及其使用

1.为什么要有AIDL? 不管学什么东西,最先得弄明确为什么要有这个东西.不要说存在即是合理.存在肯定合理,可是你还是没有明确. 对于AIDL有一些人的浅显概念就是,AIDL能够跨进程訪问其它应用程序,和其它应用程序通讯,那我告诉你.非常多技术都能够訪问,如广播(应用A在AndroidManifest.xml中注冊指定Action的广播)应用B发送指定Action的广播,A就能收到信息,这样也能看成不同应用之间完毕了通讯(可是这样的通讯是单向的).还如ContentProvider,通过URI接

Android中AIDL通信机制分析

一.背景 ·1.AIDL出现的原因 在android系统中,每一个程序都是运行在自己的进程中,进程之间无法进行通讯,为了在Android平台,一个进程通常不能访问另一个进程的内存空间,所以要想对话,需要将对象分解成操作系统可以理解的基本单元,并且有序的通过进程边界.通过代码来实现这个数据传输过程是冗长乏味的,Android提供了AIDL工具来处理这项工作,实现IPC(进行间的通信)与J2e中的RMI类似. ·2.绑定service 我看了很多人都博客都没有说到这里,其实我个人感觉AIDL就是一个