Android远程服务AIDL开发过程中容易遇见的两个问题
问题 一
JavaBinder: Uncaught remote exception! (Exceptions are not yet supported across processes.)
java.lang.RuntimeException:Can't create handler inside thread that has not called Looper.prepare()

问题描述
- 在service中的一个方法中,执行两种提示:一种是 Log 打印数据,另一种是 Toast 提示。(都是在service当前运行的线程中)
- Log打印数据成功,Toast提示抛出异常(即问题一)。
代码示例
public class AliPayService extends Service {
...
//模拟支付方法
public boolean aliPay(int money) {
Log.e("AIDL", "服务线程:" + Thread.currentThread().getName());
if (money > 100) {
Toast.makeText(this, "土豪,购买成功...", Toast.LENGTH_SHORT).show();
//handler.sendEmptyMessage(1);
return true;
} else {
Toast.makeText(this, "钱太少啦,购买失败...", Toast.LENGTH_SHORT).show();
//handler.sendEmptyMessage(0);
return false;
}
}
}
问题解决方案说明
- service服务是运行在service线程中,属于子线程。Toast提示属于更新UI的操作,必须放在主线程中执行。所以会抛出:Can't create handler inside thread that has not called Looper.prepare()异常
- 切记:::服务内如果需要执行UI更新,可以发送消息通知主线程执行。
问题 二
Caused by: java.lang.IllegalArgumentException: Service Intent must be explicit: Intent

问题描述
- 应用A 调用 应用B 中服务的某个方法。AIDL操作
- Android4.4版本的手机调用服务方法正常
- Android5.0版本之后的手机调用服务方法抛出该异常
代码示例(在应用B中以bind方式调用应用A中的服务)
//应用A中 bind方式开启应用B的指定服务
class MainActivity : AppCompatActivity() {
//服务连接对象
private var connection: MyServiceConnection? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//bind方式开启服务
val intent = Intent()
intent.action = "应用B包名.service.pay.xxx"
//intent.setPackage("应用B包名")
connection = MyServiceConnection()
bindService(intent, connection, Context.BIND_AUTO_CREATE)
}
}
//应用B中 service 在清单文件中的配置代码
<!--调用远程服务,需要通过bind方式启动服务,调用服务方法-->
<service android:name=".service.pay.AliPayService">
<intent-filter>
<action android:name="com.zero.notes.service.pay.xxx"/>
</intent-filter>
</service>
问题解决方案说明
- 使用AIDL执行跨进程操作的时候,如:应用A调用应用B中的支付服务,除了指定服务定义好的 action 之外,切记也要使用方法setPackage("包名")指定应用B的包名。(上述代码中,放开注释掉的一行代码://intent.setPackage("应用B包名") ,就可以解决该异常。)
Android远程服务AIDL开发过程中容易遇见的两个问题的更多相关文章
- 【转载】C#代码开发过程中如何快速比较两个文件夹中的文件的异同
在日常的使用电脑的过程中,有时候我们需要比较两个文件夹,查找出两个文件夹中不同的文件以及文件中不同的内容信息,进行内容的校对以及合并等操作.其实使用Beyond Compare软件即可轻松比较,Bey ...
- [android] 采用aidl绑定远程服务
aidl:android interface definition language 安卓接口定义语言 在两个不同的应用程序里面使用同一个接口 使用场景:调用支付宝服务进行支付 先写远程服务端Seri ...
- Android开发过程中在sh,py,mk文件中添加log信息的方法
Android开发过程中在sh,py,mk文件中添加log信息的方法 在sh文件中: echo "this is a log info" + $info 在py文件中: print ...
- android(java) 开发过程中经验及总结记录
android(java) 开发过程中经验及总结记录
- 关于基于Linphone的视频通话Android端开发过程中遇到的问题
关于基于Linphone的视频通话Android端开发过程中遇到的问题 运用开源项目Linphone的SDK进行开发,由于是小组进行开发,我主要负责的是界面部分. 由于当时是初学Android开发,对 ...
- [Android Pro] AIDL进程间传递自定义类型参数
1.创建.aidl 文件 AIDL 语法简单,用来声明接口,其中的方法接收参数和返回值,但是参数和返回值的类型是有约束的,且有些类型是需要 import,另外一些则无需这样做. AIDL 支持的数据类 ...
- Android Service AIDL 远程调用服务 【简单音乐播放实例】
Android Service是分为两种: 本地服务(Local Service): 同一个apk内被调用 远程服务(Remote Service):被另一个apk调用 远程服务需要借助AIDL来完成 ...
- Android的AIDL机制
Android 接口定义语言 (AIDL) AIDL(Android 接口定义语言)与您可能使用过的其他 IDL 类似. 您可以利用它定义客户端与服务使用进程间通信 (IPC) 进行相互通信时都认可的 ...
- android基础---->AIDL服务的使用
AIDL和其他的IDL类似,它允许你定义程序接口,以便客户端与服务器端通过IPC机制交互.在android上面,一个进程一般不能访问另外进程的内存.因此,Android平台将这些跨进程访问的对象分解成 ...
随机推荐
- cmd命令行界面运行python脚本显示的中文不正确
在notepad++中编写了一个脚本(如图一),在cmd命令行界面中运行却发现显示的中文不正确(如图2).图3显示的是cmd界面的默认编码. 解决方案:将脚本的注释语言改为GBK,编码格式改为ANSI ...
- nginx对特定参数限流
接到一个需求, 需要对请求(GET)里面的某个参数 的特定的值, 进行限流; 因为不限流的话, 不知道什么时候这个id的请求飙一下, 服务端就被压死了... 就像这样: /index.html?id ...
- Linux网络问题排错
前言 作为一名软件工程师,Linux相关的知识是一个不可或缺的技能点,而网络问题往往是初学者接触Linux时最先碰到的一只拦路虎,本篇博客将系统的讲解一个解决Linux网络问题的通用方法论,一个科学的 ...
- go 学习笔记之万万没想到宠物店竟然催生出面向接口编程?
到底是要猫还是要狗 在上篇文章中,我们编撰了一则简短的小故事用于讲解了什么是面向对象的继承特性以及 Go 语言是如何实现这种继承语义的,这一节我们将继续探讨新的场景,希望能顺便讲解面向对象的接口概念. ...
- 初探Electron,从入门到实践
本文由葡萄城技术团队于博客园原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 在开始之前,我想您一定会有这样的困惑:标题里的Electron ...
- 第6章 面向对象的程序设计 6.1 javascript对象
ECMA-262 把对象定义为: “无序属性的集合, 其属性可以包含基本值. 对象或者函数. ” 严格来讲,这就相当于说对象是一组没有特定顺序的值.对象的每个属性或方法都有一个名字,而每个名字都映射到 ...
- 听说你不会调参?TextCNN的优化经验Tricks汇总
前言:本篇是TextCNN系列的第三篇,分享TextCNN的优化经验 前两篇可见: 文本分类算法TextCNN原理详解(一) TextCNN代码详解(附测试数据集以及GitHub 地址)(二) 调优模 ...
- js 取两位小数
var totalPrice = (product.unitPrice * product.nums).toFixed(2);
- 杭电多校第十场 hdu6434 Count 欧拉函数打表 快速打表模板
Problem I. Count Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Other ...
- C语言实现二级指针表示字符串数组
头文件: #include<stdlib.h> #include<stdio.h> #include<string.h> 函数原型: char ** createB ...