14

我有一项服务,它创建一个通知,然后定期用某些信息更新它。大约 12 分钟左右后手机崩溃并重新启动,我认为这是由以下代码中的内存泄漏引起的,这与我如何更新通知有关,如果是这种情况,有人可以检查/建议我吗?我做错了。

创建:

mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

创建通知:

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

更新通知:

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

提前致谢。

4

2 回答 2

9

我偶然发现了同样的问题。看起来如果您不在服务中“缓存”RemoteView 和 Notification,而是在“更新”例程中从头开始重新创建它们,这个问题就会消失。是的,我知道它效率不高,但至少手机不会因内存不足错误而重新启动。

于 2010-12-19T19:30:15.827 回答
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);
}

在方法中getBigContentViewgetCompactContentView我返回一个RemoteViews更新后的布局。

于 2013-05-09T18:04:47.467 回答