控件 -- Notification

一、概念

Notification,是一种具有全局效果的通知,可以在系统的通知栏中显示。当App向系统发出通知时,它将先以图标的形式显示在通知栏中。用户可以下拉通知栏查看通知的详细信息。通知栏和抽屉式通知栏均是由系统控制,用户可以随时查看。

二、使用

Notification的基本操作主要有创建、更新、取消这三种。
一个 Notification的必要属性有三项,如果不设置则在运行时会抛出异常:
小图标,通过 setSmallIcon() 方法设置;
标题,通过 setContentTitle() 方法设置;
内容,通过 setContentText() 方法设置。
除了以上三项,其它均为可选项。可以给 Notification设置一个 Action ,这样就可以直接跳转到App的某个Activity、启动一个 Service或者发送一个Broadcast。当系统接收到通知时,可以通过震动、响铃、呼吸灯等多种方式进行提醒。

1.创建Notification

import android.support.v4.app.NotificationCompat;
private void testNotification() {
    Intent intent = new Intent(this, MainActivity.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    //获取NotificationManager实例
    NotificationManager notifyManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    //实例化NotificationCompat.Builde并设置相关属性
    NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
            //设置小图标
            .setSmallIcon(R.mipmap.ic_launcher)
            //设置通知标题
            .setContentTitle("最简单的Notification")
            //设置通知内容
            .setContentText("只有小图标、标题、内容")
            //设置pendingIntent
            .setContentIntent(pendingIntent)
            //点击通知后自动清除
            .setAutoCancel(true);
    //通过builder.build()方法生成Notification对象,并发送通知,id=1
    notifyManager.notify(1, builder.build());
}

2.更新Notification

更新通知只需要再次发送相同ID的通知即可,如果之前的通知还未被取消,则会直接更新该通知相关的属性,如果之前的通知已经被取消,则会重新创建一个新通知。

3.取消Notification

取消通知有以下几种方式:
1.点击通知栏的清除按钮,会清除所有可清除的通知;
2.设置了setAutoCancel()或FLAG_AUTO_CANCEL的通知,点击该通知时会清除它;
3.通过NotificationManager调用cancel(int id)方法清除指定ID的通知;
4.通过NotificationManager调用cancel(String tag, int id)方法清除指定TAG和ID的通知;
5.通过NotificationManager调用cancelAll()方法清除所有该应用之前发送的通知。

如果是通过NotificationManager.notify(String tag, int id, Notification notify)方法创建的通知,那么只能通过NotificationManager.cancel(String tag, int id)方法才能清除对应的通知,调用NotificationManager.cancel(int id) 无效。

4.设置Notification的通知效果

Notification有震动、响铃、呼吸灯三种通知效果,可以通过setDefaults(int defualts)方法来设置。Default属性有以下四种,一旦设置了Default效果,自定义的效果就会失效。
默认通知效果:

//<uses-permission android:name="android.permission.VIBRATE" />
Notification.DEFAULT_VIBRATE

//添加系统默认声音效果,设置此值后,调用setSound()设置自定义声音无效
Notification.DEFAULT_SOUND

//添加默认呼吸灯效果,使用时须与Notification.FLAG_SHOW_LIGHTS结合使用,否则无效
Notification.DEFAULT_LIGHTS

//添加上述三种默认提醒效果
Notification.DEFAULT_ALL

常用通知效果:

//三色灯提醒,在使用三色灯提醒时候必须加该标志符
Notification.FLAG_SHOW_LIGHTS

//发起正在运行事件(活动中)
Notification.FLAG_ONGOING_EVENT

//让声音、振动无限循环,直到用户响应(取消或者打开)
Notification.FLAG_INSISTENT

//发起Notification后,铃声和震动均只执行一次
Notification.FLAG_ONLY_ALERT_ONCE

//用户单击通知后自动消失
Notification.FLAG_AUTO_CANCEL

//只有调用NotificationManager.cancel()时才会清除
Notification.FLAG_NO_CLEAR

//表示正在运行的服务
Notification.FLAG_FOREGROUND_SERVICE

设置方法:

NotificationCompat.Builder#setDefaults
NotificationCompat.Builder#setSound
NotificationCompat.Builder#setVibrate
NotificationCompat.Builder#setLights

notification.defaults
notification.sound
notification.vibrate
notification.ledARGB
notification.ledOnMS
notification.ledOffMS
notification.flags

三、适配Android 8.0通知

  1. AndroidManifest.xml

    <receiver android:name=".TestBroadcastReceiver">
        <intent-filter>
            <action android:name="com.tomorrow.intent.action.test"/>
        </intent-filter>
    </receiver>
    
  2. strings.xml

    <string name="one_notification">OneNotification</string>
    <string name="two_notification">TwoNotification</string>
    <string name="three_notification">ThreeNotification</string>
    
  3. NotificationChannelController

    public class NotificationChannelController {
        public static final String CHANNEL_ID_ONE_NOTIFICATION = "CHANNEL_ID_ONE_NOTIFICATION";
        public static final String CHANNEL_ID_TWO_NOTIFICATION = "CHANNEL_ID_TWO_NOTIFICATION";
        public static final String CHANNEL_ID_THREE_NOTIFICATION = "CHANNEL_ID_THREE_NOTIFICATION";
    
        @RequiresApi(api = Build.VERSION_CODES.O)
        private enum Channel {
            ONE_NOTIFICATION(CHANNEL_ID_ONE_NOTIFICATION, R.string.one_notification, NotificationManager.IMPORTANCE_LOW, true),
            TWO_NOTIFICATION(CHANNEL_ID_TWO_NOTIFICATION, R.string.two_notification, NotificationManager.IMPORTANCE_DEFAULT, false),
            THREE_NOTIFICATION(CHANNEL_ID_THREE_NOTIFICATION, R.string.three_notification, NotificationManager.IMPORTANCE_HIGH, true);
    
            private final String id;
            private final int nameResId;
            private final int importance;
            private final boolean showBadge;
    
            Channel(String id, @StringRes int nameResId, int importance, boolean showBadge) {
                this.id = id;
                this.nameResId = nameResId;
                this.importance = importance;
                this.showBadge = showBadge;
            }
    
            public String getId() {
                return id;
            }
    
            public int getNameResId() {
                return nameResId;
            }
    
            public int getImportance() {
                return importance;
            }
    
            public boolean canShowBadge() {
                return showBadge;
            }
        }
    
        public static void createChannels(Context context) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                final NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
                List<NotificationChannel> channelList = new ArrayList<>();
                for (Channel channel : Channel.values()) {
                    NotificationChannel notificationChannel = new NotificationChannel(channel.getId(), context.getString(channel.getNameResId()), channel.getImportance());
                    notificationChannel.setShowBadge(channel.canShowBadge());
                    channelList.add(notificationChannel);
                }
                if (notificationManager != null) {
                    notificationManager.createNotificationChannels(channelList);
                }
            }
        }
    }
    
  4. MainActivity

    import android.app.PendingIntent;
    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.os.Bundle;
    import android.support.v4.app.NotificationCompat;
    import android.support.v4.app.NotificationManagerCompat;
    import android.support.v7.app.AppCompatActivity;
    import android.util.Log;
    
    public class MainActivity extends AppCompatActivity {
        private static final String TAG = MainActivity.class.getSimpleName();
        private TestBroadcastReceiver mReceiver;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Log.d(TAG, "zwm, onCreate");
    
            //适配Android 8.0, 创建通知渠道
            NotificationChannelController.createChannels(getApplicationContext());
            Intent intent = new Intent("com.tomorrow.intent.action.test");
            intent.setPackage(getPackageName());
            PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
            Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
            NotificationCompat.Builder builder = new NotificationCompat.Builder(this, NotificationChannelController.CHANNEL_ID_THREE_NOTIFICATION);
            builder.setShowWhen(true)
                    .setContentTitle("notification title")
                    .setContentText("notification content")
                    .setLargeIcon(bitmap)
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setStyle(new NotificationCompat.BigTextStyle().bigText("BigTextStyle content"))
                    .setContentIntent(pendingIntent)
                    .setAutoCancel(true);
            NotificationManagerCompat.from(this).notify(99, builder.build());
        }
    }
    
  5. TestBroadcastReceiver

    public class TestBroadcastReceiver extends BroadcastReceiver {
        private static final String TAG = "TestBroadcastReceiver";
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d(TAG, "zwm, onReceive, action: " + intent.getAction());
        }
    }
    
  6. 打印日志

    2020-03-26 13:26:30.397 20445-20445/com.tomorrow.architetest D/MainActivity: zwm, onCreate
    2020-03-26 13:26:50.909 20445-20445/com.tomorrow.architetest D/TestBroadcastReceiver: zwm, onReceive, action: com.tomorrow.intent.action.test
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容