Утечка памяти Android в службе уведомлений

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

OnCreate:

mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

createNotification:

private void createNotification() {
  Intent contentIntent = new Intent(this,MainScreen.class);
  contentIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
  PendingIntent appIntent =PendingIntent.getActivity(this,0, contentIntent, 0);

  contentView = new RemoteViews(getPackageName(), R.layout.notification);
  contentView.setImageViewResource(R.id.image, R.drawable.icon);
  contentView.setTextViewText(R.id.text, "");

  notification = new Notification();
  notification.when=System.currentTimeMillis();
  notification.contentView = contentView;
  notification.contentIntent = appIntent;
}

updateNotification:

private void updateNotification(String text){
  contentView.setTextViewText(R.id.text, text);
  mNotificationManager.notify(0, notification);
}

Спасибо заранее.

Ответы

Ответ 1

Я наткнулся на ту же проблему. Похоже, что если вы не "кешируете" RemoteView и Notification в службе, а воссоздаете их с нуля в "обновлении", эта проблема исчезает. Да, я знаю, что это не эффективно, но, по крайней мере, телефон не перезагружается из-за ошибок в памяти.

Ответ 2

У меня была такая же проблема. Мое решение близко к тому, которое сказал @haimg, но я кэширую уведомление (только RemoteView воссоздается). Таким образом, уведомление не будет мигать, если вы смотрите на него.

Пример:

public void createNotification(Context context){
    Notification.Builder builder = new Notification.Builder(context);

    // Set notification stuff...

    // Build the notification
    notification = builder.build();
}

public void updateNotification(){
    notification.bigContentView = getBigContentView();
    notification.contentView = getCompactContentView();

    mNM.notify(NOTIFICATION_ID, notification);
}

И в методах getBigContentView и getCompactContentView я возвращаю новый RemoteViews с обновленным макетом.