Почему служба разрушается, когда основной процесс останавливается?
В настоящее время я изучаю услуги и просто экспериментирую с ними, и у меня нет намерения создавать музыкальный проигрыватель, а просто узнать, как работают службы. Итак, позвольте мне объяснить, что я делаю.
Мое приложение имеет один Activity
и один Service
простирающийся Service
класс, в котором у меня есть
@Override
public void onCreate()
{
mediaPlayer=MediaPlayer.create(this,R.raw.serenity);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
mediaPlayer.start();
return 0;
}
И по моему MainActivity
класс я начинаю Service
в основной теме
startService(intent);
А также я добавил атрибут
<service
android:name=".MusicService"
android:process=":music"/>
Запустить сервис в другом процессе. Теперь я хочу сказать, что когда я запускаю службу с помощью кнопки на классе активности, служба начинает воспроизводить музыку, хотя, когда я нажимаю кнопку "Назад", действие разрушается, а музыка все еще играет, да, что я хочу, но когда я удаляю это приложение из последних затем музыка останавливается и начинается с начала. Пожалуйста, скажите мне, почему это происходит. Я не хочу останавливать музыку, я хочу, чтобы она просто играла независимо от активности или процесса приложения.
2 ответа
Если служба в настоящее время выполняет код в своих методах onCreate(), onStartCommand() или onDestroy(), то процесс размещения будет приоритетным процессом, чтобы этот код мог выполняться без прерывания.
увидеть:
https://developer.android.com/reference/android/app/Service.html
Я знаю это, но мой вопрос заключается в том, что, хотя вы и выполняете onStartCommand (), как приоритетный процесс, он останавливается, когда я очищаю приложение от недавних сервисов, которые оно останавливало один раз, и снова запускало с самого начала. - Душянт Сутар 14 часов назад
- верните START_STICKY, если хотите восстановить службу при закрытии / сбое
- и использовать startForeground(int,Notification);
как показывает пример:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// log start
logger.info(getServiceName(), " Service: start id " + startId + ": " + intent);
/** set foreground */
setForeground();
/** run until explicitly stopped. */
return START_STICKY;
}
private setForeground() {
Intent intent = new Intent(this, NotStickyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
Notification noti = new, Notification.Builder(getApplicationContext())
.setContentTitle("Pratikk")
.setContentText("Subject")
.setSmallIcon(R.drawable.ic_launcher)
.setContentIntent(pendingIntent)
.build();
startForeground(1234, noti);
}
- не включать сервис в манифесте
- запускать сервис через код и использовать базовый контекст (не активность - потому что вы получите исключение из просочившегося сервиса)
- Вы также можете обеспечить связывание и привязку к сервису от деятельности
Пример включения / запуска:
/**
* This method enables the Component (Receiver/Service) registered i
* n the AndroidManifest file.
*/
public static void enableComponent(Context context, Class<?> componentClass) {
getLogger().debug("Enabling component {} request from {}", componentClass.getName(), StackTraceInfo.getInvokingClassName());
ComponentName receiver;
receiver = new ComponentName(context, componentClass);
PackageManager pm = context.getPackageManager();
pm.setComponentEnabledSetting(receiver,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
}
/**
* start a service
*
* @param context - context to start service
* @param serviceClass - service class to start
* @return If the service is being started or is already running, the
* {@link ComponentName} of the actual service that was started is
* returned; else if the service does not exist null is returned.
*/
public static ComponentName startService(Context context, Class<?> serviceClass) {
getLogger().info("Starting service {} by {}", serviceClass.getName(), StackTraceInfo.getInvokingClassName());
Intent serviceIntent = new Intent(context, serviceClass);
return context.startService(serviceIntent);
}
Да, брат, мне удалось сделать мой сервис приоритетным, чтобы эта проблема была решена, но, как вы сказали, а также в документах сказано, что когда когда-либо система выполняет onStartCommand (), тогда она обрабатывается как передний план, но, как вы знаете, когда я очищаю ее от последних тогда его убивают. Я не понимаю разницы между системой, которая рассматривает ее как передний план, и мы устанавливаем это как передний план, почему поведение между ними различается. - Душянт Сутар
Сервис переднего плана - это сервис, который считается тем, о чем пользователь активно осведомлен, и, следовательно, не является кандидатом в систему для уничтожения при нехватке памяти.
Служба переднего плана должна предоставлять уведомление для строки состояния, которая помещается под заголовком "Постоянно", что означает, что уведомление не может быть отклонено, если служба не остановлена или не удалена с переднего плана.
Чтобы сделать ваш сервис более стабильным, вы должны создать приоритетный сервис. Это не будет убивать службу сервис каждый раз, когда ваш основной процесс останавливается. Я столкнулся с подобной проблемой, когда в моем процессе меня убивали и перезапускали снова, когда я останавливал основной процесс. Чтобы избежать этого, я использовал службу переднего плана. Ссылка ниже позволит вам легко реализовать и понять процесс переднего плана. Надеюсь это поможет. Пример сервиса Android-переднего плана