2014-06-10 13 views
10

Ich mache einen Dienst auf Android, wo es auf einem Telefon/Tablet installiert wird. Viele Menschen können dieses Tablet verwenden, aber nur ausgewählte sollten das Recht haben, den Dienst zu schließen. Wie kann ich das erreichen? Ich googeln & einige Optionen gefunden:Verhindern, dass einige Benutzer den Android-Dienst schließen

  • Benutzerkonten zu machen: Es gibt viele Anwendungen für diese, aber sie nicht angeben, ob Service in einem Konto ausgeführt wird auch für andere Konten ausgeführt werden.
  • Aufforderung zur Eingabe des Kennworts vor dem Schließen des Dienstes: Es gibt viele Stackoverflow Q.for das sieht aber unmöglich aus.
  • Starten Sie den Dienst neu, wenn der Benutzer ihn schließt: Der Neustart kann zu Datenverlusten führen, da mein Dienst ständig mit anderen Geräten kommuniziert, um Daten zu sammeln.

NEW OPTION:

Ich habe eine andere Idee, damit es funktioniert: Ich bin wird es System-App machen, so dass es Benutzer zu warnen, wenn er versucht, ihn zu stoppen. Wenn der Benutzer bei System-Apps die Schaltfläche "Stopp" aus den Einstellungen drückt, wird eine Warnmeldung angezeigt: "Das Schließen dieser App kann zu .. (blah blah) ...." führen. Weißt du, welche Absicht ausgelöst wird, um diese Nachricht zu öffnen? Ich denke, ich kann diese Absicht hier verwenden und die "OK" -Option in dieser Nachricht deaktivieren

I want to disable this "OK".

+0

Nur neugierig, aber warum würde sich der Arbeiter in der Fabrik gezwungen fühlen, den Dienst zu stoppen? (Es scheint, als ob du diese Zeile oben bearbeitet hast). Das ist nicht der einfachste Weg, um sogar zum "apps" Einstellungsbildschirm zu gelangen, um den laufenden Prozess zu finden, um ihn zu stoppen. – selbie

+0

Seit Android wird berühmt Tag für Tag kann Arbeiter wissen, wie dies zu tun ist. Auch aus Sicherheitsgründen möchte ich diese Funktion. –

+0

Dies ist eine Frage für jeden, der die Firmware für Ihr Gerät anpasst. Wenn Sie versuchen, Standard-Hardware für diesen Anwendungsfall mit dem Lager-ROM zu verwenden, ist das ein ziemlich wesentlicher Fehler IMHO. Ganz zu schweigen davon, dass ein immerwährender Service überhaupt ein Anti-Pattern ist. – CommonsWare

Antwort

6

Auch wenn der Benutzer den Dienst nicht stoppen konnte, konnte das Telefon immer noch ausgeschaltet werden, die Batterie leer war oder die Netzwerkverbindung verloren ging. Es ist sogar vorstellbar, dass Android den Serviceprozess beenden könnte, wenn die Ressourcen knapp werden. Daher sollte der Code darauf vorbereitet sein, den potenziellen Datenverlust in diesen Ereignissen zu bewältigen.

Ich bin nicht sicher, wie Sie erkennen, wenn der Dienst gestoppt wurde, aber es gibt immer AlarmManager für periodische Abfragen.

+0

Andere Gründe wie Ausschalten und Netzwerkfehler sind in Fabriken selten. Um mit wenig Speicher umzugehen, gebe ich mehr als genug Hardware-Fähigkeiten. Für die Abschalt-Situation wird eine Nachricht an den Manager gesendet (der Zugriff auf den Dienst hat). Danke, dass Sie auf wichtige Punkte hingewiesen haben. :) –

5

Es ist fast unmöglich, das Schließen eines Dienstes zu verhindern. Sie können jedoch dafür sorgen, dass Ihr Dienst neu startet, sobald er geschlossen wurde.

Verwenden Sie startForeground. Wie in der Dokumentation angegeben:

A gestarteten Dienst kann die startForeground (int, Notification) API verwenden, den Dienst in einem Vordergrund Zustand zu versetzen, in dem das System ist aktiv bewusst etwas der Benutzer hält von und somit kein Kandidat für das Töten bei wenig Gedächtnis. (Es ist noch theoretisch möglich, dass der Dienst unter extremem Speicherdruck von der aktuellen Vordergrundanwendung, getötet zu werden, aber in der Praxis sollte dies kein Problem sein.)

Return START_STICKY von Ihrem onStartCommand Ihren Dienst neu zu starten, sobald wenn ein Benutzer Ihren Service schließt. In den meisten Fällen wird Ihr Dienst in < 5s neu gestartet, dies hängt jedoch davon ab, wie oft Ihr Dienst nacheinander beendet wird.

Diese beiden Methoden machen Ihren Service nahezu unkalkulierbar.

+1

Ich habe es jetzt Vordergrund und STICKY gemacht. Wie ich bereits in meinem Q erwähnt habe, ist das Neustarten möglicherweise keine sehr gute Idee, da es einige Sekunden dauern wird. In diesen Sekunden kann ich Daten verlieren. Nachdem ich lange gesucht habe, stimme ich zu: "Das Schließen eines Dienstes zu verhindern, ist nahezu unmöglich." –

+0

Dies funktioniert nicht, wenn der Benutzer die App anhält. In diesem Fall wird Ihr Dienst erst gestartet, wenn der Nutzer erneut mit der App interagiert. – Blaz

2

Sind Sie zum Deaktivieren von Einstellungen berechtigt?

Wenn dies der Fall ist, könnten Sie die laufenden Threads überwachen und diejenigen beenden, die zu den Einstellungen gehören (nach Paketname) oder einfach das System zum Launcher zurückkehren lassen. Der Benutzer wird nie einen Kontext erreichen Prozesse schließen.

Diese Lösung streut nicht die Korrektheit (Google empfiehlt, dies nicht zu tun), aber es wird verhindern, dass der Benutzer die Option überhaupt sieht, und für eine lokale App (nicht für den gesamten Markt) akzeptabel.

Wie auch immer, wenn Sie einige Datenverluste verarbeiten können (nur für ein paar Sekunden), würde ich sagen, dass Sie die Antwort RETURN_STICKY verwenden.

+0

Das war ein guter Vorschlag. Ich habe eine andere Idee, damit es funktioniert: Ich mache es System-App, so dass es Benutzer warnt, wenn er versucht, es zu stoppen. Wenn der Benutzer bei System-Apps die Schaltfläche "Stopp" aus den Einstellungen drückt, wird eine Warnmeldung angezeigt: "Das Schließen dieser App kann zu .. (blah blah) ...." führen. Weißt du, welche Absicht ausgelöst wird, um diese Nachricht zu öffnen? Ich denke, dass ich diese Absicht hier verwenden und die "OK" -Option in dieser App deaktivieren kann. –

Verwandte Themen