Android应用程序四大组件之使用AIDL如何实现跨进程调用Service
作者:杰瑞教育 发布时间:2022-02-03 13:24:15
一、问题描述
Android应用程序的四大组件中Activity、BroadcastReceiver、ContentProvider、Service都可以进行跨进程。在上一篇我们通过ContentProvider实现了不同应用之间的跨进程调用,但ContentProvider主要是提供数据的共享(如sqlite数据库),那么我们希望跨进程调用服务(Service)呢?Android系统采用了远程过程调用(RPC)方式来实现。与很多其他的基于RPC的解决方案一样,Android使用一种接口定义语言(Interface Definition Language,IDL)来公开服务的接口。对于Service的跨进程调用需要通过AIDL来实现,AIDL服务应用非常广泛,如百度地图API中,就提供跨进程的服务,下面我们就看看如何实现AIDL Service ,案例如图:
二、实现AIDL服务的步骤
1. 编写AIDL文件
2. 如果aidl文件的内容是正确的,会自动生成一个Java接口文件(*.java)。
3. 建立一个服务类(Service的子类)。
4. 实现由aidl文件生成的Java接口。
5. 在AndroidManifest.xml文件中配置AIDL服务, 添加<action>标签的android:name,以便客户端使用隐式Intent启动服务
6、客户端
三、编写AIDL文件
Android接口定义语言——LocalService.aidl
package com.jereh.remote;
interface LocalService{
String getLocal();
}IDE会自动生成LocalService.java 文件 如图所示:
四、Remote应用实现
1、编写MyRemoteService
public class MyRemoteService extends Service {
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return new MyRemoteServiceImpl();
}
private class MyRemoteServiceImpl extends LocalService.Stub{
@Override
public String getLocal() throws RemoteException {
// TODO Auto-generated method stub
return "烟台杰瑞教育";
}
}
}
2、AndroidManifest.xml配置
<service android:name="com.jereh.retmote.MyRemoteService"
android:process="remote"
>
<intent-filter>
<action android:name="com.jereh.remote_service"/>
</intent-filter>
</service>
五、客户端实现
1、在客户端应用中添加LocalService.aidl
注意包名要与文件的在服务端定义的包名相同。如图所示:
同样会自动生成LocalService.java 代码
2、MainActivity代码:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void startService(View view){
Intent service=new Intent("com.jereh.remote_service");
super.bindService(service, conn, Context.BIND_AUTO_CREATE);
}
public void showInfo(View view){
try {
local=service.getLocal();
Log.d("jereh", local);
Toast.makeText(this,
"您已进入"+local,Toast.LENGTH_LONG).show();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private LocalService service;
private String local;
private ServiceConnection conn=new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName arg0) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder binder) {
// TODO Auto-generated method stub
// 获取远程Service的onBinder方法返回的对象代理
service=LocalService.Stub.asInterface(binder);
}
};
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
xml文件:
<LinearLayout 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:orientation="vertical"
tools:context=".MainActivity" >
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="启动远程服务" android:onClick="startService" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="查看信息" android:onClick="showInfo" />
</LinearLayout>
以上所述就是本文给大家介绍的Android应用程序四大组件之使用AIDL如何实现跨进程调用Service,希望大家喜欢。
猜你喜欢
- 序列化是将对象转换成字节流的过程,反序列化是把字节流转换成对象的过程。对象一旦被序列化,就可以把对象状态保存到硬盘的某个位置,甚至还可以通过
- 这是一个可以从乱码文本中得到正确的原始文本的程序,其基于的原理在于错误的编码往往导致位补充,因此正确的文本使用的字节数应该是最少的(之一)。
- 题目要求思路:模拟解题的核心思想在于逆向思维,不考虑每个子数组中的唯一字符个数,转而考虑每个字符可以作为多少个子数组的唯一字符;所以在计算答
- notification是一种让你的应用程序在没有开启情况下或在后台运行警示用户。它是看不见的程序组件(Broadcast Receiver
- 本文实例为大家分享了Java实现 * 系统的具体代码,供大家参考,具体内容如下父类Vehiclepublic abstract class
- Cardview配合ImageView显示圆形图效果图:刚在看自定义View的知识点时,突然想起来,如果CardView宽高相等,CardV
- 今天对Android端水印进行了一个简单的优化,优化方式是对水印生成方式的修改。如图1修改为如图2。我们先简单了解一下图一水印是如生成得。/
- 本文介绍了android沉浸式状态栏,分享给大家,希望对大家有帮助一、概述现在主流的App设计风格很多都用到了Materail Design
- JAVA常用关键字及其用法简要说明Abstract: 抽象的 一个Java语言中的关键字,用在类的声明中来指明一个类是不能被实例化的,但是可
- 标识符Java 对各种变量、方法和类等要素命名时使用的字符序列称为标识符技巧:凡是自己可以起名字的地方都叫标识符定义合法标识符规则:由26个
- 本文基于jdk1.8进行分析关于HashMap的简介,可以参考这篇文章https://www.jb51.net/article/154177
- 短网址(Short URL) ,顾名思义就是看起来很短的网址。自从twitter推出短网址服务以后,各大互联网公司都推出了自己的短网址服务。
- 直接上代码:public class WeiXinFilter implements Filter{private static Logge
- 一、内部类1.内部类的概念内部类是定义在类中的类。内部类把逻辑上相关的类放在一起。而有的内部类不会在其他地方用到,它没有类名,在定义的时候就
- 最近接了个项目其中有需要要实现此功能:seekbar需要显示最左和最右值,进度要跟随进度块移动。下面通过此图给大家展示下效果,可能比文字描述
- 介绍技术之前有用eureka 现在用nacos工作流和gateway接口数据流向数据表新建项目新建cloud-删除src-新建modleEu
- 窗体展示开始后展示结束摇色展示代码导入的命名空间using System;using System.Collections.Generic;
- 本文实例讲述了C#图像处理之边缘检测(Sobel)的方法。分享给大家供大家参考。具体如下://定义sobel算子函数private stat
- 绘制模糊数学中隶属函数分布图using System; using System.Collect
- 在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现。1. 上传简单示例Jsp