Java 在安卓系统中,有没有办法检查某项服务是否存在?

Java 在安卓系统中,有没有办法检查某项服务是否存在?,java,android,exception,service,Java,Android,Exception,Service,调用startActivity时,可以尝试捕获ActivityNotFoundException以了解该活动是否存在 但是,调用startService时,不存在ServiceNotFoundException。如何检测服务是否存在 我为什么要这样做 正如我所了解到的,对startService的调用将异步处理,因此我想知道我是否应该期待服务的响应(例如回调或广播) 到目前为止我做了什么 我搜索了一下,找到了一个相关的问题。似乎在内部引发了一个ClassNotFoundException 是否可

调用
startActivity
时,可以尝试捕获
ActivityNotFoundException
以了解该活动是否存在

但是,调用
startService
时,不存在
ServiceNotFoundException
。如何检测服务是否存在

我为什么要这样做

正如我所了解到的,对
startService
的调用将异步处理,因此我想知道我是否应该期待服务的响应(例如回调或广播)

到目前为止我做了什么

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


是否可能在某个地方捕获此异常?
Class.forName()
方法似乎不正确。。。或者是吗?

如果是您自己的服务,您知道您的服务是否存在。只有当您尝试使用某些第三方服务时,此问题才会出现。在这种情况下,请使用
PackageManager
querytentservices()
查看是否有符合您的
意图的内容

例如,在这个示例应用程序中,我使用
queryIntentServices()
来:

  • 确认我的
    意图只有一个匹配项

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

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

通常,这是在将绑定到服务的客户端片段的
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);
      }
    }
  }
@覆盖
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setRetainInstance(真);
appContext=(应用程序)getActivity().getApplicationContext();
Intent implicit=newintent(IDownload.class.getName());
列表匹配项=getActivity().getPackageManager()
.QueryInputServices(隐式,0);
如果(匹配.size()==0){
Toast.makeText(getActivity(),“找不到匹配的服务!”,
Toast.LENGTH_LONG).show();
}
else if(匹配.size()>1){
Toast.makeText(getActivity(),“找到多个匹配的服务!”,
Toast.LENGTH_LONG).show();
}
否则{
ServiceInfo svcInfo=matches.get(0).ServiceInfo;
试一试{
字符串otherHash=SignatureUtils.getSignatureHash(getActivity(),
svcInfo.applicationInfo.packageName);
String expected=getActivity().getString(R.String.expected\u sig\u hash);
if(应为.equals(其他哈希)){
意向明确=新意向(隐含);
ComponentName cn=新组件名(svcInfo.applicationInfo.packageName,
svcInfo.name);
explicit.setComponent(cn);
bindService(显式、this、Context.BIND\u自动创建);
}
否则{
Toast.makeText(getActivity(),“发现意外签名!”,
Toast.LENGTH_LONG).show();
}
}
捕获(例外e){
Log.e(getClass().getSimpleName(),“尝试获取签名哈希的异常”,e);
}
}
}

这正是我想要的。我稍后会测试它。