Подтвердить что ты не робот

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

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

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

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

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

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

unbindService(mConnection);

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

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

И я получаю сообщение "0 процесс 1, работающий, что означает, что служба фактически не работает.

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

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

изменить

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

enter image description here

4b9b3361

Ответ 1

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

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

@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);
 }

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

Ответ 2

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

Ответ 3

К сожалению, это сложная проблема из-за того, как работает 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. Спам a 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. Не привязывайтесь к службам

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

Ответ 4

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

Ответ 5

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

Манифест есть,

         <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 Основной манипулятор запуска активации таким образом,

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);

это вызовет reciver и reciver,

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");
    }
}

Ответ 6

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