android java ibinder_Java IBinder.isBinderAlive方法代码示例

本文介绍了一种在Android环境中获取已注册服务的IBinder对象的方法。该方法首先尝试从本地缓存中查找请求的服务,如果未找到,则通过远程服务通道获取,并进行必要的包装和缓存更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import android.os.IBinder; //导入方法依赖的package包/类

/**

* 获取已注册服务的IBinder对象,前提是该服务是静态服务,即默认一直存在,或者自己已经启动并且向我们注册过;

* 注意不能通过此借口获取一个插件的服务,除非明确知道该插件的服务已经主动注册过,否则使用getPluginService()

*

* @param context

* @param serviceName 请求获取的service名称

* @return 所请求的service实现对象

*/

public static IBinder getService(Context context, String serviceName) {

if (DEBUG) {

Log.d(TAG, "[getService] begin = " + SystemClock.elapsedRealtime());

}

IBinder service = null;

/**

* 先考虑本地缓存

*/

SoftReference ref = sCache.get(serviceName);

if (ref != null) {

service = ref.get();

if (service != null) {

if (service.isBinderAlive() && service.pingBinder()) {

if (DEBUG) {

Log.d(TAG, "[getService] Found service from cache: " + serviceName);

Log.d(TAG, "[getService] end = " + SystemClock.elapsedRealtime());

}

return service;

} else {

sCache.remove(serviceName);

}

}

}

IServiceChannel serviceChannel = getServerChannel(context);

if (serviceChannel == null) {

return null;

}

try {

service = serviceChannel.getService(serviceName);

if (service != null) {

if (DEBUG) {

Log.d(TAG, "[getService] Found service from remote service channel: " + serviceName);

}

service = ServiceWrapper.factory(context, serviceName, service);

sCache.put(serviceName, new SoftReference(service));

}

} catch (RemoteException e) {

if (DEBUG) {

Log.e(TAG, "[getService] Error when getting service from service channel...", e);

}

}

if (DEBUG) {

Log.d(TAG, "[getService] end = " + SystemClock.elapsedRealtime());

}

return service;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值