Wie starte ichForeground () ohne Benachrichtigung?

89

Ich möchte einen Dienst erstellen und ihn in den Vordergrund stellen.

Die meisten Beispielcodes enthalten Benachrichtigungen. Ich möchte aber keine Benachrichtigung anzeigen. Ist das möglich?

Können Sie mir einige Beispiele geben? Gibt es Alternativen?

Mein App-Service macht Mediaplayer. Wie man das System dazu bringt, meinen Dienst nicht zu beenden, außer dass die App ihn selbst beendet (wie das Anhalten oder Stoppen der Musik per Taste).

Muhammad Resna Rizki Pratama
quelle
11
Sie können keinen "Vordergrund" -Dienst ohne Benachrichtigung haben. Zeitraum.
Jug6ernaut
1
Wie wäre es mit einer "falschen" Benachrichtigung? das ist ein trick
Muhammad Resna Rizki Pratama
Sobald die Vordergrundbenachrichtigung eingerichtet ist, können Sie mithilfe der Rubber-App "Benachrichtigungen im Hintergrund ausführen" entfernen .
Laurent
1
@MuhammadResnaRizkiPratama, würden Sie in Betracht ziehen, die akzeptierte Antwort zu ändern? Diese Frage ist sehr beliebt, aber die akzeptierte Antwort ist völlig veraltet, zu hartnäckig und macht Annahmen, warum der Entwickler dies benötigt. Ich schlage diese Antwort vor, weil sie zuverlässig ist, keine Betriebssystemfehler ausnutzt und auf den meisten Android-Geräten funktioniert.
Sam

Antworten:

95

Als Sicherheitsmerkmal der Android - Plattform, Sie können nicht unter jedem Umstand, haben einen Vordergrund Dienst ohne eine Benachrichtigung mit. Dies liegt daran, dass ein Vordergrunddienst eine größere Menge an Ressourcen verbraucht und anderen Planungsbeschränkungen unterliegt (dh nicht so schnell beendet wird) als Hintergrunddienste, und der Benutzer muss wissen, was möglicherweise seine Batterie verbraucht. Also tu das nicht .

Es ist jedoch möglich, eine "gefälschte" Benachrichtigung zu erhalten, dh Sie können ein transparentes Benachrichtigungssymbol (iirc) erstellen. Dies ist für Ihre Benutzer äußerst unaufrichtig, und Sie haben keinen Grund, dies zu tun, außer den Akku zu leeren und damit Malware zu erstellen.

Kristopher Micinski
quelle
3
Vielen Dank. Das macht mir klar, warum setForeground die Benachrichtigung benötigt.
Muhammad Resna Rizki Pratama
21
Nun, es scheint, dass Sie einen Grund dafür haben, Benutzer haben danach gefragt. Obwohl es, wie Sie sagen, unaufrichtig sein mag, wurde es von den Testgruppen für ein Produkt angefordert, an dem ich arbeite. Möglicherweise sollte Android die Option haben, Benachrichtigungen vor einigen Diensten auszublenden, von denen Sie wissen, dass sie immer ausgeführt werden. Andernfalls sieht Ihre Benachrichtigungsleiste wie ein Weihnachtsbaum aus.
Radu
3
@Radu eigentlich sollten Sie nicht so viele Apps im Vordergrund haben: Das wird Ihre Akkulaufzeit verkürzen , weil sie anders geplant sind (im Wesentlichen sterben sie nicht). Dies mag für einen Mod akzeptabel sein, aber ich sehe nicht, dass diese Option es bald in Vanilla Android schafft. "Benutzer" wissen normalerweise nicht, was für sie am besten ist.
Kristopher Micinski
2
@ Radu, das Ihre Argumentation nicht unterstützt. "Preisgekrönte Apps" sind normalerweise solche, die die Lücken von Android durch Systeminkonsistenzen (wie Task-Killer) "reparieren". Es gibt keinen Grund, warum Sie einen Vordergrunddienst verwenden müssen, nur weil "preisgekrönte Apps" dies tun: Wenn Sie dies tun, geben Sie zu, dass der Akku des Benutzers leer ist.
Kristopher Micinski
2
Anscheinend funktioniert diese Methode ab 4.3 nicht mehr. plus.google.com/u/0/105051985738280261832/posts/MTinJWdNL8t
erbi
79

Update: Dies wurde unter Android 7.1 "behoben". https://code.google.com/p/android/issues/detail?id=213309

