Android跨进程启动Service流程及常见问题

Android AIDL:跨进程调用Service (AIDL Service),音视频开发书籍 public interface IAppServiceRemoteBinder extends android.os.IInterface { /** Local-side IPC implementation stub class. */ public static abstract class Stub extends android.os.Binder implements com.zhuanghongji.startservicefromanotherapp.IAppServiceRemote 阅读详情

最近学习Android跨进程通信,使用到AIDL,参考着开发艺术探索,但是实践过程中也遇到一些问题,特记下流程和常见问题,使用工具Android Studio

1.服务端编写AIDL文件
这里写图片描述
点击new,创建AIDL接口文件
文件结构
生成了IMyAidlInterface.aidl文件,文件名是可以自己修改的

package com.example.android_7_test;

// Declare any non-default types here with import statements
import com.example.android_7_test.Book;

interface IMyAidlInterface {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     * 在接口文件中定义 服务端提供的方法  供客户端调用 ,下面的setBook是我测试的方法
     *
     */
    void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
            double aDouble, String aString);
    /**
    1.定义的方法不能有修饰符
    2.不能有方法体
    3.除了基本数据类型,要加上方向参数  in 输入性(作为参数传入)  out 输出型(返回值) inout
    */
    boolean setBook(in Book book);
}

这里面有一个测试用的实体类Book(实体类要实现parcelable接口),同时在相同包下创建Book.aidl,自定义实体类都需要创建同名的aidl文件,可以点击new -》file -》 相应的文件名,后缀为.aidl,参考上方的图

package com.example.android_7_test;
/**
注明 parcelable + 自定义类名
*/
parcelable Book;

Note: 这三个类的包名必须一致,有可能自动生成的包名带有.aidl.xxx,有可能出错,可以都去掉,而且在IMyAidlInterface接口中要明确引入 相关实体类,参考上方的代码
实体类不一定要和这两个aidl文件放在同一个包下,但是为了客户端方便移植,建议放同一个包下,但是这样会造成java目录下的类无法访问这个实体类,会出现无法找到类引用,这时候需要在build.gradle添加配置

android{
sourceSets {
        main {
            manifest.srcFile 'src/main/AndroidManifest.xml'
            java.srcDirs = ['src/main/java', 'src/main/aidl']
            resources.srcDirs = ['src/main/java']
            aidl.srcDirs = ['src/main/aidl']
            res.srcDirs = ['src/main/res']
            assets.srcDirs = ['src/main/assets']
        }
    }
}

2.同步项目,生成AIDL的java文件
这里写图片描述
点击同步项目,完成后在Project目录结构下的build-》source-》aidl下可以看到生成的java文件
这里写图片描述
3.服务端实现接口

1.实现接口
2.重写onBind,返回binder对象
/**
这个是kotlin代码,可以自己改成java代码
*/
class MyService : Service() {
    //实现接口,这里实现的是接口的内部stub类
    val interfa = object : IMyAidlInterface.Stub() {


        override fun setBook(book: Book?): Boolean {
            //实现定义的方法,这里是发送一个toast
            Handler(Looper.getMainLooper()).post({ Toast.makeText(applicationContext, "收到设置", Toast.LENGTH_SHORT).show() })
            return true
        }

        override fun basicTypes(anInt: Int, aLong: Long, aBoolean: Boolean, aFloat: Float, aDouble: Double, aString: String?) {
            TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
        }
    }

    override fun onBind(intent: Intent): IBinder {
        //返回binder对象,不返回的话绑定服务无法成功
        return interfa.asBinder()
    }
}

4.在Manifest文件注册Service

<!--
process = ":remote"  这个表示在新的进程中运行
exported = "true"  这个标识是否可被外部程序调用,不设置的话外部程序绑定启动这个service会出现
java.lang.SecurityException: Not allowed to bind to service Intent 
-->
<service     
            android:name=".MyService"
            android:process=":remote"
            android:exported="true"
           ></service>

5.客户端复制创建的文件到相同包下
可以和服务端一样,创建aidl文件,生成aidl目录,但是这样生成的包名会不一致,可以在该目录下新建包,和服务端文件包名一致
这里写图片描述
①同样,这样java目录下的类文件也无法访问实体类Book,还是要在build.gradle中进行上述的配置!!!

②包名必须和服务端的包名一致!!!,否则会出现Binder invocation to an incorrect interface

6.客户端绑定启动service,调用相关方法

