На Android у меня есть Activity
FirstActivity
, который запускает Service
по имени MyService
, чтобы сделать сетевые материалы в фоновом режиме. Activity
и Service
постоянно взаимодействуют друг с другом, вызывая методы.Деятельность с длительным обслуживанием в фоновом режиме, которое не будет убито
Теперь, когда пользователь переходит от FirstActivity
к SecondActivity
, фоновая служба должна не быть убиты или воссоздан, но сохранил в живых и перешел к SecondActivity
, который теперь будет один, связываясь со службой.
Другими словами, Service
должен работать до тех пор, как один из двух Activity
с управлением, и он не должен останавливаться, когда пользователь переходит между двумя Activity
с.
Один из Activity
s всегда будет находиться на переднем плане, и за это время служба (оптимально) не будет убита. Я думаю, что это не должно быть проблемой, потому что один из этих двух Activity
s всегда активен, и поэтому Android знает, что услуга важна, а не то, что нужно убить.
(Если бы не было никакого способа предотвратить Android от убийства и повторного создания службы время от времени, я должен был бы способ восстановления полного состояния службы грациозно.)
Резюмируя , у Service
должна быть такая же продолжительность жизни, как и у двух Activity
s "в сочетании". Он должен начинаться с первого из них и останавливаться не раньше, чем обе они были уничтожены.
. Правильно ли указан следующий код и цели?
public class MyService extends Service {
public class LocalBinder extends Binder {
public MyService getService() {
return MyService.this;
}
}
...
}
public class FirstActivity extends Activity {
private MyService mMyService;
private ServiceConnection mMainServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
MyService mainService = ((LocalBinder) service).getService();
mMyService = mainService;
mMyService.setCallback(FirstActivity.this);
}
@Override
public void onServiceDisconnected(ComponentName className) {
mMyService = null;
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
...
startService(new Intent(FirstActivity.this, MyService.class));
}
@Override
protected void onResume() {
super.onResume();
bindService(new Intent(FirstActivity.this, MyService.class), mMainServiceConnection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onPause() {
super.onPause();
if (mMainServiceConnection != null) {
unbindService(mMainServiceConnection);
}
if (mMyService != null) {
mMyService.setCallback(null);
}
if (!isUserMovingToSecondActivity) {
stopService(new Intent(FirstActivity.this, MyService.class));
}
}
@Override
public void onBackPressed() {
stopService(new Intent(FirstActivity.this, MyService.class));
super.onBackPressed();
}
...
}
public class SecondActivity extends Activity {
private MyService mMyService;
private ServiceConnection mMainServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
MyService mainService = ((LocalBinder) service).getService();
mMyService = mainService;
mMyService.setCallback(SecondActivity.this);
}
@Override
public void onServiceDisconnected(ComponentName className) {
mMyService = null;
}
};
@Override
protected void onResume() {
super.onResume();
bindService(new Intent(SecondActivity.this, MyService.class), mMainServiceConnection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onPause() {
super.onPause();
if (mMainServiceConnection != null) {
unbindService(mMainServiceConnection);
}
}
@Override
protected void onDestroy() {
...
stopService(new Intent(SecondActivity.this, MyService.class));
}
...
}
Это лучший способ гарантировать длительный сервис в фоне Activity
с, что не будет убит или воссозданной?
Что относительно Context.BIND_AUTO_CREATE
? Правильно ли здесь установить этот флаг? Что относительно Context.BIND_ADJUST_WITH_ACTIVITY
и Context.BIND_WAIVE_PRIORITY
- мне это нужно?
Вы пробовали этот код или спрашиваете, прежде чем пытаться? Если вы попытались, вы получили какие-либо ошибки? Разве это не так, как вы ожидали? У нас будет гораздо более продуктивная дискуссия и более полезный ответ для сообщества и самого себя, если вы действительно попробуете его, а затем попросите у нас решить конкретную проблему у вас есть – DallaRosa
@ DallaRosa Да, конечно, я пробовал это.Это общий вопрос о том, как создать класс обслуживания и соответствующие классы «Активность», чтобы служба длилась как можно дольше и не была убита. Пользователи сообщили, что функции, предоставляемые этой службой, перестают быть доступными в одном из классов «Активность» время от времени. И мне (а) трудно отлаживать, когда система может убить эту услугу, и (б) хотел бы узнать о некоторых передовых методах или улучшениях, которые должны применяться к этой службе для четко определенных целей и требований. – caw
Я вижу много вопросов в вашем управлении 'Сервис'. Вам нужно остановить его только тогда, когда первая «активность» будет уничтожена или зависит от привязки и правильной работы. В Начальных книгах Android есть некоторые общие инструкции: https://books.google.com.pk/books?id=mRGrCQbqHkoC&pg=PA399 – corsair992