Процесс завершается операционной системой Android при нажатии кнопки POWER

Env: - Android 6.0, смартфон Huawei

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

Я использовал службу переднего плана, чтобы поддерживать работу моего приложения в фоновом режиме. См.: android-keeping-a-background-service-alive- предотвращение смерти процесса Этот метод отлично работает на Android 4.1 и 4.4. Но это не работает на Android 5.1 и 6.0. Процесс приложения завершается примерно через 10 секунд после нажатия кнопки POWER.

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

  • Запустите приложение для Android с активностью;
  • Запустите поток регистрации, чтобы регистрировать сообщение каждую секунду;
  • Переопределить сервисный метод onStartCommand(), вызвать startForeground() и показать уведомление;

  • нажмите кнопку, чтобы запустить службу;

  • Нажмите кнопку HOME/BACK на смартфоне, чтобы вернуться на домашнюю страницу;
  • Нажмите кнопку POWER, чтобы выключить экран;
  • Подождите около 10 секунд, поток регистрации останавливается;

  • щелкните значок приложения, чтобы снова запустить приложение;

  • логирующий поток запускается, но его индекс начинается с 0; И PID изменился (см. скриншот ниже)!

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

ПРИМЕЧАНИЕ. Я заметил странную вещь: когда приложение снова запускается, onCreate() активности НЕ вызывается!

Любая помощь приветствуется! Заранее спасибо!

Вот мой код для запуска службы:

    @Override
public int onStartCommand(Intent intent, int flags, int startId) {
    AppGlobal.logDebug(">>>> onStartCommand()");
    if (intent.getAction().equals(Constants.ACTION.STARTFOREGROUND_ACTION)) {
        Log.i(LOG_TAG, "==== Received Start Foreground Intent ");
        showNotification();
        Toast.makeText(this, "Service Started!", Toast.LENGTH_SHORT).show();

    } else if (intent.getAction().equals(Constants.ACTION.PREV_ACTION)) {
        Log.i(LOG_TAG, "Clicked Previous");

        Toast.makeText(this, "Clicked Previous!", Toast.LENGTH_SHORT)
                .show();
    } else if (intent.getAction().equals(Constants.ACTION.PLAY_ACTION)) {
        Log.i(LOG_TAG, "Clicked Play");

        Toast.makeText(this, "Clicked Play!", Toast.LENGTH_SHORT).show();
    } else if (intent.getAction().equals(Constants.ACTION.NEXT_ACTION)) {
        Log.i(LOG_TAG, "Clicked Next");

        Toast.makeText(this, "Clicked Next!", Toast.LENGTH_SHORT).show();
    } else if (intent.getAction().equals(
            Constants.ACTION.STOPFOREGROUND_ACTION)) {
        Log.i(LOG_TAG, "==== Received Stop Foreground Intent");
        stopForeground(true);
        stopSelf();
    }
    return START_STICKY;
}


private void showNotification() {
    AppGlobal.logDebug(">>>> show notification");
    Intent notificationIntent = new Intent(this, StTest33MainActivity.class);
    notificationIntent.setAction(Constants.ACTION.MAIN_ACTION);
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
            | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
            notificationIntent, 0);

    Intent previousIntent = new Intent(this, ForegroundService.class);
    previousIntent.setAction(Constants.ACTION.PREV_ACTION);
    PendingIntent ppreviousIntent = PendingIntent.getService(this, 0,
            previousIntent, 0);

    Intent playIntent = new Intent(this, ForegroundService.class);
    playIntent.setAction(Constants.ACTION.PLAY_ACTION);
    PendingIntent pplayIntent = PendingIntent.getService(this, 0,
            playIntent, 0);

    Intent nextIntent = new Intent(this, ForegroundService.class);
    nextIntent.setAction(Constants.ACTION.NEXT_ACTION);
    PendingIntent pnextIntent = PendingIntent.getService(this, 0,
            nextIntent, 0);

    Bitmap icon = BitmapFactory.decodeResource(getResources(),
            R.drawable.ic_launcher);

    Notification notification = new NotificationCompat.Builder(this)
            .setContentTitle("TutorialsFace Music Player")
            .setTicker("TutorialsFace Music Player")
            .setContentText("My song")
            .setSmallIcon(R.drawable.ic_launcher)
            .setLargeIcon(Bitmap.createScaledBitmap(icon, 128, 128, false))
            .setContentIntent(pendingIntent)
            .setOngoing(true)
            .addAction(android.R.drawable.ic_media_previous, "Previous",
                    ppreviousIntent)
            .addAction(android.R.drawable.ic_media_play, "Play",
                    pplayIntent)
            .addAction(android.R.drawable.ic_media_next, "Next",
                    pnextIntent).build();
    startForeground(Constants.NOTIFICATION_ID.FOREGROUND_SERVICE,
            notification);

}

person mancook    schedule 11.09.2016    source источник
comment
Вы говорите о потоке регистрации, но я не вижу там вообще никакого потока. Вы уверены, что вас убивают, а не просто вводят в сон?   -  person Gabe Sechan    schedule 11.09.2016
comment
Это демонстрационное приложение, которое использует поток ведения журнала, чтобы показать, запущен ли процесс или убит. Я очень уверен, что процесс убит! Потому что запись останавливается примерно через 10 секунд после того, как я нажимаю кнопку POWER.   -  person mancook    schedule 11.09.2016


Ответы (1)


Huawei прекращает процесс, если он не указан в списке защищенных приложений, когда процесс находится в спящем режиме. Перейдите в «Настройки» -> «Защищенные приложения» -> «Выберите свое приложение и включите его как защищенное приложение».

person Sabid Habib    schedule 19.02.2017