2016-06-19 11 views
1

Beim Aufruf startActivity kann man versuchen, eine ActivityNotFoundException zu fangen, um zu wissen, ob die Aktivität existiert.Gibt es in Android eine Möglichkeit zu überprüfen, ob ein bestimmter Dienst existiert?

Beim Aufruf von startService gibt es jedoch keine ServiceNotFoundException. Wie kann ich erkennen, ob der Service existiert?

Warum muss ich diese

tun möchte, wie ich gelernt habe, wird ein Aufruf an startService asynchron verarbeitet werden, daher würde Ich mag wissen, ob ich eine Antwort erwarten sollte (zB einen Rückruf oder eine Broadcast) vom Dienst oder nicht.

Was habe ich bisher getan

suchte ich ein bisschen und finden eine ähnliche Frage here. Es scheint, dass intern ein ClassNotFoundException ausgelöst wird.

Ist es möglich, diese Ausnahme irgendwo zu fangen? Die Class.forName() Methode scheint nicht richtig ... oder ist es?

Antwort

3

Wenn es sich um einen eigenen Dienst handelt, wissen Sie, ob Ihr Dienst existiert. Dieses Problem tritt nur dann auf, wenn Sie versuchen, mit einem Drittanbieterdienst zu arbeiten. In diesem Fall verwenden Sie PackageManager und queryIntentServices(), um zu sehen, ob es etwas gibt, das Ihrem Intent entspricht.

Zum Beispiel in dieser Beispielanwendung, verwende ich queryIntentServices() zu:

  • bestätigen, dass es für mein Intent

  • es nur ein Spiel ist Konvertieren von einer impliziten Intent zu einem expliziten Intent

  • Überprüfen Sie den Signaturschlüssel des Dienstes, damit ich weiß, dass es sich nicht um einen Dienst handelt, der sich als der Dienst tarnt, den ich bearbeiten möchte mit (zum Beispiel neu verpackt, App mit Malware)

Meistens dass in onCreate() des Client-Fragmente behandelt wird, die an den Dienst binden:

@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

Das sieht genau das, was ich will. Ich werde es später testen. – WhatsUp