Android 通知(Notification)初級用法和注意事項
阿新 • • 發佈:2018-12-20
前言
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 當為通知或者廣播的都起作用
- 當處理自定義佈局時不起作用
- setSmallIcon,必須設定屬性,因為是手機狀態列上面的提示圖示
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 結束語
基本上通知的初級用法就是這些用法,重點注意高版本適配和某些特殊用法.