Android Wear: активность в DisplayIntent страницы уведомлений всегда воссоздается

Я разрабатываю какие-то элементы управления мультимедиа для своего Android Wear. Сценарий следующий:

Служба WearableListenerService в приложении для ношения уведомляется об изменении мультимедийных данных, например исполнителя/названия. Отображается текущее уведомление с полноэкранной второй страницей с некоторыми элементами управления. Поскольку я не хочу, чтобы они отображались на моем смартфоне, уведомления встроены в носимое приложение.

Вторая страница состоит из активности, запеченной в намерении отображения:

Intent pageIntent = new Intent(this, ControlActivity.class);
    pageIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);

    PendingIntent pendingIntent = PendingIntent.getActivity(
            getApplicationContext(),
            0,
            pageIntent,
            0);

    Notification controlPage = new Notification.Builder(this)
            .setSmallIcon(R.drawable.ic_launcher)
            .extend(
                    new Notification.WearableExtender()
                            .setCustomSizePreset(Notification.WearableExtender.SIZE_FULL_SCREEN)
                            .setDisplayIntent(pendingIntent))
            .build();

    Notification notification = new NotificationCompat.Builder(this)
            .setSmallIcon(R.drawable.icon)
            .setContentTitle(currentArtist)
            .setContentText(currentTitle)
            .setOngoing(true)
            .extend(
                    new NotificationCompat.WearableExtender()
                            .addPage(controlPage)
                            .addAction(new NotificationCompat.Action(button, null, intent))
                            .setContentAction(0)
                            .setContentIcon(button)
                            .setBackground(BitmapFactory.decodeResource(getResources(), bg))
                            .setHintHideIcon(true)
            )
            .build();
    NotificationManagerCompat.from(this).notify(NOTIFICATION_ID, notification);

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

Есть ли способ предотвратить полное воссоздание активности на второй странице (onDestroy, onCreate) и/или только обновить данные на первой странице уведомления, как это должно быть? Это создание PendingIntent, которое здесь не работает?

Запись манифеста выглядит следующим образом:

    <activity
        android:name=".media.ControlActivity"
        android:allowEmbedded="true"
        android:exported="true"
        android:launchMode="singleTop"
        >

Я пробовал все комбинации флагов, а также обновлял только необходимые части, но ничего не изменилось.

Помощь приветствуется. Дайте мне знать, если вам нужна дополнительная информация.

Изменить: основная проблема заключается в том, что встроенная активность (для пользовательского макета) на второй странице уведомления всегда воссоздается, как только я вызываю уведомление. Повторное использование, только обновление измененных значений на первой странице или ничего не обновляется не имеет никакого эффекта.


comment
Есть ли особая причина, по которой вы создаете свои собственные средства управления мультимедиа, а не используете встроенные элементы управления мультимедиа Android Wear?   -  person ianhanniballake    schedule 10.12.2014


Ответы (2)


Просто транслируйте новую информацию во вторую активность и обновляйте поля при получении трансляции. И сделайте его локальным, чтобы трансляция касалась только вашего приложения.

Во втором действии добавьте BroadcastReceiver в качестве атрибута члена:
private BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { /*do what you're supposed to do, update your data you get the information from the intent by calling intent.getXExtra() as usual*/ } };

И зарегистрируйте его в своем методе onCreate() :
LocalBroadcastManager.getInstance(this).registerReceiver(mReceiver, new IntentFilter("your-filter-name"));

В своем уведомлении, когда вы обновляете информацию, добавьте это:
Intent intent = new Intent("your-filter-name"); intent.putExtra(...); LocalBroadcastManager.getInstance(this).sendBroadcast(intent);

Ваша вторая активность не будет воссоздаваться каждый раз, и изменения должны проходить гладко :)

person Tony Malghem    schedule 10.12.2014
comment
Идея хорошая, я так и пробовал. Проблема в том, что мне все еще нужно обновить первую страницу уведомления. Но даже если я повторно использую уведомление и изменяю значения только для первой страницы, вторая страница с активностью все равно создается заново, как только вызывается уведомление. - person Cattivo; 15.12.2014

нет способа предотвратить воссоздание встроенной активности в уведомлении, вы можете попробовать это в своем смысле.

используйте действие на второй странице и начинайте действие при нажатии на действие, когда уведомление обновляется по времени, действие не будет воссоздано

person Jimmy Chen    schedule 12.12.2014
comment
Добавление кнопки — это еще один щелчок для пользователя, и я хочу иметь доступ к элементам управления прямо на второй странице. Должна быть возможность обновить только первую страницу уведомления или измененные значения. Но каждый раз, когда вторая страница создается заново... - person Cattivo; 15.12.2014