Android 8 通知渠道(Notification Channels)

maweiliang發表於2018-07-04

前一段時間看了一下android 8中的一些新特性,在組內分享了一下,想寫下來分享一下。 android 8 之前通知是無法進行分類的,這樣使用者就無法對自己感興趣和不感興趣的通知進行分類處理,導致使用者使用某些應用的時候,對一些推薦推銷的通知深受折磨。為了進一步優化管理通知,Google在釋出android 8 時對通知做了修改優化,出現了通知渠道功能。

什麼是通知渠道(Notification Channels)

這裡嘗試給通知渠道簡單下一個定義,每一個通知都屬於一個通知渠道,開發者可以在APP中自由建立多個渠道,需要注意的時,通知渠道一旦建立就無法修改。

建立通知渠道

應用程式中建立通知渠道(Notification Channel)的步驟:

1.通過構造方法NotificationChannel(channelId, channelName, importance)建立一個NotificationChannel物件

2.通過createNotificationChannel ( )來註冊NotificationChannel一個物件

NotificationManager notificationManager =
        (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
String channelId = "some_channel_id";
CharSequence channelName = "Some Channel";
int importance = NotificationManager.IMPORTANCE_LOW;
NotificationChannel notificationChannel = new NotificationChannel(channelId, channelName, importance);
notificationChannel.enableLights(true);
notificationChannel.setLightColor(Color.RED);
notificationChannel.enableVibration(true);
notificationChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
notificationManager.createNotificationChannel(notificationChannel);
複製程式碼

建立通知渠道需要三個引數

  • channelId 通知渠道的ID 可以是任意的字串,全域性唯一就可以
  • channelName 通知渠道的名稱,這個是使用者可見的,開發者需要認真規劃的命名
  • importance 通知渠道的重要等級,有一下幾個等級,不過這個使用者都是可以手動修改的
    通知等級
    其次我們可以通過使用通知渠道提供給我們的一些公共方法來操縱該通知渠道:
  • getId()—檢索給定通道的ID
  • enablellights() -如果使用中的裝置支援通知燈,則說明此通知通道是否應顯示燈
  • setLightColor() -如果我們確定通道支援通知燈,則允許使用傳遞一個int值,該值定義通知燈使用的顏色
  • enablementVisuration()—在裝置上顯示時,說明來自此通道的通知是否應振動
  • getImportance()—檢索給定通知通道的重要性值
  • setSound()—提供一個Uri,用於在通知釋出到此頻道時播放聲音
  • getSound()—檢索分配給此通知的聲音
  • setGroup()—設定通知分配到的組
  • getGroup()—檢索通知分配到的組
  • setBypassDnd()—設定通知是否應繞過“請勿打擾”模式(中斷_篩選器_優先順序值)
  • canBypassDnd() -檢索通知是否可以繞過“請勿打擾”模式
  • getName()—檢索指定頻道的使用者可見名稱
  • setLockScreenVisibility() -設定是否應在鎖定螢幕上顯示來自此通道的通知
  • getlockscreendisibility() -檢索來自此通道的通知是否將顯示在鎖定螢幕上
  • getAudioAttributes()—檢索已分配給相應通知通道的聲音的音訊屬性
  • canShowBadge()—檢索來自此通道的通知是否能夠在啟動器應用程式中顯示為徽章 下面我們寫個demo,建立兩個通知渠道,升級和私信。
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            String channelId = "upgrade";
            String channelName = "升級";
            int importance = NotificationManager.IMPORTANCE_HIGH;
            createNotificationChannel(channelId, channelName, importance);
            channelId = "compose";
            channelName = "私信";
            importance = NotificationManager.IMPORTANCE_DEFAULT;
            createNotificationChannel(channelId, channelName, importance);
        }
    }

    //建立通知渠道
    @RequiresApi(api = Build.VERSION_CODES.O)
    private void createNotificationChannel(String channelId, String channelName, int importance) {
        NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);
        NotificationManager notificationManager = (NotificationManager) getSystemService(
                NOTIFICATION_SERVICE);
        notificationManager.createNotificationChannel(channel);
    }

    public void sendUpgradeMsg(View view) {
        NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        Notification notification = new NotificationCompat.Builder(this, "upgrade")
                .setContentTitle("升級")
                .setContentText("程式設計師終於下班了。。")
                .setWhen(System.currentTimeMillis())
                .setSmallIcon(R.mipmap.ic_launcher)
                .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
                .setAutoCancel(true)
                .build();
        manager.notify(100, notification);
    }

    public void sendComposeMsg(View view) {
        NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        Notification notification = new NotificationCompat.Builder(this, "compose")
                .setContentTitle("私信")
                .setContentText("有人私信向你提出問題")
                .setWhen(System.currentTimeMillis())
                .setSmallIcon(R.drawable.icon)
                .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.icon))

                .build();
        manager.notify(101, notification);
    }
}
複製程式碼

通知渠道

管理通知渠道

之前我們說過,通知渠道一旦建立,控制權就在使用者手中,如果有一個重要通知渠道被使用者手動關閉了,我們就要提醒使用者去手動開啟該渠道。

getNotificationChannel()方法可以獲取指定的通知渠道物件,

getNotificationChannels() 可以獲取所有通知物件的集合,儲存在一個list中

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel channel = manager.getNotificationChannel("upgrade");
            if (channel.getImportance() == NotificationManager.IMPORTANCE_NONE) {
                Intent intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS);
                intent.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName());
                intent.putExtra(Settings.EXTRA_CHANNEL_ID, channel.getId());
                startActivity(intent);
                Toast.makeText(this, "升級通知不能關閉,請手動將通知開啟", Toast.LENGTH_SHORT).show();
            }
複製程式碼

到此通知渠道的簡單使用介紹完畢, 參考

shoewann0402.github.io/2018/01/08/… developer.android.com/about/versi…

相關文章