Notification一些基本用法 根据四个需求来
普通的查看 跳转页面
查看后返回某个固定页面的意图
我们自己的APP的通知 查看之后回到我们APP的首页 或者联系几页返回新建一个Task 用来查看 返回上一个最近任务栈
查看之后 回到之前正在进行的任务 效果上感觉这个和普通的没什么差别 这个就是新建一个task专门来处理查看通知的操作自定义View的Notification
notification对象的构建
低版本的就不说了 这里用Builder构造
//notification的管理类
notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
builder = new NotificationCompat.Builder(this);
builder.setContentInfo("info");
builder.setContentTitle("title");
builder.setContentText("下载进度");
builder.setSmallIcon(R.mipmap.collention);
//构建 发出通知
Notification notification = builder.build();
notificationManager.notify(0, notification);
1 普通的跳转 就是在构建notification对象的时候塞入一个Intent 这里叫PendingIntent 延迟意图
Intent resultIntent1 = new Intent(this, Main2Activity.class);
//这个用于下面的 在发送通知时判断是否存在 因为设置的是PendingIntent.FLAG_UPDATE_CURRENT
int requestCode1 = (int) SystemClock.uptimeMillis();
PendingIntent pendingIntent = PendingIntent.getActivity(this, requestCode1, resultIntent1, PendingIntent.FLAG_UPDATE_CURRENT);
changeIntent(pendingIntent);
- PendingIntent.FLAG_UPDATE_CURRENT**这个参数一般有四种选择分别是:
FLAG_CANCEL_CURRENT:如果构建的PendingIntent已经存在,则取消前一个,重新构建一个。 FLAG_NO_CREATE:如果前一个PendingIntent已经不存在了,将不再构建它。
FLAG_ONE_SHOT:表明这里构建的PendingIntent只能使用一次。
FLAG_UPDATE_CURRENT:如果构建的PendingIntent已经存在,那么 系统将不会重复创建,只是把之前不同的传值替换掉。(所以这里如果值不变 是不是有变化的 以致于会出现一些问题 通常做法就是在构建PendingIntent的时候传入不一样的requestCode来改变 更新PendingIntent 一般都是用这个)
使用代码如下 效果如图
Intent resultIntent1 = new Intent(this, Main4Activity.class);
int requestCode1 = (int) SystemClock.uptimeMillis();
PendingIntent pendingIntent = PendingIntent.getActivity(this, requestCode1, resultIntent1, PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(pendingIntent);
Notification notification = builder.build();
notificationManager.notify(0, notification);
发现 在当前页面查看通知后返回还是在当前页面 退出程序之后 在主菜单查看通知 返回的是主菜单
2 回退到固定的页面 这里做一些配置
清单文件的配置 指明parentActivity 和TaskStackBuilder
<activity
android:name=".Main2Activity"
android:excludeFromRecents="true"
android:launchMode="singleTask"
//指定当前Activity的返回的上一个页面
android:parentActivityName=".MainActivity"
android:taskAffinity="" >
//兼容低版本
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity" />
</activity>
//配置同上
<activity
android:name=".Main3Activity"
android:parentActivityName=".Main2Activity" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".Main2Activity" />
</activity>
Intent resultIntent = new Intent(this, Main3Activity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(Main3Activity.class);
stackBuilder.addNextIntent(resultIntent);
int requestCode = (int) SystemClock.uptimeMillis();
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(requestCode, PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(resultPendingIntent );
Notification notification = builder.build();
notificationManager.notify(0, notification);
效果图
只要查看通知 返回顺序都是 指定要其parentActivity的页面
3:新开任务栈 的方式
效果就不看了 看看如何配置吧
<activity
android:name=".Main2Activity"
//清除最近列表的记录
android:excludeFromRecents="true"
//新开任务栈 启动模式
android:launchMode="singleTask"
android:parentActivityName=".MainActivity"
//这个要写 不然会有问题 不然没效果 我不太清楚这个有什么用 后续在了解
android:taskAffinity="" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity" />
</activity>
Intent notifyIntent = new Intent(this, Main2Activity.class);
notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_CLEAR_TASK);
int requestCode2 = (int) SystemClock.uptimeMillis();
PendingIntent pendIntent = PendingIntent.getActivity(this, requestCode2,
notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(pendIntent );
Notification notification = builder.build();
notificationManager.notify(0, notification);
4 自定义通知界面
NotificationCompat.Builder builder1 = new NotificationCompat.Builder(this);
RemoteViews remoteView = new RemoteViews(getPackageName(),R.layout.remote);
remoteView.setTextViewText(R.id.text, "DaemonLiu");
remoteView.setImageViewResource(R.id.image, R.mipmap.collention);
builder1.setSmallIcon(R.mipmap.collention);
builder1.setContent(remoteView);
Intent resultIntent4 = new Intent(this, Main4Activity.class);
int requestCode4 = (int) SystemClock.uptimeMillis();
PendingIntent pendingIntent4 = PendingIntent.getActivity(this, requestCode4, resultIntent4, PendingIntent.FLAG_UPDATE_CURRENT);
remoteView.setOnClickPendingIntent(R.id.image,pendingIntent4);
builder.setContentIntent(pendingIntent4);
Notification notification = builder1.build();
notificationManager.notify(1, notification);
效果图 自定义通知页面 然后再image上面附加事件 点击后跳转
在关于进度条的设置 上面第一张图有进度条 代码如下
new Thread(new Runnable() {
@Override
public void run() {
int incr;
for (incr = 0; incr <= 100; incr += 5) {
// mBuilder.setProgress(100, incr, false);
builder.setProgress(100, incr, false);
builder.setContentText("下载进度"+incr+"%");
notificationManager.notify(0, builder.build());
try {
Thread.sleep(300);
} catch (InterruptedException e) {
}
}
builder.setContentText("Download complete").setProgress(0, 0,
false);
notificationManager.notify(0, builder.build());
}
}
// Starts the thread by calling the run() method in its Runnable
).start();
这里只是简单记录下notification的简单的使用 关于notification的更多详细介绍 4.0之后的 三种style形式等等 贴上一个地址 觉得写得挺详细的
http://blog.csdn.net/xy_nyle/article/details/19853591