【Android基础】Notification


NotificationChannel是android8.0新增的特性,如果App的targetSDKVersion>=26,没有设置channel通知渠道的话,就会导致通知无法展示。

一、使用步骤

1、得到NotificationManager

//需要一个NotificationManager来对通知进行管理
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

2、创建通知渠道NotificationChannel

//参数一:渠道ID。要保证全局唯一性
//参数二:渠道名称。展示给用户看的,需要能够表达清楚这个渠道用途
//参数三:重要等级。重要等级不同决定通知的不同行为
NotificationChannel channel = new NotificationChannel(String id, CharSequence name, int importance);
manager.createNotificationChannel(channel);
重要等级数值说明
NotificationManager.IMPORTANCE_NONE0通知栏不显示,状态栏没有提示。是通知栏管理设置为关闭时的状态
NotificationManager.IMPORTANCE_MIN1通知栏被折叠显示,状态栏没有提示
NotificationManager.IMPORTANCE_LOW2通知栏正常显示,状态栏可能提示
NotificationManager.IMPORTANCE_DEFAULT3通知栏正常显示,状态栏正常提示
NotificationManager.IMPORTANCE_HIGH4通知栏正常显示,状态栏正常提示,屏幕上方有提示
NotificationManager.IMPORTANCE_MAX5源码注释: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()方法。

//参数一:Context对象
//参数二:一般用不到,通常都是传入0即可
//参数三:Intent对象
//参数四:用于确定PendingIntent的行为。有FLAG_ONE_SHOT、FLAG_NO_CREATE、FLAG_CANCEL_CURRENT和FLAG_UPDATE_CURRENT
PendingIntent.getActivity(Context context, int requestCode, Intent intent, int flags)
PendingIntent的行为理解
FLAG_ONE_SHOTPendingIntent只能被使用一次,多次创建PendingIntent也只能使用第一次创建的。也就是不调用NotificationManager的cancel()方法取消通知,back后再点击通知也进不去,因为只能点一次
FLAG_NO_CREATEPendingIntent没有作用,对消息而言没有点击效果。说白了,就是点了没反应。
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);
            }
        });

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值