/**
获取返回的binder对象
*/
IMyAidlInterface iMyAidlInterface = null;
    private ServiceConnection serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            iMyAidlInterface = IMyAidlInterface.Stub.asInterface(service);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        Intent intent = new Intent();
        /**
        跨进程,无法使用Intent(this,xx.class)方法,可以使用下面的,通过包名和完整路径类名创建Intent
        */
        intent.setClassName("com.example.android_7_test","com.example.android_7_test.MyService");
        bindService(intent,serviceConnection,BIND_AUTO_CREATE);
    }

后面就可以用IMyAidlInterface对象调用服务端的定义的方法实现通信,需要注意上面提到的容易出错的点。

感谢阅读,如有错误,欢迎指正。

Android Service绑定与跨进程通信 Android 绑定服务与跨进程通信 阅读详情

相关推荐

Android车载 CarFrameWork——carservice启动流程

在Service每一次的开启关闭过程中,只有onStart可被多次调用(通过多次startService调用),其他onCreate,onBind,onUnbind,onDestroy在一个生命周期中只能被调用一次。所以调用bindService的生命周期为:onCreate --> onBind(只一次,不可多次绑定) --> onUnbind --> onDestroy。设备文件路径在: /system/priv-app/CarService/CarService.apk。创建ICarImpl实例。

m0_71524094的博客 1922

Android 跨进程启动Service无效

Android 跨进程启动Service无效,隐式方式启动服务

Somafish的博客 4558

Android Binder跨进程与非跨进程的传输异同源码分析

网上很多文章都介绍了Service的绑定过程,但是并没有介绍对于跨进程与非跨进程,对于不同的返回值,其具体有什么区别,以及具体是怎么实现的。这篇文章就根据源码分析Android究竟是在哪部分来控制跨进程与非跨进程Binder的传输的,Binder究竟是怎么传输的。

破磬 8727

Service属性介绍: android:exported

