Перезапуск службы в методе onDestroy

Я сделал приложение, в котором служба работает в фоновом режиме. Но если системе Android потребуются ресурсы, она остановит службу. Однако мне все еще может потребоваться, чтобы моя служба работала.

Не рекомендуется ли перезапускать службу (если условие, относящееся к моему приложению, остается истинным) в методе onDestroy моей службы?

Как я могу убедиться, что моя служба работает бесконечно (если условие, относящееся к моему приложению, остается верным)? Или хотя бы с высоким приоритетом?


person SoulRayder    schedule 05.01.2016    source источник
comment
Возможный дубликат Автоматический вызов службы при уничтожении активности   -  person Pratik Butani    schedule 05.01.2016
comment
@PratikButani: это не дубликат. То, о чем я здесь говорю, не имеет отношения к какой-либо деятельности или нескольким службам. Это связано с передовой практикой, когда система Android решает остановить службу для экономии ресурсов.   -  person SoulRayder    schedule 05.01.2016


Ответы (2)


Вероятно, лучшее, что вы можете сделать, это использовать флаг START_STICKY, который указывает Android попытаться перезапустить службу, если она была остановлена. Кроме того, убедитесь, что он потребляет как можно меньше ресурсов, чтобы с меньшей вероятностью быть уничтоженным.

Android ставит пользовательский интерфейс выше всего. Затем процессы, связанные с пользовательским интерфейсом. Затем процессы, которые потребляют наименьшее количество ресурсов. Service работает в фоновом режиме, поэтому, если у него нет ресурсов, которые также используются в пользовательском интерфейсе или каким-либо образом связаны с пользовательским интерфейсом, он должен иметь более низкий приоритет.

Также вы не можете указать Android, как расставить приоритеты для вашего Service (каждый сделает свой «самый высокий приоритет», верно?). Так что все зависит от того, насколько хорошо вы минимизируете влияние на общие ресурсы — зачем убивать 3 Service, если можно убить 1 и восстановить все необходимые ресурсы?

Чтобы лучше понять, как лучше управлять памятью: http://developer.android.com/training/articles/memory.html

person Jim    schedule 05.01.2016
comment
Привет, @Джим, спасибо :). Пожалуйста, ответьте на мой первый вопрос. Вызовет ли это какие-либо проблемы, если я перезапущу свою службу в методе onDestoy службы, поскольку, когда система Android останавливает службу, вызывается метод onDestoy. - person SoulRayder; 05.01.2016

установите его START_STICKY. Это приводит к тому, что после убийства службы служба снова перезапускается. это мой код:

android manifest : 
<application 
....
    <service android:name=".UpdateService" />

 </application>

класс обслуживания:

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;


public class UpdateService extends Service {
BroadcastReceiver mReceiver;


@Override
public void onCreate() {
    super.onCreate();
    // register receiver that handles screen on and screen off logic
    IntentFilter filter = new IntentFilter(Intent.....);

    filter.addAction(Intent....);
    mReceiver = new MyReceiver();
    registerReceiver(mReceiver, filter);
}


@Override
public void onDestroy() {

    unregisterReceiver(mReceiver);
    Log.i("onDestroy Reciever", "Called");

    super.onDestroy();
}


@Override
public void onStart(Intent intent, int startId) {

        Log.i("log", "action Called");

    }
}


@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}


@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return Service.START_STICKY;
    }
}

класс приемника:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;


public class MyReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {

        Log.i("Log", "recevid");

}
}

в StartupActivity:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    Context context = getApplicationContext();
    Intent service = new Intent(context, UpdateService.class);
    context.startService(service);
}
person mhk    schedule 05.01.2016