Seit dem 4.3-Update ist es grundsätzlich unmöglich , einen Dienst startForeground()ohne Benachrichtigung zu starten .

Sie können das Symbol jedoch mithilfe offizieller APIs ausblenden. Es ist kein transparentes Symbol erforderlich: ( NotificationCompatZur Unterstützung älterer Versionen)

NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setPriority(Notification.PRIORITY_MIN);

Ich habe mich damit abgefunden, dass die Benachrichtigung selbst noch vorhanden sein muss, aber für jeden, der sie noch verbergen möchte, habe ich möglicherweise auch eine Problemumgehung gefunden:

  1. Starten Sie einen gefälschten Dienst startForeground()mit der Benachrichtigung und allem.
  2. Starten Sie den eigentlichen Dienst, den Sie ausführen möchten, auch mit startForeground()(derselben Benachrichtigungs-ID)
  3. stopSelf()Beenden Sie den ersten (gefälschten) Dienst (Sie können anrufen und onDestroy anrufen stopForeground(true)).

Voilà! Überhaupt keine Benachrichtigung und Ihr zweiter Dienst läuft weiter.

Lior Iluz
quelle
23
Danke dafür. Ich denke, einige Leute wissen nicht, dass es eine Android-Entwicklung für den internen Geschäftsgebrauch gibt (das heißt, es ist nicht beabsichtigt, jemals auf dem Markt zu erscheinen oder an Joe Blow verkauft zu werden). Manchmal fragen die Leute nach Dingen wie "Keine Servicemeldung mehr anzeigen" und es ist gut, Workarounds zu sehen, auch wenn es für den allgemeinen Verbrauch nicht koscher ist.
JamieB
5
@JamieB Ich könnte nicht mehr zustimmen ... Ich schlug Dianne Hackborn vor, das gesamte Konzept der Hintergrunddienste zu überdenken und möglicherweise eine Berechtigung zum Ausführen eines Dienstes im Hintergrund ohne Benachrichtigungen hinzuzufügen. Es ist für uns Entwickler nicht wichtig, ob es eine Benachrichtigung gibt oder nicht - es ist die USER-Anfrage, diese zu entfernen! :) Kannst du übrigens überprüfen, ob es auch für dich funktioniert?
Lior Iluz
1
@JamieB user875707 sagt, dass der Symbolparameter (die Ressourcen-ID des Symbols) auf 0 gesetzt werden soll, nicht die ID der Benachrichtigung (Wenn ja, wie in den Dokumenten angegeben, funktioniert "startForeground" nicht).
Wangqi060934
9
Sie sollten natürlich davon ausgehen, dass dies in zukünftigen Versionen der Plattform nicht funktioniert.
Hackbod
1
@JamieB Ich habe das gerade auf Android 5.0.1 getestet und es funktioniert immer noch für mich.
Lior Iluz
20

Dies funktioniert ab Android 7.1 nicht mehr und verstößt möglicherweise gegen die Entwicklerrichtlinien von Google Play .

Lassen Sie den Benutzer stattdessen die Dienstbenachrichtigung blockieren .


Hier ist meine Implementierung der Technik in der Antwort von Lior Iluz .

Code

ForegroundService.java

public class ForegroundService extends Service {

    static ForegroundService instance;

    @Override
    public void onCreate() {
        super.onCreate();

        instance = this;

        if (startService(new Intent(this, ForegroundEnablingService.class)) == null)
            throw new RuntimeException("Couldn't find " + ForegroundEnablingService.class.getSimpleName());
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        instance = null;
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

}

ForegroundEnablingService.java

public class ForegroundEnablingService extends Service {

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (ForegroundService.instance == null)
            throw new RuntimeException(ForegroundService.class.getSimpleName() + " not running");

        //Set both services to foreground using the same notification id, resulting in just one notification
        startForeground(ForegroundService.instance);
        startForeground(this);

        //Cancel this service's notification, resulting in zero notifications
        stopForeground(true);

        //Stop this service so we don't waste RAM.
        //Must only be called *after* doing the work or the notification won't be hidden.
        stopSelf();

        return START_NOT_STICKY;
    }

    private static final int NOTIFICATION_ID = 10;

    private static void startForeground(Service service) {
        Notification notification = new Notification.Builder(service).getNotification();
        service.startForeground(NOTIFICATION_ID, notification);
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

}

AndroidManifest.xml

<service android:name=".ForegroundEnablingService" />
<service android:name=".ForegroundService" />

Kompatibilität

Getestet und bearbeitet an:

