Служба Android должна работать всегда (никогда не останавливать и не останавливать)

Я создал службу и хочу запускать эту службу всегда, пока мой телефон не перезагрузится или не закроется принудительно. Служба должна работать в фоновом режиме.

Пример кода созданного сервиса и запуска сервисов:

Запустите сервис:

Intent service = new Intent(getApplicationContext(), MyService.class);
getApplicationContext().startService(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;
    }
}

Манифест декларации:

<service
    android:name=".MyService"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
</service>

Можно ли запускать этот сервис всегда, как тогда, когда приложение делает паузу и все остальное. Через некоторое время мое приложение переходит в режим паузы, а службы также приостанавливаются или останавливаются. Так как я могу запустить этот сервис в фоновом режиме и всегда.

9 ответов

"Можно ли запускать этот сервис всегда, как при остановке приложения и еще чего-нибудь?"

Да.

  1. В сервисе onStartCommand метод возврата START_STICKY.

    public int onStartCommand(Intent intent, int flags, int startId) {
            return START_STICKY;
    }
    
  2. Запустите службу в фоновом режиме, используя startService(MyService), чтобы она всегда оставалась активной независимо от количества связанных клиентов.

    Intent intent = new Intent(this, PowerMeterService.class);
    startService(intent);
    
  3. Создайте переплет.

    public class MyBinder extends Binder {
            public MyService getService() {
                    return MyService.this;
            }
    }
    
  4. Определите сервисное соединение.

    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. Привязать к сервису с помощью bindService.

            Intent intent = new Intent(this, MyService.class);
            bindService(intent, m_serviceConnection, BIND_AUTO_CREATE);
    
  6. Для вашего сервиса вы можете захотеть, чтобы уведомление запускало соответствующее действие после его закрытия.

    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. Вам нужно изменить манифест, чтобы запустить действие в режиме с одним верхом.

              android:launchMode="singleTop"
    
  8. Обратите внимание, что если системе нужны ресурсы и ваша служба не очень активна, она может быть уничтожена. Если это недопустимо, выведите сервис на передний план, используя startForeground.

            startForeground(NOTIFICATION_ID, m_notificationBuilder.build());
    

Чтобы запустить службу в своем собственном процессе, необходимо указать следующее в объявлении xml.

<service
  android:name="WordService"
  android:process=":my_process" 
  android:icon="@drawable/icon"
  android:label="@string/service_name"
  >
</service> 

Здесь вы можете найти хороший учебник, который был действительно полезен для меня

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

Надеюсь это поможет

Если у вас уже есть сервис, и вы хотите, чтобы он работал постоянно, вам нужно добавить 2 вещи:

  1. в самой службе:

    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }
    
  2. В манифесте:

    android:launchMode="singleTop"
    

Нет необходимости добавлять привязку, если вам это не нужно в сервисе.

Простое решение - перезапустить службу, когда система остановит ее.

Я нашел эту очень простую реализацию этого метода:

Как сделать службу Android неостановимой

Вы можете реализовать startForeground для службы, и даже если он умирает, вы можете перезапустить его с помощью START_STICKY на startCommand(), Не уверен, хотя это правильная реализация.

Я преодолел эту проблему, и мой пример кода выглядит следующим образом.

Добавьте строку ниже в свой Main Activity, здесь BackGroundClass - это класс сервиса. Вы можете создать этот класс в New -> JavaClass (В этом классе добавьте процесс (задачи), в котором вам нужно находиться в фоновом режиме). Для удобства сначала обозначьте их с помощью мелодии уведомления в качестве фонового процесса.

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

В BackGroundClass просто включите мои кодировки, и вы можете увидеть результат.

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();
    }
}

И в AndroidManifest.xml попробуйте добавить это.

<service android:name=".BackgroundService"/>

Запустите программу, просто откройте приложение, вы можете найти уведомление уведомления в фоновом режиме. Даже если вы можете выйти из приложения, вы все равно можете услышать сигнал вызова до тех пор, пока вы не выключите приложение или не удалите его. Это означает, что уведомление о уведомлении находится в фоновом процессе. Таким образом, вы можете добавить некоторый процесс для фона.

Пожалуйста, не проверяйте с TOAST, поскольку он будет запущен только один раз, даже если это было в фоновом процессе.

Надеюсь, это поможет...!!

Вам не требуется трансляция приемника. Если вам понадобится немного усилий, скопируйте один из API (serviceconnection) из вышеприведенного примера Стивена Донекера и вставьте его в Google, вы получите это, https://www.concretepage.com/android/android-local-bound-service-example-with-binder-and-serviceconnection

Я нашел простой и понятный способ сохранить Service работает всегда.

Этот парень объяснил это так ясно и использовал хороший алгоритм. Его подход заключается в отправке широковещательной рассылки, когда служба собирается быть убитой, а затем использовать ее для перезапуска службы.

Вы должны проверить это: http://fabcirablog.weebly.com/blog/creating-a-never-ending-background-service-in-android

Добавьте это в манифест.

      <service
        android:name=".YourServiceName"
        android:enabled="true"
        android:exported="false" />

Добавьте класс обслуживания.

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;
    }

}
Другие вопросы по тегам