gpt4 book ai didi

java - 在Android中,有没有办法检查某个服务是否存在?

转载 作者:行者123 更新时间:2023-11-29 04:44:17 25 4
gpt4 key购买 nike

当调用 startActivity 时,可以 try catch ActivityNotFoundException 以了解 Activity 是否存在。

但是,当调用 startService 时,没有 ServiceNotFoundException。如何检测服务是否存在?

我为什么要这样做

据我所知,对 startService 的调用将被异步处理,因此我想知道我是否应该期待来自服务的响应(例如回调或广播) .

到目前为止我做了什么

我搜索了一下,找到了一个相关的问题here .似乎在内部引发了一个 ClassNotFoundException

是否有可能在某处捕获此异常? Class.forName() 方法似乎不对……是吗?

最佳答案

如果是你自己的服务,你知道你的服务是否存在。只有在您尝试使用某些第三方服务时才会出现此问题。在这种情况下,使用 PackageManagerqueryIntentServices() 查看是否有与您的 Intent 匹配的内容。

例如,在此示例应用中,我使用 queryIntentServices() 来:

  • 确认只有一个匹配项符合我的Intent

  • 将其从隐式 Intent 转换为显式 Intent

  • 验证服务的签名 key ,这样我就知道它不是伪装成我想要使用的服务(例如,使用恶意软件重新打包的应用程序)

大多数情况下,这是在将绑定(bind)到服务的客户端 fragment 的 onCreate() 中处理的:

  @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setRetainInstance(true);

appContext=(Application)getActivity().getApplicationContext();

Intent implicit=new Intent(IDownload.class.getName());
List<ResolveInfo> matches=getActivity().getPackageManager()
.queryIntentServices(implicit, 0);

if (matches.size() == 0) {
Toast.makeText(getActivity(), "Cannot find a matching service!",
Toast.LENGTH_LONG).show();
}
else if (matches.size() > 1) {
Toast.makeText(getActivity(), "Found multiple matching services!",
Toast.LENGTH_LONG).show();
}
else {
ServiceInfo svcInfo=matches.get(0).serviceInfo;

try {
String otherHash=SignatureUtils.getSignatureHash(getActivity(),
svcInfo.applicationInfo.packageName);
String expected=getActivity().getString(R.string.expected_sig_hash);

if (expected.equals(otherHash)) {
Intent explicit=new Intent(implicit);
ComponentName cn=new ComponentName(svcInfo.applicationInfo.packageName,
svcInfo.name);

explicit.setComponent(cn);
appContext.bindService(explicit, this, Context.BIND_AUTO_CREATE);
}
else {
Toast.makeText(getActivity(), "Unexpected signature found!",
Toast.LENGTH_LONG).show();
}
}
catch (Exception e) {
Log.e(getClass().getSimpleName(), "Exception trying to get signature hash", e);
}
}
}

关于java - 在Android中,有没有办法检查某个服务是否存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37907746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com