  • Offizieller Emulator
    • 4.0.2
    • 4.1.2
    • 4.2.2
    • 4.3.1
    • 4.4.2
    • 5.0.2
    • 5.1.1
    • 6.0
    • 7.0
  • Sony Xperia M.
    • 4.1.2
    • 4.3
  • Samsung Galaxy ?
    • 4.4.2
    • 5.X.
  • Genymotion
    • 5.0
    • 6.0
  • CyanogenMod
    • 5.1.1

Ab Android 7.1 funktioniert es nicht mehr.

Sam
quelle
2
Ich habe es noch nicht getestet, aber es wäre schön, zumindest eine Erlaubnis dafür zu haben !!! +1 für den Teil "An Google". Meine Benutzer beschweren sich über die Benachrichtigung, die erforderlich ist, um die App im Hintergrund laufen zu lassen. Ich beschwere mich auch über die Benachrichtigung, die für Skype / Lama und jede andere App da draußen erforderlich ist
Rami Dabain,
Entschuldigung, wie dieses Beispiel verwendet werden kann, um auf Alarme zu warten. Ich entwickle eine App, die mit alarmManager Alarme setzt, und das Problem, das ich habe, ist, dass beim Schließen der App (Letzte Apps-> Löschen) auch alle Alarme entfernt werden und ich nach einem Weg
suche
@ Ares91, versuchen Sie, eine separate StackOverflow-Frage dafür zu stellen, und stellen Sie sicher, dass Sie so viele Informationen wie möglich enthalten, einschließlich des entsprechenden Codes. Ich weiß nicht viel über Alarme, und diese Frage betrifft nur Dienstleistungen.
Sam
@ Sam, welcher Dienst zuerst aufgerufen werden soll, ForegroundEnablingService oder Forground
Android Man
@ AndroidManForegroundService
Sam
14

Sie können dies verwenden (wie von @Kristopher Micinski vorgeschlagen):

Notification note = new Notification( 0, null, System.currentTimeMillis() );
note.flags |= Notification.FLAG_NO_CLEAR;
startForeground( 42, note );

AKTUALISIEREN:

Bitte beachten Sie, dass dies mit Android KitKat + -Versionen nicht mehr zulässig ist. Und denken Sie daran, dass dies mehr oder weniger gegen das Designprinzip in Android verstößt, das Hintergrundvorgänge für Benutzer sichtbar macht, wie von @Kristopher Micinski erwähnt

Snicolas
quelle
2
Beachten Sie, dass dies mit SDK 17 nicht mehr akzeptiert zu werden scheint. Der Dienst wird nicht in den Vordergrund gestellt, wenn das an die Benachrichtigung übergebene
Zeichen
Es war ein Fehler und wurde hoffentlich behoben. Die Idee von Foreground-Diensten ist, dass sie weniger dazu neigen, getötet zu werden, und dies ist eine Möglichkeit, um sicherzustellen, dass der Benutzer sich seiner Existenz bewusst ist.
Martin Marconcini
4
Mit Android 18 ist die Benachrichtigung nicht mehr unsichtbar, sondern zeigt an, dass "App läuft, Touch für weitere Informationen oder um die App zu stoppen"
Emanuel Moecklin
1
Screenshot von einem meiner Kunden: 1gravity.com/k10/Screenshot_2013-07-25-12-35-49.jpg . Ich habe auch ein 4.3-Gerät und kann diesen Befund bestätigen.
Emanuel Moecklin
2
Warnung: Ich erhalte Absturzberichte von Sony Ericsson LT26i (Xperia S) mit Android 4.1.2 (SDK 16): android.app.RemoteServiceException: Fehlerhafte Benachrichtigung vom Paket gesendet ...: Symbol konnte nicht erstellt werden: StatusBarIcon (pkg = ... id = 0x7f020052 level = 0 sichtbar = wahr num = 0) Ich habe die Symbol-ID auch bis SDK 17 auf 0 gesetzt. Ab SDK 18 habe ich eine gültige Zeichenressource festgelegt. Möglicherweise benötigen Sie eine gültige Symbol-ID aus SDK 16!
Almisoft
13

Warnung : Obwohl diese Antwort zu funktionieren scheint, verhindert sie stillschweigend, dass Ihr Dienst zu einem Vordergrunddienst wird .

Ursprüngliche Antwort:


Setzen Sie einfach die ID Ihrer Benachrichtigung auf Null:

// field for notification ID
private static final int NOTIF_ID = 0;

