创建手表上的通知信息(Notification)

*以下内容翻译自android wear的官方教程,本人水平有限,如有错误欢迎指出
home
以下正文


用NotificationCompat.Builder来发送同时在手持设备和手表上都显示通知。当你用这个类发送通知的时候,系统会关心怎样合适的展示信息。

注意:通知会使用 RemoteViews来剥离所有的自定义的layouts并只展示一个文本和icon,但是你也可以通过编写wearable app来创建自定义通知

导入必要的类

为了导入(import)必要的包,你需要在build.gradle文件中添加

compile "com.android.support:support-v4:20.0.+"

现在你的project已经加载了必要的包,在你需要使用通知的地方导入以下类

import android.support.v4.app.NotificationCompat;
import android.support.v4.app.NotificationManagerCompat;
import android.support.v4.app.NotificationCompat.WearableExtender;

用Notification Builder创建通知

v4 support library 可以让你创建拥有最新特性的通知,比如动作按钮和大图标。她最低可以兼容android 1.6(API 4).

你可以创建 NotificationCompat.Builder实例,然后调用notify()发送这个通知,如下:

int notificationId = 001;
// 为通知内容创建intent
Intent viewIntent = new Intent(this, ViewEventActivity.class);
viewIntent.putExtra(EXTRA_EVENT_ID, eventId);
PendingIntent viewPendingIntent =        
              PendingIntent.getActivity(this, 0, viewIntent, 0);
NotificationCompat.Builder notificationBuilder =       
              new NotificationCompat.Builder(this)
             .setSmallIcon(R.drawable.ic_event)        
             .setContentTitle(eventTitle)        
             .setContentText(eventLocation)        
             .setContentIntent(viewPendingIntent);

// 获取NotificationManager 实例
serviceNotificationManagerCompat notificationManager =  
      NotificationManagerCompat.from(this);

// 创建和发送通知
 manager.notificationManager.notify(notificationId, notificationBuilder.build());

当这个通知出现在手机上时,用户触摸通知将会回调 PendingIntent。当通知出现在手表上时,用户可以左滑通知来触发Open动作,这将调用在手机上的intent。(也就是说手机和手表上的通知在被打开之后都会调用同一个intent)

添加动作按钮

除了简单的用 setContentIntent()方法来调用基本的content action外,你也可以用 addAction() 增加其他的 PendingIntent

创建手表上的通知信息(Notification)_第1张图片
效果图

比如以下的代码将会显示与上面类似效果。下面的代码增加一个在地图上显示location的动作。

//建立一个显示地图的intent
Intent mapIntent = new Intent(Intent.ACTION_VIEW);
/调用外部地图程序
Uri geoUri = Uri.parse("geo:0,0?q=" + Uri.encode(location));
mapIntent.setData(geoUri);
PendingIntent mapPendingIntent =
        PendingIntent.getActivity(this, 0, mapIntent, 0);
NotificationCompat.Builder notificationBuilder =
        new NotificationCompat.Builder(this)
        .setSmallIcon(R.drawable.ic_event)
        .setContentTitle(eventTitle)
        .setContentText(eventLocation)
        .setContentIntent(viewPendingIntent)
        .addAction(R.drawable.ic_map,
                getString(R.string.map), mapPendingIntent);

在手机上,这个动作将会显示成通知上的附加按钮。在手表上,这个动作将会变成用户左滑后显示的大按钮。当用户触发这个按钮之后,相关的intent将会在手机上被调用。

Tip:当你的通知有"回复"动作(比如在社交软件),你可以通过让手表直接发送语音信息来回复。你可以看在通知中获取手表的语音输入

专用与手表的动作(action)

如果你希望有些动作在手表上和在手机上不一样,你可以调用 WearableExtender.addAction()。用这个方法添加了动作之后,手表将不会触发NotificationCompat.Builder.addAction()添加的动作。当然,在WearableExtender.addAction()上添加的动作也不会出现在手机上。

// 建立一个回复动作的intent
Intent actionIntent = new Intent(this, ActionActivity.class);
PendingIntent actionPendingIntent =
        PendingIntent.getActivity(this, 0, actionIntent,
                PendingIntent.FLAG_UPDATE_CURRENT);

// 创建一个action
NotificationCompat.Action action = 
       new NotificationCompat.Action.Builder(R.drawable.ic_action,
                getString(R.string.label), actionPendingIntent)
                .build();