android:exported 这个属性用于指示该服务是否能够被其他应用程序组件调用或跟它交互。如果设置为true,则能够被调用或交互,否则不能。 设置为false时,只有同一个应用程序的组件或带有相同用户ID的应用程序才能启动或绑定该服务。 它的默认值依赖与该服务所包含的过滤器。没有过滤器则意味着该服务只能通过指定明确的类名来调用,这样就是说该服务只能在应用程序的内部使用(因为其他外部使

stone的专栏 8112

Android四大组件系列5 Service启动流程

一 概述 Service 的启动流程还是比较简单的,不像 Activity 那么复杂,相关联的类和方法也少了很多,不像 Activity 启动流程里面走着走着就会迷失方向,在上一篇文章我们主要分析了 Activity 的启动过程,今天我们主要来探索 Service 的启动过程。 Service 是 Android 四大组件,地位仅次于 Activity,Activity 位于前台向用户展示界面;Service 位于后台不可见,但是它承担了大部分的的数据处理工作,主要为其他组件提供后台服务,监控其他组件的运行

liuwg1226的专栏 1333

实战指南:基于华为Ascend NPU的大模型W8A8量化调优与精度提升

本文提供了一份基于华为Ascend NPU进行大模型W8A8量化的实战调优指南。详细介绍了从环境搭建、使用msmodelslim框架进行基础量化,到通过离群值抑制、校准集优化和量化回退等关键技术提升精度的全流程。旨在帮助开发者在华为NPU硬件上实现模型推理的显著加速,同时有效控制精度损失。

weixin_29227425的博客 271

Android 启动service(Kotlin)

注意该方法不会调用onBind()和onUnbind()

qq_19688207的博客 1624

代码审计工具学习之RISP(安装以及初步操作)

1 代码审计 1.1名词解释 代码审计(Code audit)是一种以发现程序错误,安全漏洞和违反程序规范为目标的源代码分析。软件代码审计是对编程项目中源代码的全面分析,旨在发现错误,安全漏洞或违反编程约定。 它是防御性编程范例的一个组成部分,它试图在软件发布之前减少错误。 C和C ++源代码是最常见的审计代码,因为许多高级语言(如Python)具有较少的潜在易受攻击的功能(例如,不检查边界的函数)。 顾名思义就是检查源代码中的安全缺陷,检查程序源代码是否存在安全隐患,或者有编码不规范的地方,通过..

weixin_52515588的博客 1万+

android 阿里面试题,Kotlin 的循环语法(1),Service有几种启动方式

代码真的是重质不重量,质量高的代码,是当前代码界提倡的,当然写出高质量的代码肯定需要一个相当高的专业素养,这需要在日常的代码书写中逐渐去吸收掌握,谁不是每天都在学习呀,目的还不是为了一个,为实现某个功能写出高质量的代码。所以,长征路还长,大家还是好好地做个务实的程序员吧。最后,小编这里有一系列Android提升学习资料,有兴趣的小伙伴们可以来看下哦~本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录一个人可以走的很快,但一群人才能走的更远。

2401_84002482的博客 327

智能体评测技术与实践:从评估维度到DeepEval实战指南

智能体评测技术与实践:从评估维度到DeepEval实战指南 本文系统探讨了AI智能体的评测体系与实践方法。首先从四个关键维度构建评估框架:基础能力(意图理解、知识完整性)、复杂任务(多轮对话、动态工作流)、可靠性(幻觉抑制、安全合规)以及工具效率(参数填充、多工具协同)。其次分析了主流评测工具,包括xBench的动态双轨评估、DeepEval的全链路监控等解决方案。最后详细介绍了DeepEval的实战应用,涵盖环境配置、测试用例构建、指标配置及CI/CD集成,展示了如何通过代码化评估实现智能体质量的持续提升

Linda的自动化测试之旅 3418

EG2134驱动芯片实战:如何用TSSOP20封装搞定三相无刷电机驱动(附电路图)

本文详细介绍了EG2134驱动芯片在三相无刷电机驱动中的应用实践,包括芯片选型、电路设计和PCB布局技巧。EG2134作为一款高性能半桥驱动芯片,采用TSSOP20封装,适合紧凑型设计。文章还提供了典型应用电路图和调试指南,帮助工程师快速实现稳定可靠的电机驱动方案。

d3e4f的博客 308

Android Service 跨进程启动权限

Android跨进程Service调用权限实践 本文对比了Android跨进程通信中Service和BroadcastReceiver的优劣,重点探讨了Service的权限控制机制。通过实践测试发现: Service在双向通信、数据量、生命周期控制等方面优于BroadcastReceiver 跨进程调用需注意App安装顺序,先安装Server才能成功启动 测试发现OPPO等厂商可能默认阻止跨进程Service启动 详细分析了Service权限标签(android:permission)和保护级别(prote

Zen@sz 博客 1439

手把手教你学Simulink——基于Simulink的Boost变换器电流模式控制(峰值电流控制)建模示例

本文详细介绍了基于Simulink的Boost变换器峰值电流模式控制建模方法。首先分析了Boost变换器在CCM模式下的工作原理及电流控制优势,重点阐述了斜坡补偿的必要性。通过分步指导搭建Simulink模型,包括主电路、电流采样、RS触发器和电压外环PI控制器等核心模块。仿真验证了系统在启动、负载突变和输入电压跌落等工况下的优异性能,输出电压稳定在48V±0.5V。文章还总结了工程实践要点,并提出了数字实现等扩展方向。该建模方法为电力电子高级控制策略的工程验证提供了有效途径。

MHD0815的博客 249

android跨进程启动service

1,启动服务的客户端 MyLog.i(TAG,"启动服务"); String shopId = PreferencesUtil.getString(MainActivity.this, Constants.SHOPID_KEY); String userName = PreferencesUtil.getString(MainActivity.this, Constants.USERNAME_K

lkx94的专栏 5368

分享一个完整的KANO问卷(包含正反问题和选项设置)

本文介绍了KANO模型问卷的设计与应用,用于评估功能需求优先级。问卷包含基本信息、功能评估(正反问题设计)、界面评估及开放问题,选项定义明确(如"非常喜欢"到"很不喜欢")。数据清洗规则包括剔除矛盾回答和注意力检验。通过量化编码和矩阵分析,将需求分为魅力型、期望型、必备型等类别。示例数据显示健康监测为必备型(72%),电子围栏为期望型(45%),适老化改造为无差异型(38%)。该模型为产品决策提供客观量化依据。

从技术实践立足,从项目管理方法论延伸思考 1796

【AUTOSAR-DEM】-2.4-APP SWC如何读取MIL灯状态以及配置MIL灯

该篇博文将告诉您: MIL(Malfunction Indicator Lamp/Light)灯的点灯和灭灯过程; DEM模块如何配置MIL灯; APP SWC如何获取MIL灯状态。

「汽车电子助手」的博客 1712

Android 问题03_Service 跨进程启动失败

摘要:Android跨进程Service启动失败问题分析 文章记录了在Android项目中实现跨进程Service通信时遇到的问题。作者设计了两个独立应用(服务端和客户端),通过bindService方式进行IPC通信。在测试中发现,虽然方案在Google Pixel 6和模拟器上运行正常,但在一加和OPPO等国产手机(Android 13/15)上被系统阻止启动,日志显示"prevent start..."错误。文章对比了不同设备的运行结果,并提供了完整的客户端和服务端代码实现,包括I

Zen@sz 博客 1373

Python爬虫技术:使用Playwright和Twitter API v2高效获取Twitter/X数据完全教程

遵守规则:始终遵循Twitter的使用条款和速率限制错误处理:实现完善的错误处理和重试机制数据质量:进行数据清洗和验证性能优化:使用异步处理和合理的延迟设置可维护性:模块化代码,便于维护和扩展。

2201_76125261的博客 671

Service跨进程启动流程源码探究

根据《Activity启动流程源码探究》我们可以清楚以下几点: 1)Context的通用实现是在ContextIml这个类中 2)Activity的启动过程需要借助ActivityManagerService(AMS)这个服务端来完成,其本质是通过Binder通信 3)Binder通信使用了2次,第一次Context作为客户端向AMS发起start请求,第二次AMS作为客户端向IApplicati...