    ...
    startForeground(NOTIF_ID, mBuilder.build());
    NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    mNotificationManager.cancel(NOTIF_ID);
    ...

Ein Vorteil, den Sie erhalten können, ist, dass a Servicemit hoher Priorität ausgeführt werden kann, ohne vom Android-System zerstört zu werden, es sei denn, es liegt ein hoher Speicherdruck vor.

BEARBEITEN

Stellen Sie sicher, dass Sie NotificationCompat.Builderanstelle von Pre-Honeycomb und Android 4.4 und höher das von Support Library v7 bereitgestellte verwenden Notification.Builder.

Anggrayudi H.
quelle
1
Dies funktioniert perfekt für mich auf 4.3 (18) @vlad sol. Warum noch keine Gegenstimmen für diese Antwort?
Rob McFeely
1
Ich habe dies in Android N Preview 4 versucht und es hat nicht funktioniert. Ich habe versucht Notification.Builder, Support Library v4 NotificationCompat.Builderund Support Library v7 NotificationCompat.Builder. Die Benachrichtigung wurde nicht in der Benachrichtigungsleiste oder in der Statusleiste angezeigt, aber der Dienst wurde nicht im Vordergrundmodus ausgeführt, als ich ihn mit getRunningServices()und überprüft habe dumpsys.
Sam
@ Sam, dieser Fehler tritt also in früheren Versionen nicht auf, richtig?
Anggrayudi H
@AnggrayudiH, mit "diesem Fehler" meinen Sie, dass die Benachrichtigung nicht angezeigt wird? Oder meinst du damit, dass der Dienst nicht in den Vordergrundmodus wechselt?
Sam
1
Das funktioniert bei mir nicht. Der Prozess wird als Vordergrund gestartet, wenn id! = 0 gesendet wird, aber NICHT als Vordergrund, wenn id = 0 gesendet wird. Verwenden Sie adb shell dumpsys activity serviceszur Überprüfung.
Beetree
10

Sie können Benachrichtigungen unter Android 9+ ausblenden, indem Sie ein benutzerdefiniertes Layout mit layout_height = "0dp" verwenden.

NotificationCompat.Builder builder = new NotificationCompat.Builder(context, NotificationUtils.CHANNEL_ID);
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.custom_notif);
builder.setContent(remoteViews);
builder.setPriority(NotificationCompat.PRIORITY_LOW);
builder.setVisibility(Notification.VISIBILITY_SECRET);

custom_notif.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="0dp">
</LinearLayout>

Getestet auf Pixel 1, Android 9. Diese Lösung funktioniert nicht auf Android 8 oder weniger

phnmnn
quelle
1
Schöne Problemumgehung. Ich denke auch, dass es ein Symbol auf Android 10 erfordert. Die Verwendung eines transparenten Platzhalterbildes für das Symbol löst das Problem.
Shyos
7

Update: Dies funktioniert nicht mehr in Android 4.3 und höher


Es gibt eine Problemumgehung. Versuchen Sie, eine Benachrichtigung zu erstellen, ohne das Symbol festzulegen, und die Benachrichtigung wird nicht angezeigt. Ich weiß nicht wie es funktioniert, aber es funktioniert :)

    Notification notification = new NotificationCompat.Builder(this)
            .setContentTitle("Title")
            .setTicker("Title")
            .setContentText("App running")
            //.setSmallIcon(R.drawable.picture)
            .build();
    startForeground(101,  notification);
Vladimir Petrovski
quelle
3
In Android N Preview 4 funktioniert dies nicht. Android zeigt eine (YourServiceName) is runningBenachrichtigung anstelle Ihrer eigenen an, wenn Sie kein Symbol angeben. Laut CommonsWare ist dies seit Android 4.3 der Fall: commonsware.com/blog/2013/07/30/…
Sam
1
Ich habe heute einige Tests durchgeführt und bestätigt, dass dies in Android 4.3 und höher nicht funktioniert.
Sam
5

Update: Dies funktioniert nicht mehr in Android 4.3 und höher


Ich habe den Parameter icon auf den Konstruktor für Notification auf Null gesetzt und dann die resultierende Benachrichtigung an startForeground () übergeben. Es werden keine Fehler im Protokoll und keine Benachrichtigung angezeigt. Ich weiß jedoch nicht, ob der Dienst erfolgreich in den Vordergrund gestellt wurde - gibt es eine Möglichkeit, dies zu überprüfen?

