2015-09-07 18 views
5

sein, wenn wir einen Dienst wie folgt beginnen:Warum braucht Service-Intent Explicit Intent

Intent in = new Intent(); 
in.setAction("com.android.myAction"); 
startService(in); 

Es gibt einen Fehler: Service-Intent muss explizit.

Warum ist das so? Warum benötigt Android eine explizite Serviceabsicht?

+1

Sicherheit ... Wenn es mehrere Aktivitäten gibt, die für dieselbe Absicht reagieren, wird der Benutzer gebeten, eine auszuwählen ... jetzt stell dir vor, wie es für Dienste funktionieren könnte (ich kann nicht) ... deshalb musst du Punkt genaue Komponentenname – Selvin

+0

http://developer.android.com/guide/components/intents-filters.html – Sree

+1

@selvin es funktionierte für pre v5 (ich glaube) Versionen so könnte es funktionieren ... – pskink

Antwort

1

Wenn Sie im Gegensatz zu Activity einen Dienst mit impliziter Absicht starten, ist keine Benutzerschnittstelle beteiligt. Wenn mehrere Dienste eine Absicht verarbeiten können, wählt Android eine zufällig aus; Der Benutzer wird nicht aufgefordert, einen Dienst auszuwählen.

Falls der böswillige Dienst an der rufenden Anwendung gebunden ist, dann kann der Angreifer beliebigen Schad zurückkehren Daten oder einfach ein erfolgreiches Ergebnis zurückzukehren, ohne die Forderung nach. Der bösartige Dienst kann Daten stehlen und darüber lügen, dass die angeforderten Aktionen abgeschlossen wurden.

0

"Um sicherzustellen, dass Ihre App sicher ist, verwenden Sie immer eine explizite Absicht beim Starten oder Binden Ihres Dienstes und geben Sie keine Intent-Filter für den Dienst an." (From Android developer) Es muss sein, ohne dass andere Apps Ihren starten können Service und etc.

0

Ein wenig mehr dazu: Wenn wir Implizite Intent verwenden möchten (mit Aktionsname), haben wir setPackageName wie folgt zu verwenden:

Intent intent = new Intent(); 
intent.setPackage("com.action.ServicePackageName"); 
intent.setAction("com.action.ActionNameOfService"); 
bindService(intent, yourServiceConectionObject, Service.BIND_AUTO_CREATE); 
//or 
//startService(intent); 

Point jedoch zu beachten ist, dass, wenn Service lokalen Service ist ; Sie sollten die explizite Absicht verwenden, da die Serviceklasse für Sie verfügbar ist. Wir können auch auf die oben beschriebene Weise verwenden, aber die Verwendung von Explicit wird aus den gleichen Gründen empfohlen, die in einigen Antworten erwähnt werden. Für Remote-Dienste (Dienste in anderen Apps); Da wir keine Serviceklasse für uns haben können; Wir müssen nur auf diese Weise an den Dienst binden.

Verwandte Themen