1. 程式人生 > >Android 通知(Notification)初級用法和注意事項

Android 通知(Notification)初級用法和注意事項

前言

  Android通知欄,相對來說也是開發中的一項常用功能,其實相關的文章非常之多,但是對於其中的細節或者問題的整理並非那麼清晰,以下便是自己在使用過程中的整理,希望對開發者能發揮一點作用.

Notofication 構建例項

    // 構建通知的例項 NotificationCompat相容性優
 NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context)

Notification 設定屬性

        mBuilder.setContentTitle(title)//設定通知標題
                .
setContentText(msg)//設定通知內容 .setStyle(new NotificationCompat.BigTextStyle().setBigContentTitle(title).bigText(msg))//設定多內容的情況 .setWhen(System.currentTimeMillis())//設定時間,一般系統時間 .setAutoCancel(true)//***設定點選是否會被取消 .setChannelId('PUSH_CHANNEL_ID')
//***設定渠道ID .setContentIntent(getPendingIntent(context));//***設定通知的點選事件 //設定通知自定義聲音 mBuilder.setSound(Uri.parse("android.resource://" + context.getPackageName() + "/" +'音訊檔案id'); //設定通知預設聲音 mBuilder.setDefaults(Notification.DEFAULT_ALL); //設定通知icon
if (targetSdkVersion >= 21 && Build.VERSION.SDK_INT >= 21){ mBuilder.setSmallIcon(R.drawable.notification_small_icon); mBuilder.setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.drawable.notification_large_icon)); } else { mBuilder.setSmallIcon(R.drawable.statusbar_icon); }
  • 重點說明
    • setSmallIcon,必須設定屬性,因為是手機狀態列上面的提示圖示
      • 當targetSdkVersion >= 21 && Build.VERSION.SDK_INT >= 21 必須設定setLargeIcon,並且setSmallIcon設定為透明的圖示,否則不顯示
    • setStyle,當通知內容很多時採用BigTextStyle
    • setAutoCancel,該屬性的作用域優很大的侷限性
      • 作用將狀態列收起,並且通知移除
      • setContentIntent 當為通知或者廣播的都起作用
      • 當處理自定義佈局時不起作用

Notification 點選事件

 private static PendingIntent getPendingIntent(final Context context) {
        Intent intent = new Intent(context, NotificationBroadcastReceiver.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
        //通知extra內容處理 
        int ownID=1;//放在通知最外層,防止每次進來被初始化
        ownID++;
        requestCode = ownID;
        return PendingIntent.getBroadcast(context, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    }
    
    
    private static PendingIntent getPendingIntent(final Context context) {
        Intent intent = new Intent(context, TargetActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
        //通知extra內容處理 
        int ownID=1;//放在通知最外層,防止每次進來被初始化
        ownID++;
        requestCode = ownID;
        return PendingIntent.getAcitivity(context, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    }

Notification 點選事件處理

    public class NotificationBroadcastReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            //內容處理
        }
    
    }
  • 重點說明
    • 點選事件分為兩類
      • PendingIntent.getBroadcast 通知處理
      • PendingIntent.getActivity 直接處理
    • 自定義佈局處理點選事件時,需要手動收起狀態列和移除對應通知

Notification 建立通知管理器

        //建立通知管理器
        if (notificationManager == null) {
            notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        }
        
        //設定通知渠道
        if (Build.VERSION.SDK_INT >= 26) {
            NotificationChannel channel = new NotificationChannel('PUSH_CHANNEL_ID', context.getString(R.string.setting_channel_notification), NotificationManager.IMPORTANCE_DEFAULT);
            notificationManager.createNotificationChannel(channel);
        }
  • 重點說明
    • Build.VERSION.SDK_INT >= 26,需要設定createNotificationChannel,並且設定setChannelId

Notification 傳送通知

        //傳送通知
         notificationManager.notify(notificationId, mBuilder.build());
  • 重點說明
    • notificationId 用來發送和移除對應的通知

Notification 移除通知

        //移除通知
        if (notificationManager == null) {
            notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        }
        notificationManager.cancel(notificationId);

Notification 結束語

  基本上通知的初級用法就是這些用法,重點注意高版本適配和某些特殊用法.

Notification 參考文獻