Bearbeitet: Mit dumpsys überprüft, und tatsächlich steht der Dienst auf meinem 2.3-System im Vordergrund. Ich habe noch keine Überprüfung mit anderen Betriebssystemversionen durchgeführt.

Alexander Pruss
quelle
9
Verwenden Sie den Befehl "adb shell dumpsys activity services", um zu überprüfen, ob "isForeground" auf "true" gesetzt ist.
schwarz
1
Oder rufen Sie einfach den leeren Notification()Konstruktor auf.
johsin18
Das hat bei mir funktioniert. Das erste Mal, dass mein Dienst über Nacht ausgeführt wird, steht er definitiv im Vordergrund (plus Dumpsysys sagt es) und keine Benachrichtigung.
JamieB
Beachten Sie, dass dies in Android 4.3 (API 18) nicht mehr funktioniert. Das Betriebssystem legt eine Platzhalterbenachrichtigung in der Benachrichtigungsschublade ab.
Sam
4

Blockieren Sie die Vordergrunddienstbenachrichtigung

Die meisten Antworten hier funktionieren entweder nicht, unterbrechen den Vordergrunddienst oder verstoßen gegen die Google Play-Richtlinien .

Die einzige Möglichkeit, die Benachrichtigung zuverlässig und sicher auszublenden, besteht darin, sie vom Benutzer blockieren zu lassen.

Android 4.1 - 7.1

Die einzige Möglichkeit besteht darin, alle Benachrichtigungen aus Ihrer App zu blockieren :

  1. Benutzer zum Detailbildschirm der App senden:

    Uri uri = Uri.fromParts("package", getPackageName(), null);
    Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).setData(uri);
    startActivity(intent);
    
  2. Lassen Sie die Benachrichtigungen der Benutzer-App blockieren

Beachten Sie, dass dies auch die Toasts Ihrer App blockiert.

Android 8.0 - 8.1

Es lohnt sich nicht, die Benachrichtigung unter Android O zu blockieren, da das Betriebssystem sie lediglich durch " Laufen im Hintergrund " oder " Verwenden des Akkus" ersetzt Benachrichtigung " ersetzt.

Android 9+

Verwenden Sie einen Benachrichtigungskanal , um die Dienstbenachrichtigung zu blockieren, ohne Ihre anderen Benachrichtigungen zu beeinflussen.

  1. Weisen Sie dem Benachrichtigungskanal eine Dienstbenachrichtigung zu
  2. Benutzer an die Einstellungen des Benachrichtigungskanals senden

    Intent intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS)
        .putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName())
        .putExtra(Settings.EXTRA_CHANNEL_ID, myNotificationChannel.getId());
    startActivity(intent);
    
  3. Lassen Sie die Benachrichtigungen des Benutzerkanals blockieren

Sam
quelle
2

Version 4.3 (18) und höher Das Ausblenden von Dienstbenachrichtigungen ist nicht möglich. Sie können jedoch das Symbol deaktivieren. Version 4.3 (18) und niedriger können die Benachrichtigung ausblenden

Notification noti = new Notification();
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN) {
    noti.priority = Notification.PRIORITY_MIN;
}
startForeground(R.string.app_name, noti);
vlad sol
quelle
Obwohl diese Antwort wahrscheinlich richtig und nützlich ist, wird es bevorzugt, wenn Sie eine Erklärung hinzufügen, um zu erklären, wie sie zur Lösung des Problems beiträgt. Dies ist besonders in Zukunft nützlich, wenn eine Änderung (möglicherweise ohne Bezug) dazu führt, dass sie nicht mehr funktioniert und die Benutzer verstehen müssen, wie sie einmal funktioniert hat.
Kevin Brown
Ich denke, Android 4.3 ist tatsächlich API 18. Außerdem verbirgt diese Methode nur das Symbol in der Statusleiste. Das Symbol ist in der Benachrichtigung noch vorhanden.
Sam
Um das Symbol in der Benachrichtigung auszublenden, können Sie ein leeres Bild hinzufügen. mBuilder.setSmallIcon (R.drawable.blank);
Vlad Sol
1
Ich schaue auf die Kitkat-Quelle und die Null-ID-Methode scheint nicht zu funktionieren. Wenn die ID Null ist, wird der Servicedatensatz auf NICHT Vordergrund aktualisiert.
Jeffrey Blattman
2

