# Android11-通知的使用

1.使用通知

1.1 創建一個通知

  • 第一步:獲得NotificationManager對象來對通知進行管理。

    可以調用Context的getSystemService()方法獲取。該方法接收一個字符串參數,用于確定獲取哪個系統服務,獲取通知傳入Context.NOTIFICATION_SERVICE

    • 代碼如下:
     //創建一個NotificationManager對象
     NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    
  • 第二步:創建一個Notification對象

使用一個Builder構造器來創建一個Notification對象。

//創建Notification
 Notification notification = new NotificationCompat.Builder(MainActivity.this)
         .setContentTitle("這是通知內容標題")
         .setContentText("正式通知內容")
         .setWhen(System.currentTimeMillis())
         .setSmallIcon(R.mipmap.ic_launcher)
         .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
         .build();
  • 第三步:顯示通知

    調用NotificationManager的notify()方法可以讓通知顯示出來,該方法接收兩個參數,第一個是id,保證每個通知指定的id都是不同的,第二個是要顯示的Notification對象

manager.notify(1, notification);
  • 完整代碼如下
sendNotice = (Button) findViewById(R.id.send_notification);
       sendNotice.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               //獲得NotificationManager對象
               NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
               //創建Notification
               Notification notification = new NotificationCompat.Builder(MainActivity.this)
                       .setContentTitle("這是通知內容標題")
                       .setContentText("正式通知內容")
                       .setWhen(System.currentTimeMillis())
                       .setSmallIcon(R.mipmap.ic_launcher)
                       .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
                       .build();
               //發送通知
               manager.notify(1, notification);
           }
       });

1.2實現通知的點擊功能

使用PendingIntent可以實現這一功能。PendingIntent和Intent類似,但是PendingIntent更加傾向于在某個合適的時機去執行某個某個動作,而Intent更加傾向于立即執行某個動作。

1.2.1PendingIntent的用法

  • PendingIntent提供了幾個靜態方法用于獲取PendingIntent的實例:getActivity()getBroadcast()getService()
  • 這幾個靜態方法接受的參數都是相同的:
- 第一個是Context

- 第二個一般用不到,通常傳0即可。

- 第三個是一個Intent對象

- 第四個是用于確定PendingIntent的行為 
  • 完整代碼如下
//初始化Intent
Intent intent = new Intent(MainActivity.this, NotificationActivity.class);
//使用Intent獲得PendingIntent對象
PendingIntent pi = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Notification notification = new NotificationCompat.Builder(MainActivity.this)
   .setContentTitle("這是通知內容標題")
   .setContentText("正式通知內容")
   .setWhen(System.currentTimeMillis())
   .setSmallIcon(R.mipmap.ic_launcher)
   .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
   //設置PendingIntent
   .setContentIntent(pi)
   .build();
//顯示通知
manager.notify(1,notification);
}

1.3實現點擊通知之后刪除通知的功能
實現這個功能有兩種方法,

  • 第一種是在實例化notification時setAutoCancel傳入true。
Notification notification = new NotificationCompat.Builder(MainActivity.this)
.setContentTitle("這是通知內容標題")
.setContentText("正式通知內容")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
//設置PendingIntent
.setContentIntent(pi)
//設置點擊通知時刪除通知
.setAutoCancel(true)
.build();
  • 第二種是顯示的調用NotificationManager的cancel()方法將它取消,這個方法接收通知的id用于指定取消哪個通知
//獲得NotificationManager對象
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
//取消id為1的通知
manager.cancel(1);

2.通知的高級功能

2.1通知發出時播放音頻
使用setSound()方法,接收一個Uri參數,指定通知發出時要播放的音頻

Notification notification = new NotificationCompat.Builder(MainActivity.this)
.setContentTitle("這是通知內容標題")
.setContentText("正式通知內容")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
//設置PendingIntent
.setContentIntent(pi)
//設置點擊通知時刪除通知
.setAutoCancel(true)
//播放音頻
.setSound(Uri.fromFile(new File("/system/media/audio/ringtones/Luna.ogg")))
.build();

2.2通知發出時手機振動

使用setVibrate()方法,接收一個virbrate參數,它是一個長整型數組,用于設置手機靜止和振動的時長。下標為0的值表示手機靜止的時長,下標為1的值表示手機振動時長,下標為2的值表示手機靜止的時長。

Notification notification = new NotificationCompat.Builder(MainActivity.this)
.setContentTitle("這是通知內容標題")
.setContentText("正式通知內容")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
//設置PendingIntent
.setContentIntent(pi)
//設置點擊通知時刪除通知
.setAutoCancel(true)
//播放音頻
.setSound(Uri.fromFile(new File("/system/media/audio/ringtones/Luna.ogg")))
//設置手機接收到通知時立刻振動1秒,靜止1秒,再振動一秒
.setVibrate(new long[] {0, 1000, 1000, 1000})
.build();

注意:使用手機的震動功能還需在AndroidManifest.xml文件中添加權限聲明

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.anwser_mac.notificationtest">
    //聲明權限
    <uses-permission android:name="android.permission.VIBRATE"/>

2.3 實現通知未讀時LED燈閃爍

Notification notification = new NotificationCompat.Builder(MainActivity.this)
    .setContentTitle("這是通知內容標題")
    .setContentText("正式通知內容")
    .setWhen(System.currentTimeMillis())
    .setSmallIcon(R.mipmap.ic_launcher)
    .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
    //設置PendingIntent
    .setContentIntent(pi)
    //設置點擊通知時刪除通知
    .setAutoCancel(true)
    //播放音頻
    .setSound(Uri.fromFile(new File("/system/media/audio/ringtones/Luna.ogg")))
    //設置手機接收到通知時立刻振動1秒,靜止1秒,再振動一秒
    .setVibrate(new long[] {0, 1000, 1000, 1000})
    //設置LED燈,綠色閃爍
    .setLights(Color.GREEN, 1000, 1000)
    .build();
  • 注:如果不想進行這么繁雜設置,可以直接使用通知的默認效果,它會根據手機環境來決定播放什么鈴聲,及如何振動等

    Notification notification = new NotificationCompat.Builder(this)
    .setDefaults(NotificationCompat.DEFAULT_ALL)
    .build();
    

2.4設置通知顯示長文本內容,超出范圍自動換行
在setStyle方法中創建一個NotificationCompat.BigTextStyle對象,然后調用該對象的bigText方法

    .setStyle(new NotificationCompat.BigTextStyle().bigText("hhhhhhhhhhhhhhhhhhhhhhhhhhhhzheshi 一段很長長的文本"))

2.5設置通知顯示一張大圖

具體用法跟2.4類似,但是這次創建的是一個NotificationCompat.BitPictureStyle對象。

.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher_round)))

2.6設置通知的重要程度
調用setPriority()方法來設置通知的重要程度,分為5歌級別

  1. PRIORITY_DEFAULT : 表示默認程度,和不設置的效果一樣。
  2. PRIORITY_MIN :最低的重要程度,系統可能只會在特定的場景才會顯示這條通知,比如用戶下拉狀態欄的時候。
  3. PRIORITY_LOW : 較低的重要程度,系統可能會降這類通知縮小,或改變其顯示的順序
  4. PRIORITY_HIGHT : 較高的重要程度,系統可能會將這類通知放大,或改變其顯示的順序,將其排在比較靠前的位置。
  5. PRIORITY_MAX : 最高的重要程度,這類通知消息必須要讓用戶立即看到,甚至需要用戶做出相應操作。
  • 具體寫法如下:
setPriority(NotificationCompat.PRIORITY_MAX)
2017-04-13_11-58-07.gif
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容