Android 使用Notification创建推送通知

效果图:



创建方法

首先要获取一个NotificationManager管理对象

[java]  view plain  copy
  1. NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);  

NotificationManager 是一个系统 Service,所以需要通过 getSystemService() 方法来获取

传入的Context.NOTIFICATION_SERVICE代表状态栏服务


再来获取一个具体的状态栏通知对象Notification,设置图片,文字、提示声音、震动参数等

[java]  view plain  copy
  1. Notification.Builder builder = new Notification.Builder(context);  

常用方法


[java]  view plain  copy
  1. public Builder setSmallIcon(@DrawableRes int icon)  
设置顶部状态栏(未被下拉)中的小图标

在有些机子上显示的小图标只显示了一部分,并不会自适应大小,可以把图片的大小改成32*32的小图标,并放在hdpi文件夹下


[java]  view plain  copy
  1. public Builder setTicker(CharSequence tickerText)  
设置状态栏(未被下拉)的提示文字


[java]  view plain  copy
  1. public Builder setWhen(long when)  

设置通知面板中显示的时间,通常传一个系统当前的时间戳进去


[java]  view plain  copy
  1. public Builder setLargeIcon(Bitmap b)  
设置通知面板左边的大图标


[java]  view plain  copy
  1. public Builder setContentTitle(CharSequence title)  
设置通知面板中第一栏标题的显示文本


[java]  view plain  copy
  1. public Builder setContentText(CharSequence text)  
设置通知面板中第二栏内容的显示文本


[java]  view plain  copy
  1. public Builder setAutoCancel(boolean autoCancel)  
设置为true时,用户点击后关闭,为false时点击不关闭,默认为false


[java]  view plain  copy
  1. public Builder setDefaults(int defaults)  
设置系统默认的显示参数,在Notification中,默认的系统样式已经定义成参量类型了,我们只要使用就好

Notification.DEFAULT_ALL:铃声、闪光、震动均系统默认

Notification.DEFAULT_SOUND:系统默认铃声

Notification.DEFAULT_LIGHTS:系统默认闪光灯

Notification.DEFAULT_VIBRATE:系统默认震动


[java]  view plain  copy
  1. public Builder setOngoing(boolean ongoing)  
设置是否需要把Notification放置在“正在运行”的栏目

常见问题

有时候我们发送推送时,新的推送会覆盖旧的推送

原因是由于调用NotificationManger.notify()方法时,id都是同一个导致的

[java]  view plain  copy
  1. public void notify(int id, Notification notification)  

解决方法,要让每次调用的id都不相同,可以使用Notification对象的hashCode()值作为id参数,也可以换其它的,只要让每次发送的id不同就行

具体实现代码

[java]  view plain  copy
  1. /** 
  2.  * NotificationDemo页面 
  3.  * Created by zhuwentao on 2016-08-12. 
  4.  */  
  5. public class NotificationActivity extends AppCompatActivity {  
  6.   
  7.     /** 发送通知 */  
  8.     private Button mSendBtn;  
  9.   
  10.     @Override  
  11.     protected void onCreate(@Nullable Bundle savedInstanceState) {  
  12.         super.onCreate(savedInstanceState);  
  13.         setContentView(R.layout.notification_main);  
  14.         mSendBtn = (Button) findViewById(R.id.btn_notification_send);  
  15.   
  16.         mSendBtn.setOnClickListener(new View.OnClickListener() {  
  17.             @Override  
  18.             public void onClick(View v) {  
  19.                 sendNotification();  
  20.             }  
  21.         });  
  22.     }  
  23.   
  24.     /** 
  25.      * 发送通知 
  26.      */  
  27.     public void sendNotification() {  
  28.         NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);  
  29.         Notification.Builder builder = new Notification.Builder(this);  
  30.         builder.setSmallIcon(R.mipmap.ic_launcher); // 这里使用的系统默认图标,可自行更换  
  31.         builder.setTicker("您有一条新消息!");  
  32.         builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher));  
  33.         builder.setContentTitle("这是第一行标题栏");  
  34.         builder.setContentText("这里是第二行,用来显示主要内容");  
  35.         builder.setAutoCancel(true);  
  36.           
  37.         // 点击后要执行的操作,打开MainActivity  
  38.         Intent intent = new Intent(this, MainActivity.class);  
  39.         PendingIntent pendingIntents = PendingIntent.getActivity(this0, intent, PendingIntent.FLAG_ONE_SHOT);  
  40.         builder.setContentIntent(pendingIntents);  
  41.           
  42.         // 启动Notification,getNotification()方法已经过时了,不推荐使用,使用build()方法替代  
  43.         notificationManager.notify(1, builder.build());  
  44.     }  
  45.   
  46. }  

使用PendingIntent如何启动多个Intent意图

一般我们只需要启动一个意图就好,使用PendingIntent.getActivity()方法是没问题的

但有时需求要我们启动一个Activity后,按返回键回到首页

这个时候就可以使用PendingIntent方法里面的getActivities()方法

[java]  view plain  copy
  1. public static PendingIntent getActivities(Context context, int requestCode,  
  2.         @NonNull Intent[] intents, @Flags int flags)  
里面可以传入一个Intent数组

例如:

[java]  view plain  copy
  1. Intent intentOne = new Intent(context, OneActivity.class);  
  2. Intent intentTwo = new Intent(context, TwoActivity.class);  
  3. Intent[] intents = new Intent[2];  
  4. intents[0] = intentOne;  
  5. intents[1] = intentTwo;  
在intents数组中的最后一个界面将会成为第一个被启动的界面,也就上例中intentTwo会成为点击后第一个启动的界面,在intentTwo界面按返回键再到intentOne界面

这里需要注意一个问题,Activity的启动模式问题

如果当前App是处在打开的状态,这时用户接到通知并点击,启动了新的页面,再按返回键就会出问题了,会出现重复加载之前页面

更改一下Intent的启动模式可以解决这样的问题,通过setFlags设置所有的Intent的启动模式为:

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

例如:

[java]  view plain  copy
  1. /** 
  2. * 发送通知 
  3. */  
  4. public void sendNotification() {  
  5.     NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE );  
  6.     Notification.Builder builder = new Notification.Builder( this);  
  7.     builder.setSmallIcon(R.mipmap. ic_launcher); // 这里使用的系统默认图标,可自行更换  
  8.     builder.setTicker("您有一条新消息!");  
  9.     builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap. ic_launcher));  
  10.     builder.setContentTitle("这是第一行标题栏");  
  11.     builder.setContentText("这里是第二行,用来显示主要内容");  
  12.     builder.setAutoCancel(true );  
  13.   
  14.     // 点击后要执行的操作,启动多个意图  
  15.     Intent intentOne = new Intent(this, OneActivity.class);  
  16.     intentOne.setFlags(Intent. FLAG_ACTIVITY_CLEAR_TOP);  
  17.     Intent intentTwo = new Intent(this, TwoActivity.class);  
  18.     intentTwo.setFlags(Intent. FLAG_ACTIVITY_CLEAR_TOP);  
  19.     Intent[] intents = new Intent[2];  
  20.     intents[0] = intentOne;  
  21.     intents[1] = intentTwo;  
  22.   
  23.     PendingIntent pendingIntents = PendingIntent.getActivities(this0, intents, PendingIntent.FLAG_ONE_SHOT);  
  24.     builder.setContentIntent(pendingIntents);  
  25.   
  26.     // 启动 Notification  
  27.     notificationManager.notify(1, builder.getNotification());  
  28. }  

猜你喜欢

转载自blog.csdn.net/huangliniqng/article/details/80732894