Ich habe unter Android 8.0 festgestellt, dass es immer noch möglich ist, keinen Benachrichtigungskanal zu verwenden.

public class BootCompletedIntentReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

                Intent notificationIntent = new Intent(context, BluetoothService.class);    
                context.startForegroundService(notificationIntent);

            } else {
                //...
            }

        }
    }
}

Und in BluetoothService.class:

 @Override
    public void onCreate(){    
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

            Intent notificationIntent = new Intent(this, BluetoothService.class);

            PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

            Notification notification = new Notification.Builder(this)
                    .setContentTitle("Title")
                    .setContentText("App is running")
                    .setSmallIcon(R.drawable.notif)
                    .setContentIntent(pendingIntent)
                    .setTicker("Title")
                    .setPriority(Notification.PRIORITY_DEFAULT)
                    .build();

            startForeground(15, notification);

        }

    }

Eine dauerhafte Benachrichtigung wird nicht angezeigt. Sie sehen jedoch, dass die Android-Benachrichtigungen "x Apps werden im Hintergrund ausgeführt".

Pete
quelle
1
In Android 8.1: "Ungültige Benachrichtigung für startForeground: java.lang.RuntimeException: Ungültiger Kanal für Dienstbenachrichtigung"
T-igra
Persönlich denke ich, dass die apps are running in the backgroundBenachrichtigung noch schlechter ist als eine app-spezifische Benachrichtigung, daher bin ich mir nicht sicher, ob sich dieser Ansatz lohnt.
Sam
-2

Update: Dies funktioniert nicht mehr in Android 7.1 und höher


Hier ist eine Möglichkeit, oom_adj Ihrer App auf 1 zu setzen (getestet im ANDROID 6.0 SDK-Emulator).Fügen Sie einen temporären Dienst hinzu. In Ihrem Hauptdienstanruf startForgroundService(NOTIFICATION_ID, notificion). Starten Sie dann den temporären Serviceabruf startForgroundService(NOTIFICATION_ID, notificion)mit derselben Benachrichtigungs-ID erneut, nach einer Weile im temporären Serviceaufruf stopForgroundService (true), um die fortlaufende Ontifizierung zu schließen.

Tshunglee
quelle
Dies ist die einzige funktionierende Lösung, die mir bekannt ist. Es wird jedoch bereits von einer anderen Antwort abgedeckt .
Sam
-3

Sie können Ihre Anwendung auch als dauerhaft deklarieren.

<application
    android:icon="@drawable/icon"
    android:label="@string/app_name"
    android:theme="@style/Theme"
    *android:persistent="true"* >
</application>

Dadurch wird Ihre App im Wesentlichen auf eine höhere Speicherpriorität eingestellt, wodurch die Wahrscheinlichkeit verringert wird, dass sie getötet wird.

Bewohner
quelle
5
Dies ist falsch, nur System-Apps können dauerhaft sein: groups.google.com/forum/?fromgroups=#!topic/android-developers/…
Snicolas
-6

Ich habe vor ein paar Monaten einen einfachen Media Player entwickelt. Ich glaube also, wenn Sie so etwas tun:

Intent i = new Intent(this, someServiceclass.class);

startService (i);

Dann sollte das System Ihren Dienst nicht beenden können.

Referenz : Lesen Sie den Abschnitt, in dem erläutert wird, wann das System den Dienst beendet

redM0nk
quelle
Ich habe in einigen Artikeln gelesen. Wenn Sie nur startService () ausführen, benötigt das System mehr Speicher. Das System wird diesen Dienst also beenden. das ist wahr? Ich habe einfach keine Zeit, im Dienst zu experimentieren.
Muhammad Resna Rizki Pratama
1
Muhammad, das ist wahr - der Zweck von startForeground () ist es, dem Dienst effektiv eine höhere "Speicherpriorität" als Hintergrunddienste zu geben, damit er länger überleben kann. StartForeground () sollte eine Benachrichtigung verwenden, damit der Benutzer besser über einen dauerhafteren / schwerer zu tötenden Dienst informiert ist, der ausgeführt wird.
DustinB
Das ist einfach nicht wahr; Es ist praktisch unmöglich, einen Dienst zu erstellen, der unter Android nicht beendet werden kann. Android beendet Dienste ohne Vordergrund, um Speicherplatz freizugeben.
Sam