NotificationChannel是android8.0新增的特性,如果App的targetSDKVersion>=26,没有设置channel通知渠道的话,就会导致通知无法展示。
一、使用步骤
1、得到NotificationManager
NotificationManager manager = ( NotificationManager) getSystemService ( Context. NOTIFICATION_SERVICE) ;
2、创建通知渠道NotificationChannel
NotificationChannel channel = new NotificationChannel ( String id, CharSequence name, int importance) ;
manager. createNotificationChannel ( channel) ;
重要等级 数值 说明 NotificationManager.IMPORTANCE_NONE 0 通知栏不显示,状态栏没有提示。是通知栏管理设置为关闭时的状态 NotificationManager.IMPORTANCE_MIN 1 通知栏被折叠显示,状态栏没有提示 NotificationManager.IMPORTANCE_LOW 2 通知栏正常显示,状态栏可能提示 NotificationManager.IMPORTANCE_DEFAULT 3 通知栏正常显示,状态栏正常提示 NotificationManager.IMPORTANCE_HIGH 4 通知栏正常显示,状态栏正常提示,屏幕上方有提示 NotificationManager.IMPORTANCE_MAX 5 源码注释:Unused,没用。最大等级,测试效果上与IMPORTANCE_HIGH完全一致
3、发布通知
Notification notification = new NotificationCompat. Builder ( Context context, String channelId)
. setContentTitle ( "This is content title" )
. setContentText ( "This is content text" )
. setSubText ( "This is sub text" )
. setWhen ( System. currentTimeMillis ( ) )
. setContentIntent ( pendingIntent)
. setSmallIcon ( R. drawable. ic_launcher_background)
. setLargeIcon ( BitmapFactory. decodeResource ( getResources ( ) ,
R. drawable. ic_launcher_foreground) )
. build ( ) ;
manager. notify ( 1 , notification) ;
常用方法 说明 setContentTitle(CharSequence title) 设置标题 setContentText(CharSequence text) 设置内容 setSubText(CharSequence text) 设置app name右边的文字 setWhen(long when) 设置通知时间,一般设置的是收到通知时的System.currentTimeMillis() setSmallIcon(int icon) 设置在接收到通知的时候顶部显示的小图标 setLargeIcon(Bitmap icon) 设置左边的大图标 setContentIntent(PendingIntent intent) 设置点击notification后跳转 setAutoCancel(boolean autoCancel) 用户点击Notification点击面板后是否让通知取消(默认不取消)
详解PendingIntent
PendingIntent从名字上看起来就和Intent有些类似,它们之间也确实存在着不少共同点。比如它们都可以去指明某一个“意图”,都可以用于启动活动、启动服务以及发送广播等。不同的是,Intent更加倾向于去立即执行某个动作,而PendingIntent更加倾向于在某个合适的时机去执行某个动作。所以,也可以把PendingIntent简单地理解为延迟执行的Intent。 主要提供了三个静态方法用于获取PendingIntent的实例:getActivity()方法、getBroadcast()方法和getService()方法。
PendingIntent. getActivity ( Context context, int requestCode, Intent intent, int flags)
PendingIntent的行为 理解 FLAG_ONE_SHOT PendingIntent只能被使用一次,多次创建PendingIntent也只能使用第一次创建的。也就是不调用NotificationManager的cancel()方法取消通知,back后再点击通知也进不去,因为只能点一次 FLAG_NO_CREATE PendingIntent没有作用,对消息而言没有点击效果。说白了,就是点了没反应。 FLAG_CANCEL_CURRENT 当定义了一个PendingIntent后,再次定义一个PendingIntent,对相同的requestCode而言则会将第一个PendingIntent cancle掉,重新创建一个新的PendingIntent,原先的PendingIntent失去作用,这样则只有最新的PendingIntent有效 FLAG_UPDATE_CURRENT 如果对requestCode相同的则会都更新为最新的PendingIntent的Intent的Extra
二、简例
public class MainActivity extends AppCompatActivity {
private Button button;
@Override
protected void onCreate ( Bundle savedInstanceState) {
super . onCreate ( savedInstanceState) ;
setContentView ( R. layout. activity_main) ;
button = findViewById ( R. id. send_notification) ;
button. setOnClickListener ( new View. OnClickListener ( ) {
@Override
public void onClick ( View v) {
NotificationManager manager =
( NotificationManager) getSystemService ( Context. NOTIFICATION_SERVICE) ;
NotificationChannel channel = new NotificationChannel
( "test" , "notification test" , NotificationManager. IMPORTANCE_DEFAULT) ;
manager. createNotificationChannel ( channel) ;
Intent intent = new Intent ( MainActivity. this , NotificationActivity. class ) ;
PendingIntent pendingIntent = PendingIntent. getActivity ( MainActivity. this , 0 , intent, PendingIntent. FLAG_UPDATE_CURRENT) ;
Notification notification = new NotificationCompat. Builder ( MainActivity. this , "test" )
. setContentTitle ( "This is content title" )
. setContentText ( "This is content text" )
. setSubText ( "This is sub text" )
. setWhen ( System. currentTimeMillis ( ) )
. setAutoCancel ( true )
. setSmallIcon ( R. drawable. ic_launcher_background)
. setContentIntent ( pendingIntent)
. setLargeIcon ( BitmapFactory. decodeResource ( getResources ( ) ,
R. drawable. ic_launcher_foreground) )
. build ( ) ;
manager. notify ( 1 , notification) ;
}
} ) ;
}
}