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