Intereting Posts
ClassCastException при добавлении LayoutParams Android API Google Plus – PeopleApi.loadConnected возвращает 0 человек Что такое фильтр намерений, который будет показывать только приложение в общем меню при совместном использовании URL-адреса? Служба Android: процесс против не Почему Android Geocoder выбрасывает исключение «Service not Available»? Доступ к пользовательскому интерфейсу из JavaScript на Android Как запустить две анимации на двух разных представлениях по API lvl 19 Как добавить перетаскиваемую полосу прокрутки в scrollview / listview в Android? Как проверить, установлен ли будильник OnItemClick, Intent, startActivity errors Android Api 24 не может найти источники Как изменить цвет текста элемента меню переполнения на другой цвет с помощью темы панели действий Шерлока Эксо-проигрыватель Пример DASH Streaming Клавиатура не закрывается после возвращения из почтового клиента BOOT_COMPLETED не вызывается на Honeycomb после экспорта

Процесс службы уничтожается после удаления приложения из лотка приложения.

Я запускаю службу (или перезапускаю запущенную службу), когда запускается действие, используя:

Intent intent = new Intent(this, MyService.class); startService(intent);

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

 bindService(new Intent(this, MyService.class), mConnection, Context.BIND_AUTO_CREATE); 

И когда действие уничтожается, я вызываю

 unbindService(mConnection); 

Раньше служба перезагружалась, когда я убивал одну и ту же активность / приложение из лотка приложения и показывал, что «запущенная служба сообщения 1» работает под управлением приложений.

Теперь служба не перезапускается при убийстве одного и того же действия / приложения.

И я получаю сообщение «0 process 1 service running» , что означает, что служба фактически не запущена.

Служба не перезапускается при закрытии приложения. Мое приложение состоит из одного действия. Также сервис запускается при запуске системы после загрузки системы.

Почему процесс службы убивается, когда я запускаю его с помощью startService ()?

редактировать

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

Введите описание изображения здесь

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

Я столкнулся с этим обходным решением этой темы.

 @Override public void onTaskRemoved(Intent rootIntent){ Intent restartServiceIntent = new Intent(getApplicationContext(), this.getClass()); restartServiceIntent.setPackage(getPackageName()); PendingIntent restartServicePendingIntent = PendingIntent.getService(getApplicationContext(), 1, restartServiceIntent, PendingIntent.FLAG_ONE_SHOT); AlarmManager alarmService = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE); alarmService.set( AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + 1000, restartServicePendingIntent); super.onTaskRemoved(rootIntent); } 

Кажется, ошибка в том, что процесс приложения убит. Нет смысла запускать службу, если ее процесс будет убит.

Помните об этом: onDestroy не всегда называется. Вы не должны ставить код таким образом.
Когда активность принудительно закрывается или закрывается системой ненормально, onDestroy не вызывается.

Я знаю, что этот вопрос старый, но я недавно столкнулся с этой проблемой, и вдруг моя служба перестала закрывать приложение. Раньше он работал нормально. Эта проблема потратила много времени. Для других, у кого есть аналогичная проблема, убедитесь, что ВЫКЛЮЧЕНА ВАШЕГО ПРЕДПОСЫЛКИ. Это была проблема, с которой я столкнулся, и это действительно имеет смысл, так как фоновые данные – это ограниченный фоновый процесс, который не будет работать.

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

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

1. Начать деятельность

Что делать

Взято из службы переднего плана, убитого при получении трансляции после того, как acitivty отменил список задач :

На переднем плане:

  @Override public void onTaskRemoved( Intent rootIntent ) { Intent intent = new Intent( this, DummyActivity.class ); intent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK ); startActivity( intent ); } 

В манифесте:

  <activity android:name=".DummyActivity" android:theme="@android:style/Theme.NoDisplay" android:enabled="true" android:allowTaskReparenting="true" android:noHistory="true" android:excludeFromRecents="true" android:alwaysRetainTaskState="false" android:stateNotNeeded="true" android:clearTaskOnLaunch="true" android:finishOnTaskLaunch="true" /> 

(Если ваша служба находится в другом процессе, то установите этот процесс активности на тот же.)

В DummyActivity.java:

  public class DummyActivity extends Activity { @Override public void onCreate( Bundle icicle ) { super.onCreate( icicle ); finish(); } } 

Побочные эффекты

