Android 使用Notification创建推送通知
来源:互联网 发布:鞋子淘宝试用报告范文 编辑:程序博客网 时间:2024/04/30 19:09
效果图:
创建方法
首先要获取一个NotificationManager管理对象
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
NotificationManager 是一个系统 Service,所以需要通过 getSystemService() 方法来获取
传入的Context.NOTIFICATION_SERVICE代表状态栏服务
再来获取一个具体的状态栏通知对象Notification,设置图片,文字、提示声音、震动参数等
Notification.Builder builder = new Notification.Builder(context);
常用方法
public Builder setSmallIcon(@DrawableRes int icon)设置顶部状态栏(未被下拉)中的小图标
在有些机子上显示的小图标只显示了一部分,并不会自适应大小,可以把图片的大小改成32*32的小图标,并放在hdpi文件夹下
public Builder setTicker(CharSequence tickerText)设置状态栏(未被下拉)的提示文字
public Builder setWhen(long when)
设置通知面板中显示的时间,通常传一个系统当前的时间戳进去
public Builder setLargeIcon(Bitmap b)设置通知面板左边的大图标
public Builder setContentTitle(CharSequence title)设置通知面板中第一栏标题的显示文本
public Builder setContentText(CharSequence text)设置通知面板中第二栏内容的显示文本
public Builder setAutoCancel(boolean autoCancel)设置为true时,用户点击后关闭,为false时点击不关闭,默认为false
public Builder setDefaults(int defaults)设置系统默认的显示参数,在Notification中,默认的系统样式已经定义成参量类型了,我们只要使用就好
Notification.DEFAULT_ALL:铃声、闪光、震动均系统默认
Notification.DEFAULT_SOUND:系统默认铃声
Notification.DEFAULT_LIGHTS:系统默认闪光灯
Notification.DEFAULT_VIBRATE:系统默认震动
public Builder setOngoing(boolean ongoing)设置是否需要把Notification放置在“正在运行”的栏目
常见问题
有时候我们发送推送时,新的推送会覆盖旧的推送
原因是由于调用NotificationManger.notify()方法时,id都是同一个导致的
public void notify(int id, Notification notification)
解决方法,要让每次调用的id都不相同,可以使用Notification对象的hashCode()值作为id参数,也可以换其它的,只要让每次发送的id不同就行
具体实现代码
/** * NotificationDemo页面 * Created by zhuwentao on 2016-08-12. */public class NotificationActivity extends AppCompatActivity { /** 发送通知 */ private Button mSendBtn; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.notification_main); mSendBtn = (Button) findViewById(R.id.btn_notification_send); mSendBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { sendNotification(); } }); } /** * 发送通知 */ public void sendNotification() { NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); Notification.Builder builder = new Notification.Builder(this); builder.setSmallIcon(R.mipmap.ic_launcher); // 这里使用的系统默认图标,可自行更换 builder.setTicker("您有一条新消息!"); builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher)); builder.setContentTitle("这是第一行标题栏"); builder.setContentText("这里是第二行,用来显示主要内容"); builder.setAutoCancel(true); // 点击后要执行的操作,打开MainActivity Intent intent = new Intent(this, MainActivity.class); PendingIntent pendingIntents = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT); builder.setContentIntent(pendingIntents); // 启动Notification,getNotification()方法已经过时了,不推荐使用,使用build()方法替代 notificationManager.notify(1, builder.build()); }}
使用PendingIntent如何启动多个Intent意图
一般我们只需要启动一个意图就好,使用PendingIntent.getActivity()方法是没问题的
但有时需求要我们启动一个Activity后,按返回键回到首页
这个时候就可以使用PendingIntent方法里面的getActivities()方法
public static PendingIntent getActivities(Context context, int requestCode, @NonNull Intent[] intents, @Flags int flags)里面可以传入一个Intent数组
例如:
Intent intentOne = new Intent(context, OneActivity.class);Intent intentTwo = new Intent(context, TwoActivity.class);Intent[] intents = new Intent[2];intents[0] = intentOne;intents[1] = intentTwo;在intents数组中的最后一个界面将会成为第一个被启动的界面,也就上例中intentTwo会成为点击后第一个启动的界面,在intentTwo界面按返回键再到intentOne界面
这里需要注意一个问题,Activity的启动模式问题
如果当前App是处在打开的状态,这时用户接到通知并点击,启动了新的页面,再按返回键就会出问题了,会出现重复加载之前页面
更改一下Intent的启动模式可以解决这样的问题,通过setFlags设置所有的Intent的启动模式为:
例如:
/*** 发送通知*/public void sendNotification() { NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE ); Notification.Builder builder = new Notification.Builder( this); builder.setSmallIcon(R.mipmap. ic_launcher); // 这里使用的系统默认图标,可自行更换 builder.setTicker("您有一条新消息!"); builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap. ic_launcher)); builder.setContentTitle("这是第一行标题栏"); builder.setContentText("这里是第二行,用来显示主要内容"); builder.setAutoCancel(true ); // 点击后要执行的操作,启动多个意图 Intent intentOne = new Intent(this, OneActivity.class); intentOne.setFlags(Intent. FLAG_ACTIVITY_CLEAR_TOP); Intent intentTwo = new Intent(this, TwoActivity.class); intentTwo.setFlags(Intent. FLAG_ACTIVITY_CLEAR_TOP); Intent[] intents = new Intent[2]; intents[0] = intentOne; intents[1] = intentTwo; PendingIntent pendingIntents = PendingIntent.getActivities(this, 0, intents, PendingIntent.FLAG_ONE_SHOT); builder.setContentIntent(pendingIntents); // 启动 Notification notificationManager.notify(1, builder.getNotification());}
- Android 使用Notification创建推送通知
- android整合--notification推送通知
- android整合--notification推送通知
- Android-Notification推送栏通知
- Android 使用Notification(通知)
- android Notification通知使用
- Android实现推送PushService通知Notification
- Android学习笔记(32):通知推送Notification
- Android实现推送PushService通知Notification
- android 创建通知栏Notification
- android服务- Notification创建通知 - startForeground 使用前台服务
- Android创建通知栏Notification(使用新API)
- Android 状态栏通知Notification的创建与使用
- 推送通知 Push Notification
- android通知(Notification)的使用
- android Notification(通知) 的使用
- Android 通知 Notification 使用详情
- Android通知Notification的使用
- 数据结构实验之栈八:栈的基本操作
- argument,callee,caller含义
- ContentProvider和ContentResolver的使用
- 07.函数
- 设置CURL头信息
- Android 使用Notification创建推送通知
- 最长公共子序列知识点
- hdoj5024【BFS/暴力】
- bnu10791DOTA选人
- 记录错误16.8.12 android receiver dialog
- [ Android Studio ]关于编译报错 缓存 问题
- 原始数据的分析
- 运维自动化需要的讨论
- 解决微信浏览器无法使用reload()刷新页面