翻译的好辛苦,有些地方也不太理解什么意思,如果有误,还请大神指正。
官方文档地址:http://developer.android.com/guide/topics/ui/notifiers/notifications.html
notification可以作为一条信息被显示在你的应用程序的正常UI之外。当你告诉系统去发布一条notification,它首先会在notification area(通知区域)显示一个小图标。想要去查看notification的详细内容,用户必须打开notification drawer(通知抽屉)。notification area和notification drawer都是由系统控制的区域,用户可以在任何时候查看它们。
NotificationCompat.Builder mBuilder = newNotificationCompat.Builder(this) .setSmallIcon(R.drawable.notification_icon) .setContentTitle("My notification") .setContentText("Hello World!"); // 为Activity创建一个明确的Intent Intent resultIntent =newIntent(this,ResultActivity.class); // 栈建造者对象将为启动的Activity制造一个人工的回退栈 // 这样确保了在按回退键的时候,可以从启动的Activity回退到主屏幕上 TaskStackBuilder stackBuilder =TaskStackBuilder.create(this); // 为Intent添加回退栈,但不是Intent本身 stackBuilder.addParentStack(ResultActivity.class); // 添加Intent,这个Intent启动Activity并放置它到栈顶 stackBuilder.addNextIntent(resultIntent); PendingIntent resultPendingIntent = stackBuilder.getPendingIntent( 0, PendingIntent.FLAG_UPDATE_CURRENT ); mBuilder.setContentIntent(resultPendingIntent); NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); // mId 允许你在之后更新这个通知 mNotificationManager.notify(mId, mBuilder.build());到这里为止,你的用户已经被通知了。 给通知应用一个大视图样式(Applying a big view style to a notification) 当通知被展开的时候,会有一个大的视图出现,首先创建一个NotificationCompat.Builder对象来添加一些你想要的可选的样式。然后调用Builder.setStyle(),把big view style对象作为参数传入。 记住,展开通知在Android 4.1之前是不可用的。想要学习如何在Android 4.1以前更早的版本上处理这个问题,参考Handling compatibility。 举个例子,接下来的代码片段示范了如何修改之前创建的通知,让它使用一个收信箱大视图样式:
NotificationCompat.Builder mBuilder =newNotificationCompat.Builder(this) .setSmallIcon(R.drawable.notification_icon) .setContentTitle("Event tracker") .setContentText("Events received") NotificationCompat.InboxStyle inboxStyle = newNotificationCompat.InboxStyle(); String[] events =newString[6]; // 给收信箱样式的大视图设置一个标题 inboxStyle.setBigContentTitle("Event tracker details:"); ... // 将事件列表放入收信箱中 for(int i=0; i < events.length; i++){ inboxStyle.addLine(events[i]); } //将收信箱样式设置给通知对象 mBuilder.setStyle(inBoxStyle); ... // 在这里写上发布通知的代码
处理兼容性(Handling compatibility) 对于某个版本来说,并不是所有的通知的特性都是可用的,尽管在支持库中的类NotificationCompat.Builder是可以设置这些方法。比如说,行为按钮(action button),这取决于展开通知,只出现Android 4.1及更高的版本上,因为可展开的通知只在Android 4.1及更高的版本可以被使用。 为了确保最好的兼容性,使用NotificationCompat来创建通知对象,特别推荐使用NotificationCompat.Builder。另外,在实现你的通知对象的时候请遵从下面的步骤:
mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); // 给通知设置一个ID,这个可以用来更新 int notifyID =1; mNotifyBuilder =newNotificationCompat.Builder(this) .setContentTitle("New Message") .setContentText("You've received new messages.") .setSmallIcon(R.drawable.ic_notify_status) numMessages =0; // 开启一个循环去处理数据,然后通知用户 ... mNotifyBuilder.setContentText(currentText) .setNumber(++numMessages); // 因为ID仍然存在,所以可以更新通知 mNotificationManager.notify( notifyID, mNotifyBuilder.build()); ...这段代码产生的效果看起来像这样子的:
<activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <actionandroid:name="android.intent.action.MAIN"/> <categoryandroid:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <activity android:name=".ResultActivity" android:parentActivityName=".MainActivity"> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".MainActivity"/> </activity>
2.创建一个基于启动Activity的Intent的回退栈。 a.创建Intent去启动Activity。 b.通过调用TaskStackBuilder.create()去创建栈建造者。 c.通过调用addParentStack()去添加回退栈。对于你在manifest文件中定义的每一个在层级结构中的Activity,回退栈包含一个启动Activity的Intent对象。这个方法也在一个全新的任务中添加了一个开始栈的标识符。 笔记:虽然addParentStack()的参数是关联着启动Activity。但这个方法没有添加启动Activity的Intent。取而代之的,看下一步。 d.调用addNextIntent()来添加从通知启动Activity的Intent。把在第一步中创建的Intent作为参数传给addNextIntent()。 e.如果你需要,通过调用TaskStackBuilder.editIntentAt()给Intent对象传递参数。当用户使用Back按键来导航,有时候非常有必要确保目标Activity显示有意义的数据。 f.通过调用getPendingIntent()获取一个PendingIntent。你可以把这个PendingIntent作为参数传给setContentIntent()。 下面的代码片段示范了这个过程。
... Intent resultIntent =newIntent(this,ResultActivity.class); TaskStackBuilder stackBuilder =TaskStackBuilder.create(this); //添加回退栈 stackBuilder.addParentStack(ResultActivity.class); // 把Intent添加到栈顶 stackBuilder.addNextIntent(resultIntent); // 获取包含整个回退栈的PendingIntent PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT); ... NotificationCompat.Builder builder =newNotificationCompat.Builder(this); builder.setContentIntent(resultPendingIntent); NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); mNotificationManager.notify(id, builder.build());
设置一个特殊的Activity PendingIntent(Setting up a special activity pendingIntent) 接下来的几个部分描述了如何设置一个特殊的ActivityPendingIntent。 一个特殊的activity不需要回退栈,所以你可以不在manifest文件中定义activity的层级关系,你也不需要在构建回退栈的时候调用addParentStack()。取而代之的,使用manifest文件来设置activity的任务选项,通过getActivity()来创建PendingIntent。 1.在你的manifest文件中,为你的Activity添加如下属性 android-name="activityclass" activity的完整类名。 android-taskAffinity="" 与你在代码中的FLAG_ACTIVITY_NEW_TASK标识符有关,这确保了Activity不会进入应用程序的任务中。任何与应用程序默认的任务都不会受到影响。 android-excludeFromRecents="true" 排除来自“最近任务”的新任务,所以用户不会不小心导航回去。 下面代码片段显示这个xml代码
<activity android:name=".ResultActivity" ... android:launchMode="singleTask" android:taskAffinity="" android:excludeFromRecents="true"> </activity> ...2.构建和发布通知: a.创建一个启动Activity的Intent。 b.通过调用setFlags()来设置Activity在一个全新的,空的任务中启动,可以使用如下标识符作为参数:FLAG_ACTIVITY_NEW_TASK和FLAG_ACTIVITY_CLEAR_TASK。 c.为Intent设置其它你需要的可选项。 d.通过调用getActivity(),从Intent中创建一个PendingIntent。你可以把这个PendingIntent当参数传给setContentIntent()。 下面的代码片段示范了这个过程。
// 实例化一个建造对象 NotificationCompat.Builder builder =newNotificationCompat.Builder(this); // 为Activity创建一个Intent Intent notifyIntent = newIntent(newComponentName(this,ResultActivity.class)); // 设置这个Activity在一个全新的,空的任务中启动 notifyIntent.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK); // 创建PendingIntent PendingIntent notifyIntent = PendingIntent.getActivity( this, 0, notifyIntent PendingIntent.FLAG_UPDATE_CURRENT ); // 把PendingIntent放入通知 builder.setContentIntent(notifyIntent); // 通知通过通知管理器发布 NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); // 构建一个匿名的通知发送给通知管理器 mNotificationManager.notify(id, builder.build());
在通知里显示一个进度条(Displaying Progress in a Notification) 通知可以包含一个动态的进度指示器,用来显示当前操作的进度。如果你能估计这个操作总共有多久,以及任何时间点上的完成度,那么你可以用一个“确定”格式的指示器(进度条)。如果你没法估计操作的长度,用“不确定”格式的指示器。 进度条指示器是实现了ProgressBar来执行显示的。 调用setProgress()方法来使用进度条指示器开始于Android 4.0.在之前的版本,你必须创建自己的通知布局来包含ProgressBar视图。 接下来的部分介绍了如何使用setProgress()来在通知中显示进度条。 显示一个已知长度的进度条指示器(Displaying a fixed-duration progress indicator) 为了能够显示一个确定的进度条,通过调用setProgress() setProgress(max, progress, false)给你的通知加上进度条。然后发布通知。然后,随着操作的进度,增加进度值,然后更新通知。在操作结束的时候,进度值应该等于最大值。通常的方式是调用setProgress()来设置最大值为100,然后去增加进度完成的百分比。 你可以在操作完成的时候显示进度条,也可以移除掉它。在这样的情况下,记住要去更新通知的文本,显示操作已经完成了。调用setProgress() setProgress(0, 0, false)来移除进度条。看下面这个例子:
... mNotifyManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); mBuilder =newNotificationCompat.Builder(this); mBuilder.setContentTitle("Picture Download") .setContentText("Download in progress") .setSmallIcon(R.drawable.ic_notification); // 在后台线程开启一个耗时操作 newThread( newRunnable(){ @Override publicvoid run(){ int incr; // 完成一个操作20次 for(incr =0; incr <=100; incr+=5){ // 给进度条设置最大值, 当前的完成度,以及“确定”状态 mBuilder.setProgress(100, incr,false); // 第一次就显示进度条 mNotifyManager.notify(0, mBuilder.build()); // 睡眠这条线程,模拟耗时操作 try{ // 睡5秒 Thread.sleep(5*1000); }catch(InterruptedException e){ Log.d(TAG,"sleep failure"); } } // 当循环完成的时候更新这个进度条 mBuilder.setContentText("Download complete") // 删除进度条 .setProgress(0,0,false); mNotifyManager.notify(ID, mBuilder.build()); } } // 开始这个线程 ).start();效果显示在图6上。左边的截图上是通知正在执行这操作,右边的截图是通知已经完成了操作。
// 设置进度指示器的最大值,当前完成的百分比,以及“确定”状态 mBuilder.setProgress(100, incr,false); // 发布通知 mNotifyManager.notify(0, mBuilder.build()); 用下面的代码替换上面的代码: // 为不明确时长的操作添加一个活动指示器 mBuilder.setProgress(0,0,true); // 发布通知 mNotifyManager.notify(0, mBuilder.build());运行的结果如图7: