Android Wear 通知更新时如何防止图标闪烁

54

我似乎无法创建一个Android Wear通知,而不会使应用程序图标闪烁,而在Android手机上相同的代码却正常工作。

大多数参考解决方案都涉及更新相同的通知、使用setAlertOnlyOnce、保持IDwhen不变。然而,无论我做什么,每次更新通知时它都会闪烁(最常见于应用程序图标)。

Android Wear: Timer like notification card on wear device所建议的,您可以使用setHintHideIcon(true)隐藏应用程序图标,这将隐藏闪烁部分,但是在Android Wear通知的有限世界中,应用程序图标在应用品牌中扮演着重要角色。

如果您想要一个计时器,您可以使用.setUsesChronometer(true)并让系统更新计时器,这完美地完成了工作。不幸的是,如果您想要更新除时间以外的其他内容(例如步数或接收到的消息计数),您可能会感到失望。

下面是一段代码,当作为手机应用运行时可以正常工作,但在作为可穿戴应用运行时会闪烁。

下面的注释行演示了当在可穿戴设备上发布一个未更改的通知时,该通知仍会闪烁(而不是手机)。取消注释以再次更新通知。

mNotification = buildNotification(WearMainActivity.this);

因此,我的问题是,如果有人有任何进一步的想法,我们可以探索如何保持通知不闪烁,或者我们可以将其写下来作为Android Wear的一个错误吗?
public class WearMainActivity extends Activity {

    public final int NOTIFICATION_ID= 1;
    public Notification mNotification;
    public int count;
    public long when;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        count = 0;
        when = System.currentTimeMillis();
        mNotification = buildNotification(WearMainActivity.this);
        postDelayedHandler();
        finish();
    }

    private void postDelayedHandler(){

        new Handler().postDelayed(new Runnable() {
            public void run() {
                count++;
                mNotification = buildNotification(WearMainActivity.this);
                NotificationManager notifyMgr = ((NotificationManager) getSystemService(NOTIFICATION_SERVICE));
                notifyMgr.notify(NOTIFICATION_ID, mNotification);
                postDelayedHandler();
            }
        }, 1000L);
    }

    private Notification buildNotification(Context context){
        return new Notification.Builder(context)
                .setSmallIcon(R.drawable.ic_launcher)
                .setContentTitle(context.getString(R.string.app_name))
                .setContentText("Count: "+count)
                .setWhen(when)
//                .setOngoing(true) //Don't do this, adds "Mute app" action
                .setOnlyAlertOnce(true)
                .setPriority(Notification.PRIORITY_MAX)
                .extend(new Notification.WearableExtender()
//                        .setHintHideIcon(true) //Hides the icon, so kinda hides the blink
                )
                .build();
    }
}

测试于:
可穿戴设备:Moto 360 (4.4W2) Wear Emulator (5.0.1)
手机:Galaxy Nexus (4.3) 和 Nexus 5 (5.0.0)

问题出现时机:在作为可穿戴应用程序运行或作为显示在可穿戴设备上的手机通知时。在手机上完美运行。

相关问题:
如何避免更改按钮时通知更新闪烁
静默更新正在进行的通知
如何正确地在 API 11 之后更新通知?


1
所以我刚刚得到了5.0更新(他们花了很长时间!)答案是:是和否!当您从手机上启动的应用程序获得扩展通知时,它可以无缝工作,没有任何闪烁。 但是,如果您从手表上启动应用程序,它仍然会闪烁。因此,现在我们有两种不同的行为方式,这取决于通知的起源位置... - LearnDriver
有任何进展吗?我也标记了这个问题。我想使用自定义通知布局,但也无法使其正常工作! - StuStirling
你能否在现在正在推出的Android Wear 5.1固件上测试一下?如果仍然存在问题,那么我会尝试解决它。 - Wayne Piekarski
好的,谢谢!一旦我在我的Moto 360上得到更新(上次花了2-3周),我会做的。否则,我可以在G+上私信您一个APK? - LearnDriver
可能与每次调用buildNotification时返回一个新的builder有关。如果每次使用新的builder,那么我猜Android必须重新构建视图,导致它短暂消失。查看此问题和答案以获取帮助。https://dev59.com/Tmw15IYBdhLWcg3wxukh#15538209 如果有效,请告诉我,我会在答案中发布。 - bigC5012
显示剩余8条评论
2个回答

1

我之前在使用 Android Wear 时解决了这个问题,但不幸的是代码已经丢失。无论如何,我的做法是不在每次想要更新通知时都 BUILD 通知,而是给通知打上标记,并在第一次创建时检索它,然后直接对该对象进行更改。这完全消除了闪烁...


1

替换:

NotificationManager notifyMgr = 
    ((NotificationManager)getSystemService(NOTIFICATION_SERVICE));

使用:

NotificationManagerCompat notifyMgr =
    NotificationManagerCompat.from(this);

更多信息

你也正在做很多更新。每个更新都通过蓝牙发送到智能手表。你应该为 Android Wear 创建自安装应用程序。发送的延迟大约为3秒钟。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接