Заставляет деятельность ретентатов закрываться. Обычно отключение приложения не закрывает активность повторений.

Недостатки

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

объяснение

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

2. Спам BroadcastReceiver с трансляциями на переднем плане

Что делать

Объедините это в свой код обслуживания:

 if (Build.VERSION.SDK_INT >= 16) { Intent intent = new Intent(this, DummyReceiver.class); intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); //This seems to be timing-related; the more times we do this, //the less likely the process gets killed for (int i = 0; i < 50; ++i) sendBroadcast(intent); } 

Создайте фиктивный приемник:

 public class DummyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) {} } 

Добавьте получателя в свой манифест:

 <receiver android:name=".DummyReceiver" /> 

Побочные эффекты

Может вызвать небольшую задержку (~ 250 мс) / повесить, когда задача будет удалена с экрана повторов.

Недостатки

Это только сохраняет работоспособность в процессе приема трансляций. Флаг waitingToKill по-прежнему установлен , поэтому процесс может по-прежнему быть убит впоследствии, например, когда принимается широковещательная передача.

объяснение

Если ваш процесс не работает в приоритете переднего плана, Android попытается немедленно его убить . Прием широковещательных трансляций на переднем плане временно предотвращает это, в результате чего вместо этого устанавливается флаг waitingToKill .

3. Не привязывайтесь к услугам

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

OnDestroy не всегда называется. Основная проблема в вашем случае – ур, не имеющий возможности запустить службу, когда приложение закрыто, в то время Android OS ( в некоторых ОС ) убьет эту услугу. Если вы не можете перезапустить службу, тогда вызовите ящик тревоги, чтобы запустить ресивера, как это,

Манифест,

  <service android:name=".BackgroundService" android:description="@string/app_name" android:enabled="true" android:label="Notification" /> <receiver android:name="AlarmReceiver"> <intent-filter> <action android:name="REFRESH_THIS" /> </intent-filter> </receiver> 

IN Main Activity запускает аварийный ящик таким образом,

 String alarm = Context.ALARM_SERVICE; AlarmManager am = (AlarmManager) getSystemService(alarm); Intent intent = new Intent("REFRESH_THIS"); PendingIntent pi = PendingIntent.getBroadcast(this, 123456789, intent, 0); int type = AlarmManager.RTC_WAKEUP; long interval = 1000 * 50; am.setInexactRepeating(type, System.currentTimeMillis(), interval, pi); 

Это будет вызывать ресивер и ресивер,

 public class AlarmReceiver extends BroadcastReceiver { Context context; @Override public void onReceive(Context context, Intent intent) { this.context = context; System.out.println("Alarma Reciver Called"); if (isMyServiceRunning(this.context, BackgroundService.class)) { System.out.println("alredy running no need to start again"); } else { Intent background = new Intent(context, BackgroundService.class); context.startService(background); } } public static boolean isMyServiceRunning(Context context, Class<?> serviceClass) { ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningServiceInfo> services = activityManager.getRunningServices(Integer.MAX_VALUE); if (services != null) { for (int i = 0; i < services.size(); i++) { if ((serviceClass.getName()).equals(services.get(i).service.getClassName()) && services.get(i).pid != 0) { return true; } } } return false; } } 

И этот рекрутер Alaram называет один раз, когда приложение Android открыто и когда приложение закрыто. SO-сервис подобен этому,

 public class BackgroundService extends Service { private String LOG_TAG = null; @Override public void onCreate() { super.onCreate(); LOG_TAG = "app_name"; Log.i(LOG_TAG, "service created"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i(LOG_TAG, "In onStartCommand"); //ur actual code return START_STICKY; } @Override public IBinder onBind(Intent intent) { // Wont be called as service is not bound Log.i(LOG_TAG, "In onBind"); return null; } @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) @Override public void onTaskRemoved(Intent rootIntent) { super.onTaskRemoved(rootIntent); Log.i(LOG_TAG, "In onTaskRemoved"); } @Override public void onDestroy() { super.onDestroy(); Log.i(LOG_TAG, "In onDestroyed"); } } 

Когда нет привязки к сервису или хорошо установленному приоритету, система андроидов признает услугу как неиспользуемую службу перегрузки, которая должна быть отключена. Вот лучший способ поддерживать обслуживание, даже если приложение закрыто: AlarmManager или Service