我对意图感到有些困惑。
为什么
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);
似乎与此相矛盾,但仍被视为显性意图。
更新 - 示例实施
@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);
}
}
}
答案 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
真正成为明确的意图。