AIDL(2):服务端回调客户端
1.大致流程
- 在服务端声明远程服务接口IRemoteService.aidl,并声明回调接口ICallback.aidl
- 在服务端实现远程服务接口IRemoteService.Stub
- 使用RemoteCallbackList保存回调接口列表
- 发布服务
- 在客户端实现回调接口 ICallback.Stub
- 绑定服务,注册回调接口
- 调用服务
- 远程服务从RemoteCallbackList中找到回调,然后调用.
2.服务端
2.1 声明服务接口IRemoteService.aidl
// IRemoteService.aidl
package com.example.ee.aidl;
import com.example.ee.aidl.ICallback;
interface IRemoteService {
int getPid();
oneway void fun1();
void registerCallback(ICallback cb);
void unregisterCallback(ICallback cb);
}
2.2 声明回调接口ICallback.aidl
// ICallback.aidl
package com.example.ee.aidl;
interface ICallback {
oneway void fun2();
}
2.3 实现服务,用 RemoteCallbackList 保存回调接口.
package com.example.ee.aidl;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.Process;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.support.annotation.Nullable;
import android.util.Log;
public class RemoteService extends Service {
final String TAG = "RemoteService";
private RemoteBinder binder = new RemoteBinder();
private RemoteCallbackList<ICallback> callbackList = new RemoteCallbackList<>();
@Nullable
@Override
public IBinder onBind(Intent intent) {
return binder;
}
class RemoteBinder extends IRemoteService.Stub{
void callback(){
int count = callbackList.beginBroadcast();
try {
; i < count; i++) {
callbackList.getBroadcastItem(i).fun2();
}
} catch (RemoteException e) {
Log.e(TAG, e.getMessage());
} finally {
}
callbackList.finishBroadcast();
}
@Override
public int getPid() throws RemoteException {
return Process.myPid();
}
@Override
public void fun1() throws RemoteException {
Log.d(TAG, "fun1 in remote service ");
callback();
}
@Override
public void registerCallback(ICallback cb) throws RemoteException {
callbackList.register(cb);
}
@Override
public void unregisterCallback(ICallback cb) throws RemoteException {
callbackList.unregister(cb);
}
}
}
2.4 发布服务
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.ee.aidl">
<application
android:allowBackup="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:name=".AidlApp"
android:theme="@style/AppTheme">
<!--<meta-data
android:name="APP_CHANNEL"
android:value="${APP_CHANNEL}" />
-->
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".RemoteService" android:process=".RemoteService" android:exported="true"/>
</application>
</manifest>
3.客户端
3.1 实现回调接口
private ICallback callback = new ICallback.Stub(){
@Override
public void fun2() throws RemoteException {
Log.d(TAG, "fun2 in client ");
}
};
3.2 绑定远程服务,注册回调
private void bindRemoteService(){
connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
remoteService = IRemoteService.Stub.asInterface(service);
try {
remoteService.registerCallback(callback);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
Intent intent = new Intent(this,RemoteService.class);
boolean ret = bindService(intent,connection, BIND_AUTO_CREATE);
if (!ret ){
Log.e(TAG, "bindRemoteService: bind failed.");
}
}
3.3 调用远程服务
public void onClick(View view){
if(view.getId() == R.id.btn_call_remote){
AidlApp app = (AidlApp) getApplication();
if (app.remoteService != null){
try {
int pid = app.remoteService.getPid();
Log.d(TAG, "onServiceConnected: remote pid = " + pid);
app.remoteService.fun1();
} catch (RemoteException e) {
e.printStackTrace();
}
}else {
Snackbar.make(view,"remote service unbinded",Snackbar.LENGTH_SHORT).show();
}
}
}
4. 远程服务调用回调
void callback(){
int count = callbackList.beginBroadcast();
try {
; i < count; i++) {
callbackList.getBroadcastItem(i).fun2();
}
} catch (RemoteException e) {
Log.e(TAG, e.getMessage());
} finally {
}
callbackList.finishBroadcast();
}
5.下载
https://gitee.com/xi/RemoteCallbackList.git
AIDL(2):服务端回调客户端的更多相关文章
- 解决有关flask-socketio中服务端和客户端回调函数callback参数的问题(全网最全)
由于工作当中需要用的flask_socketio,所以自己学习了一下如何使用,查阅了有关文档,当看到回调函数callback的时候,发现文档里都描述的不太清楚,最后终于琢磨出来了,分享给有需要的朋友 ...
- WCF心跳判断服务端及客户端是否掉线并实现重连接
WCF心跳判断服务端及客户端是否掉线并实现重连接 本篇文章将通过一个实例实现对WCF中针对服务端以及客户端是否掉线进行判断:若掉线时服务器或客户端又在线时将实现自动重连:将通过WCF的双工知识以及相应 ...
- Java的oauth2.0 服务端与客户端的实现
oauth原理简述 oauth本身不是技术,而是一项资源授权协议,重点是协议!Apache基金会提供了针对Java的oauth封装.我们做Java web项目想要实现oauth协议进行资源授权访问,直 ...
- oauth2.0服务端与客户端搭建
oauth2.0服务端与客户端搭建 - 推酷 今天搭建了oauth2.0服务端与客户端.把搭建的过程记录一下.具体实现的功能是:client.ruanwenwu.cn的用户能够通过 server.ru ...
- 使用WebSocket实现服务端和客户端的通信
开发中经常会有这样的使用场景.如某个用户在一个数据上做了xx操作, 与该数据相关的用户在线上的话,需要实时接收到一条信息. 这种可以使用WebSocket来实现. 另外,对于消息,可以定义一个类进行固 ...
- Java 断点下载(下载续传)服务端及客户端(Android)代码
原文: Java 断点下载(下载续传)服务端及客户端(Android)代码 - Stars-One的杂货小窝 最近在研究断点下载(下载续传)的功能,此功能需要服务端和客户端进行对接编写,本篇也是记录一 ...
- asp.net获取服务端和客户端信息
asp.net获取服务端和客户端信息 获取服务器名:Page.Server.ManchineName获取用户信息:Page.User 获取客户端电脑名:Page.Request.UserHostNam ...
- python thrift 服务端与客户端使用
一.简介 thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, ...
- IE8下服务端获取客户端文件的路径为C:/fakePath问题的解决方案
上一篇文章上提到,IE8下服务端获取客户端文件的路径时,会变成C:/fakePath问题,于是乎通过文件路径去获得文件大小就失败了. 上网搜了一下,主要原因是IE8因为安全考虑,在上传文件时屏蔽了真实 ...
随机推荐
- My First JS Page
哗啦啦~我的处女作终于浮出水面了^ ^值得高兴一下,虽然参考了人家的代码.给我的感觉JS就是用来实现动态网页的,比如说弹出一个框框,然后调用JS,返回些东西. 1.打开新写好的页面a.html,弹出了 ...
- linux新的API signalfd、timerfd、eventfd使用说明
原文:http://www.cfanz.cn/?c=article&a=read&id=46555注意很多当前(2013/8/6)线上运营的Linux内核可能不支持! 三种新的fd加入 ...
- Http Live Streaming 实现iphone在线播放视频[转]
http://hi.baidu.com/lphack/item/83865611c5f82c8988a956df 本人新手,难免会出错,请各位指点! 最近要做一个项目,是通过iphone来播放工厂摄像 ...
- (转)Web API 强势入门指南
原文地址:http://www.cnblogs.com/developersupport/p/aspnet-webapi.html Web API是一个比较宽泛的概念.这里我们提到Web API特指A ...
- tornado设置cookie过期时间(expires time)
具体的tornado设置过期时间的东西, 我也是查资料才发现的, 现在就贴代码吧 用户登录之后, 设置cookie, 我使用set_secure_cookie的, 它默认是有个30天的过期时间, 导致 ...
- Python数据聚合和分组运算(1)-GroupBy Mechanics
前言 Python的pandas包提供的数据聚合与分组运算功能很强大,也很灵活.<Python for Data Analysis>这本书第9章详细的介绍了这方面的用法,但是有些细节不常用 ...
- C#下Excel的普通处理和报表设计
一.准备:想要操作Excel,先要在添加2个COM引用: 1.Microsoft Excel 14.0 Object Library (版本不同14.0也可能是12.0等) 2.Microsoft O ...
- 在CentOS-6.3环境下,利用grub工具手工制作Linux U盘安装盘
注:此文是本人亲自操作实现后写的心得,同时也是对自己操作的记录. 制作的全过程概况 准备工作: U盘重新分区: 格式化U盘: 安装grub文件到U盘特定的分区: 拷贝镜像中的相关文件到U盘: 安装时设 ...
- scrapy 爬取天猫商品信息
spider # -*- coding: utf-8 -*- from urllib.parse import urlencode import requests import scrapy impo ...
- rsync入门
rsync是Linux/unix下一个用于远程文件(目录)同步的一个精巧的小工具程序,有很多文章讨论了其功能和实现原理,本文主要就不赘述了. 主要介绍下实践时使用的一些方法和细枝末节留作工作笔记以便日 ...