Панель уведомлений Android Использование ЦП увеличивается при непрерывной отправке уведомлений в течение длительного периода - PullRequest
2 голосов
/ 17 октября 2011

У меня есть приложение, которое запускает службу, которая постоянно обновляет панель уведомлений.В уведомлении отображается состояние службы.Служба записывается на период ожидания, затем выполняет некоторую работу в фоновом режиме, а затем повторяется.Таким образом, мои уведомления представляют собой строки типа:

Idle (3)

Idle (2)

Idle (1)

Working

Idle (3)

...

Все это работает хорошо, проблема, с которой я сталкиваюсь, заключается в том, что после длительного периода работы загрузка ЦП увеличиваетсяПроцесс Android, в частности:

com.android.systemui

Я использую "top" через консоль adb.Когда я впервые запускаю приложение, оно показывает CPU% от 0 до 5% для com.android.systemui.Через 30 минут загрузка ЦП составляет ~ 80%.

В моем классе у меня есть следующий код: private NotificationManager _notificationManager;частное уведомление _notification;private CharSequence _lastNotification;

@Override
public void onCreate() {
    super.onCreate();
    _notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    _notification = createNotification();
}

@Override
public void onDestroy() {
    super.onDestroy();
    _notificationManager.cancel(getNotificationId());
}

private Notification createNotification() {
    final Notification notification = new Notification();
    notification.icon = R.drawable.notification_icon;
    notification.tickerText = getText(R.string.serviceStarted);
    notification.flags |= Notification.FLAG_ONGOING_EVENT;

    final RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.notification_layout);
    contentView.setImageViewResource(R.id.imageViewIcon, R.drawable.notification_icon);
    contentView.setTextViewText(R.id.textViewAppName, getText(R.string.appName));
    notification.contentView = contentView;
    return notification;
}

private void updateNotification(CharSequence message) {
    if (!message.equals(_lastNotification)) {
        _notification.contentView.setTextViewText(R.id.textViewState, message);
        _notificationManager.notify(getNotificationId(), _notification);
        _lastNotification = message;
    }
}

Я не понимаю, почему это может происходить.Чтобы бороться с этим, я добавил обходной путь, который очистит уведомление после завершения работы, а затем вернет его назад, и это, похоже, «решило» проблему.Разумеется, единственная проблема заключается в том, что уведомление исчезает и появляется снова при каждом выполнении работы.

...