Ich bin ein wenig verwirrt auf Intents.Explizite und implizite Absichten
Warum ist
Intent implicit=new Intent(IDownload.class.getName());
eine Implizite Absicht
während
Intent explicit=new Intent(implicit);
ist ein Explicit Absicht während es nichts Neues in seiner Definition hinzuzufügen scheint. Das System scheint keine neuen Informationen zu zeichnen, die zuvor nicht von implicit
intention oben zur Verfügung gestellt wurden?
Im Android documentation (Intent types),
Explicit Absichten geben Sie die Komponente mit Namen (die vollständig qualifizierten Klassennamen) zu starten. Sie werden in der Regel eine explizite Absicht verwenden, um eine Komponente in Ihrer eigenen App zu starten, weil Sie die Klassennamen der Aktivität oder Service wissen Sie starten wollen ......
Intent implicit=new Intent(IDownload.class.getName());
scheinen diese Anforderung zu erfüllen , ist aber nach wie vor als eine implizite Absicht angesehen, die gemäß der Dokumentation:
Implizite Absichten keine bestimmte Komponente nennen, sondern eine allgemeine Aktion erklären auszuführen, die eine Komponente aus einer anderen Anwendung, um sie zu handhaben erlaubt .....
Intent explicit=new Intent(implicit);
scheint dem zu widersprechen, wird aber immer noch als Explicit Intent betrachtet.
UPDATE - Beispielimplementierung
ref: 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);
}
}
}
Was lässt Sie sagen, dass "Absicht explizit = neue Absicht (implizit)" ist eine explizite Absicht? –
https://stackoverflow.com/a/37907805/3663765 @BenP. –
In diesem Beispiel ist der Intent immer noch eine implizite Absicht, bis er 'explicit.setComponent (cn)' aufruft.Es ist die Einstellung des Komponentennamens, die die Absicht explizit macht; Er benennt nur die Variable "explizit", weil _in ein paar Zeilen_ wird es sein. –