显式和隐含意图

时间:2017-07-29 04:14:15

标签: java android android-intent

我对意图感到有些困惑。

为什么

Intent implicit=new Intent(IDownload.class.getName());  

隐含意图

Intent explicit=new Intent(implicit);  

显式意图,但它似乎没有在其定义中添加任何新内容。系统似乎没有提取以前由implicit意图提供的任何新信息?

Android documentation (Intent types)

  

显式意图指定按名称开头的组件(完全限定的类名)。您通常会使用明确的意图在您自己的应用中启动组件,因为您知道要启动的活动或服务的类名......

Intent implicit=new Intent(IDownload.class.getName());似乎满足了此要求,但仍然被视为隐含意图,根据文档:

  

隐式意图不会命名特定组件,而是声明要执行的常规操作,这允许来自其他应用程序的组件处理它......

Intent explicit=new Intent(implicit);似乎与此相矛盾,但仍被视为显性意图。

更新 - 示例实施

参考:Binding to a Service

@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);
    }
  }
}

1 个答案:

答案 0 :(得分:2)

链接的示例包括这些行

      Intent explicit=new Intent(implicit);
      ComponentName cn=new ComponentName(svcInfo.applicationInfo.packageName,
        svcInfo.name);

      explicit.setComponent(cn);

第一行只是创建一个新的Intent实例,它是旧实例的副本。虽然变量可能是explicit,但在这个时间点,它仍然是一个隐含的意图。

第二行根据早期ComponentName调用的单个匹配结果创建一个getActivity().getPackageManager().queryIntentServices(implicit, 0)对象。此时,explicit仍然是一个隐含的意图。

第三行是神奇的。将特定ComponentName分配给Intent实例后,explicit真正成为明确的意图。