Рестартиране на услуга в метода onDestroy

Направих приложение, в което услуга работи във фонов режим. Но ако системата Android изисква ресурси, тя ще спре услугата. Все пак може да изисквам услугата ми да работи.

Лоша практика ли е да се рестартира услугата (ако условието, свързано с моето приложение, все още е вярно) в метода onDestroy на моята услуга?

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


person SoulRayder    schedule 05.01.2016    source източник
comment
Възможен дубликат на Service Automatic Called on Destroying Activity   -  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 Services, когато може да убие 1 и да възвърне всички необходими ресурси?

За да разберете как да управлявате по-добре паметта: http://developer.android.com/training/articles/memory.html

person Jim    schedule 05.01.2016
comment
Хей @Jim, благодаря :). Моля, отговорете на първия ми въпрос. Ще създаде ли някакви проблеми, ако рестартирам услугата си в метода 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