1. 程式人生 > >Android8.0系統通知欄的適配

Android8.0系統通知欄的適配

Android8.0系統通知欄的每條通知都有一個對應的渠道,使用者可以選擇是否要關閉哪個渠道的通知。下面這張圖就有兩個通知渠道,由使用者自由選擇是否關閉哪一條渠道的通知,就能避免一些垃圾推送訊息的打擾。

如果將專案中的SDK版本指定到了26或者更高,還不進行通知欄的適配,那麼就會報錯或無法將通知顯示出來。

在這裡插入圖片描述 建立一個通知渠道要有ID、名稱和等級這三個引數

有四個等級,由高到低: IMPORTANCE_HIGH: 會彈出,有提示音,狀態列有顯示 IMPORTANCE_DEFAULT:不會彈出,有提示音,狀態列有顯示 IMPORTANCE_LOW :不會彈出,無提示音,狀態列有顯示 IMPORTANCE_MIN :不會彈出,無提示音,狀態列無顯示

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button btn_sms_notify;
    //渠道ID
    private static final String channel_Id_sms = "sms";
    private static final String channel_Id_express = "express";
    //渠道名稱
    private static final String channel_Name_sms = "簡訊訊息";
    private static final String channel_Name_express = "快遞訊息";
    //渠道等級
    private static final int importance_sms = NotificationManager.IMPORTANCE_HIGH;
    private static final int importance_express = NotificationManager.IMPORTANCE_DEFAULT;
   
    private Button btn_express_notify;
    private NotificationManager express_notificationManager;
    private NotificationManager sms_notificationManager;
    private NotificationManager manager;
    private NotificationChannel channel;
    private Notification express_notification;
    private android.app.Notification sms_notification;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //判斷SDK版本
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            /*呼叫createNotificationChannel()方法,傳入id,名字,等級引數*/
            createNotificationChannel(channel_Id_sms, channel_Name_sms, importance_sms);
            createNotificationChannel(channel_Id_express, channel_Name_express, importance_express);
        }
        initView();//檢視初始化
    }

    /*建立一個通知渠道需要渠道ID、名稱以及等級這三個引數*/
    @RequiresApi(api = Build.VERSION_CODES.O)
    private void createNotificationChannel(String channel_id, String channel_name, int importance) {
        channel = new NotificationChannel(channel_id, channel_name, importance);
        manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        manager.createNotificationChannel(channel);
    }

    private void initView() {
        btn_sms_notify = findViewById(R.id.btn_sms_notify);
        btn_sms_notify.setOnClickListener(this);
        btn_express_notify = findViewById(R.id.btn_express_notify);
        btn_express_notify.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_sms_notify:
                //要跳轉的意圖
                Intent intent = new Intent(this, com.example.lin.notificationmanager.Notification.class);
                PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);
                
                sms_notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
                //構建通知物件需傳入上下文和通知渠道ID
                sms_notification = new NotificationCompat.Builder(this, "sms")
                        //標題
                        .setContentTitle("簡訊資訊")
                        //內容
                        .setContentText("有一條新簡訊。")
                        //自動取消
                        .setAutoCancel(true)
                        //小圖示
                        .setSmallIcon(R.mipmap.ic_launcher)
                        //系統時間
                        .setWhen(System.currentTimeMillis())
                        //大圖示
                        .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
                        //要跳轉的意圖
                        .setContentIntent(pi)
                        //處於鎖屏狀態時LED燈一閃一暗
                        .setLights(Color.GREEN, 1000, 1000)
                        //震動200Ms
                        .setVibrate(new long[]{0, 200})
                        //設定橫幅通知欄,需開啟通知橫幅提醒許可權
                        .setPriority(NotificationCompat.PRIORITY_MAX)
                       /* 顯示很長的文字
                        .setStyle(new NotificationCompat.BigTextStyle().bigText())*/
                        .build();
                //傳送通知
                sms_notificationManager.notify(1, sms_notification);
                break;
            case R.id.btn_express_notify:
                express_notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
                express_notification = new NotificationCompat.Builder(this, "express")
                        .setContentTitle("快遞資訊")
                        .setContentText("快遞到了,快去取吧。")
                        .setSmallIcon(R.mipmap.ic_launcher)
                        .build();
                express_notificationManager.notify(2, express_notification);
                break;
        }
    }
}