Android-Dienst muss immer ausgeführt werden (niemals pausieren oder anhalten)

Ich habe einen Dienst erstellt und möchte diesen Dienst immer ausführen, bis mein Telefon neu gestartet oder geschlossen wird. Der Dienst sollte im Hintergrund ausgeführt werden.

Beispielcode für erstellte Service- und Startdienste:

Starten Sie den Dienst:

Intent service = new Intent(getApplicationContext(), MyService.class); getApplicationContext().startService(service); 

Der Service:

 public class MyService extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId) { // TODO do something useful HFLAG = true; //smsHandler.sendEmptyMessageDelayed(DISPLAY_DATA, 1000); return Service.START_NOT_STICKY; } @Override public IBinder onBind(Intent intent) { // TODO for communication return IBinder implementation return null; } } 

Manifestdeklaration:

   

Ist es möglich, diesen Dienst immer so auszuführen, wie wenn die Anwendung pausiert oder sonstwie. Nach einiger Zeit geht meine Anwendung pausieren und die Dienste gehen auch pausieren oder stoppen. Wie kann ich diesen Dienst im Hintergrund und immer ausführen?

Solutions Collecting From Web of "Android-Dienst muss immer ausgeführt werden (niemals pausieren oder anhalten)"

“Ist es möglich, diesen Dienst immer so auszuführen, wie wenn die Anwendung pausiert und sonst noch?”

Ja.

  1. Geben Sie im Service onStartCommand-Methode START_STICKY zurück.

     public int onStartCommand(Intent intent, int flags, int startId) { return START_STICKY; } 
  2. Starten Sie den Dienst im Hintergrund mit startService (MyService), so dass er unabhängig von der Anzahl der gebundenen Clients immer aktiv bleibt.

     Intent intent = new Intent(this, PowerMeterService.class); startService(intent); 
  3. Erstellen Sie den Ordner.

     public class MyBinder extends Binder { public MyService getService() { return MyService.this; } } 
  4. Definieren Sie eine Dienstverbindung.

     private ServiceConnection m_serviceConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { m_service = ((MyService.MyBinder)service).getService(); } public void onServiceDisconnected(ComponentName className) { m_service = null; } }; 
  5. Binden an den Dienst mithilfe von bindService.

      Intent intent = new Intent(this, MyService.class); bindService(intent, m_serviceConnection, BIND_AUTO_CREATE); 
  6. Für Ihren Service möchten Sie möglicherweise eine Benachrichtigung erhalten, um die entsprechende Aktivität zu starten, sobald sie geschlossen wurde.

     private void addNotification() { // create the notification Notification.Builder m_notificationBuilder = new Notification.Builder(this) .setContentTitle(getText(R.string.service_name)) .setContentText(getResources().getText(R.string.service_status_monitor)) .setSmallIcon(R.drawable.notification_small_icon); // create the pending intent and add to the notification Intent intent = new Intent(this, MyService.class); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0); m_notificationBuilder.setContentIntent(pendingIntent); // send the notification m_notificationManager.notify(NOTIFICATION_ID, m_notificationBuilder.build()); } 
  7. Sie müssen das Manifest ändern, um die Aktivität im Single-Top-Modus zu starten.

      android:launchMode="singleTop" 
  8. Beachten Sie, dass wenn das System die Ressourcen benötigt und Ihr Dienst nicht sehr aktiv ist, er möglicherweise beendet wird. Wenn dies nicht akzeptabel ist, bringen Sie den Dienst mithilfe von startForeground in den Vordergrund.

      startForeground(NOTIFICATION_ID, m_notificationBuilder.build()); 

Um einen Service in einem eigenen process zu starten, müssen Sie Folgendes in der XML-Deklaration angeben.

   

Hier finden Sie ein gutes Tutorial, das mir sehr nützlich war

http://www.vogella.com/articles/AndroidServices/article.html

Hoffe das hilft

Eine einfache Lösung besteht darin, den Dienst neu zu starten, wenn das System ihn beendet.

Ich fand diese sehr einfache Implementierung dieser Methode:

Wie man den Android Service unaufhaltbar macht

Sie können startForeground für den Dienst implementieren, und selbst wenn er START_STICKY können Sie ihn erneut starten, indem Sie START_STICKY für startCommand() . Nicht sicher, obwohl dies die richtige Umsetzung ist.

Wenn Sie bereits einen Dienst haben und ständig arbeiten möchten, müssen Sie zwei Dinge hinzufügen:

  1. im Dienst selbst:

     public int onStartCommand(Intent intent, int flags, int startId) { return START_STICKY; } 
  2. Im Manifest:

     android:launchMode="singleTop" 

Sie müssen keine Bindung hinzufügen, wenn Sie sie nicht im Service benötigen.

Ich habe dieses Problem überwunden, und mein Beispielcode ist wie folgt.

Fügen Sie die folgende Zeile in Ihrer Hauptaktivität hinzu: BackGroundClass ist hier die Serviceklasse. Sie können diese class in Neu erstellen -> JavaClass ( Fügen Sie in dieser class den process (Aufgaben) hinzu, in dem Sie im Hintergrund auftreten müssen). Als Annehmlichkeit bezeichnen Sie sie zuerst mit einem Benachrichtigungsrufton als Hintergrundprozess.

  startService(new Intent(this, BackGroundClass .class)); 

Geben Sie in der BackGroundClass nur meine Kodierungen ein und Sie werden das Ergebnis sehen.

 import android.app.Service; import android.content.Intent; import android.media.MediaPlayer; import android.os.IBinder; import android.provider.Settings; import android.support.annotation.Nullable; import android.widget.Toast; public class BackgroundService extends Service { private MediaPlayer player; @Nullable @Override public IBinder onBind(Intent intent) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { player = MediaPlayer.create(this,Settings.System.DEFAULT_RINGTONE_URI); player.setLooping(true); player.start(); return START_STICKY; } @Override public void onDestroy() { super.onDestroy(); player.stop(); } } 

Versuchen Sie in AndroidManifest.xml das hinzuzufügen.

  

Führen Sie das Programm, öffnen Sie einfach die Anwendung, finden Sie die Benachrichtigung Warnung im Hintergrund. Selbst wenn Sie die Anwendung beenden, können Sie die Klingeltonwarnung immer noch hören, es sei denn, Sie haben die Anwendung ausgeschaltet oder die Anwendung deinstalliert. Dies bedeutet, dass der Benachrichtigungsalarm im Hintergrundprozess ist. So können Sie einen process für den Hintergrund hinzufügen.

Freundliche Aufmerksamkeit: Bitte, verifiziere nicht mit TOAST, da es nur einmal ausgeführt wird, obwohl es sich im Hintergrund befand.

Hoffe es hilft … !!

Ich habe eine einfache und klare Möglichkeit gefunden, den Service immer in Betrieb zu halten.

Dieser Typ hat es so klar erklärt und einen guten Algorithmus benutzt. Seine Vorgehensweise besteht darin, eine Broadcast-Nachricht zu senden, wenn der Dienst getötet werden soll, und sie dann zu verwenden, um den Dienst neu zu starten.

Sie sollten es sich anschauen : http://fabcirablog.weebly.com/blog/creating-a-never-ending-background-service-in-android

Fügen Sie dies im Manifest hinzu.

   

Fügen Sie eine Serviceklasse hinzu.

 public class YourServiceName extends Service { @Override public void onCreate() { super.onCreate(); // Timer task makes your service will repeat after every 20 Sec. TimerTask doAsynchronousTask = new TimerTask() { @Override public void run() { handler.post(new Runnable() { public void run() { // Add your code here. } }); } }; //Starts after 20 sec and will repeat on every 20 sec of time interval. timer.schedule(doAsynchronousTask, 20000,20000); // 20 sec timer (enter your own time) } @Override public int onStartCommand(Intent intent, int flags, int startId) { // TODO do something useful return START_STICKY; } }