// 建立notification 然后用WearableExtender添加上面的action
Notification notification =
        new NotificationCompat.Builder(mContext)
                .setSmallIcon(R.drawable.ic_message)
                .setContentTitle(getString(R.string.title)) 
                .setContentText(getString(R.string.content))
                .extend(new WearableExtender().addAction(action))
                .build();

添加Big View

你可以通过使用"big view" styles 来存放较多的文本信息。在手机端,用户可以拓展(expending)通知来查看big view的内容。在手表上,big view 是默认显示的。

创建手表上的通知信息(Notification)_第2张图片
效果图

为了拓展你的通知可以显示的内容,用 NotificationCompat.Builder的 setStyle()方法,方法里的参数是 BigTextStyle或 InboxStyle的实例。
比如下面的代码为通知添加了 NotificationCompat.BigTextStyle实例,这实例可以自适应提供比 setContentText()的更大的空间来包含文本

// 用'big view' content 来包含比起一般情况更长的事件描述
BigTextStyle bigStyle = new NotificationCompat.BigTextStyle();
bigStyle.bigText(eventDescription);
NotificationCompat.Builder notificationBuilder =
        new NotificationCompat.Builder(this)
        .setSmallIcon(R.drawable.ic_event)
        .setLargeIcon(BitmapFactory.decodeResource(
                getResources(), R.drawable.notif_background))
        .setContentTitle(eventTitle)
        .setContentText(eventLocation)
        .setContentIntent(viewPendingIntent)
        .addAction(R.drawable.ic_map,
                getString(R.string.map), mapPendingIntent)
        .setStyle(bigStyle);

上面的代码用了 setLargeIcon()方法添加大图标,这些大图标将会以背景图片的形式出现,但是有些情况下可能会因为屏幕的自适应导致图片看起来有点奇怪。下一节将会告诉你怎么为通知添加手表专用的背景图片。

为通知添加一些手表上特有的特性

如果你需要为你的通知添加一些手表上特有的特性,比如果多页的通知内容或者用语音输入,你可以使用 NotificationCompat.WearableExtender来实现这些特性。
以下是实现步骤:

  1. 建立一个 WearableExtender实例,并设置手表上通知特有的选项。
  2. 建立 NotificationCompat.Builder的实例,并设置一些必要的属性。
  3. 调用通知的extend()方法,并将WearableExtender传入,这样手表上特有的特性就应用到了通知上。
  4. 调用通知build()方法。
    比如以下代码把app的图标在通知的卡片上删除
//建立 WearableExtender 来添加特性
NotificationCompat.WearableExtender wearableExtender =
        new NotificationCompat.WearableExtender()
        .setHintHideIcon(true)
        .setBackground(mBitmap);
// 建立NotificationCompat.Builder 来创建标准的通知
// 然后用上面的东西拓展(extend)这个通知
Notification notif = new NotificationCompat.Builder(mContext)
        .setContentTitle("New mail from " + sender)
        .setContentText(subject)
        .setSmallIcon(R.drawable.new_mail)
        .extend(wearableExtender)
        .build();

上面的两个方法 setHintHideIcon()和setBackground()是只在NotificationCompat.WearableExtender
.中有的新通知特性。

注意: 如果你用位图来 setBackground() ,没有滑动的背景应该要400400,而需要滑动的背景要600400。把这些位图存放在res/drawable-nodpi目录下。把通知需要的非位图资源比如 setContentIcon()需要的存放在res/drawable-hdpi目录下。

如果你需要查看一些特性是否被使用,你可以调用对应的get方法。比如用getHintHideIcon()来确认是否隐藏图标:

NotificationCompat.WearableExtender wearableExtender =
        new NotificationCompat.WearableExtender(notif);
boolean hintHideIcon = wearableExtender.getHintHideIcon();

发送通知

你发送通知的时候应该用 NotificationManagerCompat 而不是NotificationManager

// 获得 NotificationManager 的实例
 serviceNotificationManagerCompat notificationManager =
        NotificationManagerCompat.from(mContext);
// 发送通知
notificationManager.notify(notificationId, notif);

如果你用 NotificationManager来发送通知的话,一些 NotificationCompat.WearableExtender的特性将不会工作,所以一定要用 NotificationCompat.WearableExtender来发送通知

你可能感兴趣的:(创建手表上的通知信息(Notification))