2017-07-29 3 views
1

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); 
    } 
    } 
} 
+0

Was lässt Sie sagen, dass "Absicht explizit = neue Absicht (implizit)" ist eine explizite Absicht? –

+0

https://stackoverflow.com/a/37907805/3663765 @BenP. –

+0

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. –

Antwort

1

Die verlinkte Beispiel enthält diese Zeilen

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

     explicit.setComponent(cn); 

Die erste Zeile erzeugt einfach eine neue Intent Instanz, die eine Kopie ist von das Alte. Während die Variable zu diesem Zeitpunkt explicit sein könnte, handelt es sich immer noch um eine implizite Absicht.

Die zweite Zeile erstellt ein ComponentName Objekt basierend auf dem einzelnen übereinstimmenden Ergebnis von einem früheren getActivity().getPackageManager().queryIntentServices(implicit, 0) Aufruf. Zu diesem Zeitpunkt ist explicit immer noch eine implizite Absicht.

Die dritte Zeile ist die Magie. Sobald die spezifische ComponentName der Intent Instanz zugewiesen ist, wird explicit wirklich eine explizite Absicht.

+0

'IDownload.class.getName()' qualifiziert nicht als vollqualifizierter Klassenname - [Android-Dokumentation (Intent-Typen)] (https://developer.android.com/guide/components/intents-filters. html # Typen)? –

+1

'Class.getName()' gibt einen 'String' zurück, was bedeutet, dass Sie den Konstruktor' Intent (String) 'verwenden. In diesem Fall ist die Zeichenfolge die "Aktion", die ** nicht ** ein "vollständig qualifizierter Klassenname" ist. Sie müssten die Konstruktoren Intent (Kontext, Klasse) oder Intent (String, Uri, Kontext, Klasse) verwenden. –

Verwandte Themen