效果图:
创建方法
首先要获取一个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)
- public Builder setDefaults(int defaults)
Notification.DEFAULT_ALL:铃声、闪光、震动均系统默认
Notification.DEFAULT_SOUND:系统默认铃声
Notification.DEFAULT_LIGHTS:系统默认闪光灯
Notification.DEFAULT_VIBRATE:系统默认震动
- public Builder setOngoing(boolean ongoing)
常见问题
有时候我们发送推送时,新的推送会覆盖旧的推送
原因是由于调用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 intentOne = new Intent(context, OneActivity.class);
- Intent intentTwo = new Intent(context, TwoActivity.class);
- Intent[] intents = new Intent[2];
- intents[0] = intentOne;
- intents[1] = intentTwo;
这里需要注意一个问题,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());
- }