Edwin_C 的博客 690

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

深入浅出Service启动流程

转载请标明出处:【顾林海的博客】 本篇文章已授权微信公众号 顾林海 独家发布 Service启动方式有两种,一种是通过Context的startService启动Service,另一种是通过Context的bindService绑定Service,下面对这两种启动方式的启动流程进行详细的讲解。 startService的启动流程 通过startService方法启动Service会调用Con...

顾林海 2万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Service启动流程

Service 的启动流程还是比较简单的,不像 Activity 那么复杂,相关联的类和方法也少了很多,不像 Activity 启动流程里面走着走着就会迷失方向,在之前两篇文章我们主要分析了 Activity 的启动流程,今天我们主要来探索 Service 的启动过程。Service 是 Android 四大组件,地位仅次于 Activity,Activity 位于前台向用户展示界面;Service 位于后台不可见,但是它承担了大部分的的数据处理工作,主要为其他组件提供后台服务,监控其他组件的运行状态。

weixin_43700867的博客 1471

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Service通过onBind跨进程启动流程源码探究

根据《Activity启动流程源码探究》我们可以清楚以下几点: 1)Context的通用实现是在ContextIml这个类中 2)Activity的启动过程需要借助ActivityManagerService(AMS)这个服务端来完成,其本质是通过Binder通信 3)Binder通信使用了2次,第一次Context作为客户端向AMS发起start请求,第二次AMS作为客户端向IApplicati...

Edwin_C 的博客 1755

Android bind service讲解以及跨进程通信

Android bind service讲解以及Messenger跨进程通信

skateboard1的专栏 4482

【Android】跨进程通信——AIDL、之Service基本细节使用之:精通

入门及高级进阶Android组件 Service

学习只为当小狗狗,学习只为当小狗狗,学习只为当小狗狗,学习只为当小狗狗,学习只为当小狗狗,学习只为当小狗狗,学习只为当小狗狗 7372

android 9.0 Service启动流程

Service的start方式启动流源码梳理是基于android 9.0的,在梳理过程考了《android进阶揭秘》,后面对这一块有新的认识会持续更新 ContextWrapper到AMS startService启动第一个跨进程通信,使用启动进程到请求AMS的流程.Activity调用startService方法,调用的是Context中定义的方法,但是这里抽象方法,他的实现类是ContextWrapper.java,在ContextWrapper.java中又调用了mBase的startService方

宋大人专栏 635

Android Service 启动流程

概述 Service启动流程和Activity启动流程有些相似,不了解Activity启动流程的可以看我之前的一篇博客Android App启动过程 Start Service 流程 Context.startService() 首先我们先从 context.startService()这个方法为起点进行分析,我们看下他的源码 ## ContextWrapper.java public class...

R.先森的博客 367
上一篇: Android7.0及以上下载后自动安装无法运行
下一篇: 关于ListView中嵌套EditText,焦点及其他点击问题
One_Month
博客等级 码龄11年 17粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值