1 public class MainActivity extends AppCompatActivity { 2 3 @Override 4 protected void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 setContentView(R.layout.activity_main); 7 8 Button sendNotice = (Button) findViewById(R.id.button); 9 10 sendNotice.setOnClickListener(new View.OnClickListener() { 11 @Override 12 public void onClick(View view) { 13 14 NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 15 16 Intent intent = new Intent(MainActivity.this,NoticeActivity.class); 17 PendingIntent pi = PendingIntent.getActivity(MainActivity.this, 0, intent, 0); 18 19 Notification notification = new NotificationCompat.Builder(MainActivity.this) 20 .setContentTitle("這是一個標題") 21 .setContentText("這是一個內容") 22 .setWhen(System.currentTimeMillis()) 23 .setSmallIcon(R.mipmap.ic_launcher) 24 .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher)) 25 .setContentIntent(pi) 26 .setDefaults(NotificationCompat.DEFAULT_ALL) 27 .build(); 28 manager.notify(1,notification); 29 } 30 }); 31 } 32 }
這一個較為完整的通知,首先呢:
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
獲取了一個NotificationManager的實例,NotificationManager是一個管理通知的類,可以通過getSystemService()方法來獲取到,參數是用於確定獲取系統的那個服務的一個字符串。
然后,使用了一個Buider構造器來創建一個notification對象,一般的使用方法如下:
Notification notification = new NotificationCompat.Builder(context).build();
這個代碼只是創建了一個空的notification對象,可以在build()之連綴使用多個設置方法設置icon、文字、提示聲音、振動等等參數。比如:
1 Notification notification = new NotificationCompat.Builder(MainActivity.this) 2 .setContentTitle("這是一個標題") 3 .setContentText("這是一個內容") 4 .setWhen(System.currentTimeMillis()) 5 .setSmallIcon(R.mipmap.ic_launcher) 6 .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher)) 7 .setContentIntent(pi) 8 .setDefaults(NotificationCompat.DEFAULT_ALL) 9 .build();
其中:
setContentTitle()方法用於指定通知的標題內容;
setContentText()方法用於指定通知的正文內容;
setWhen()方法會在通知上顯示通知被創建的時間(System.currentTimeMillis()這個方法將返回時間,以毫秒為單位);
setSmallIcon()用於指定小圖標,不過這里只能使用純alpha圖層的圖片,這個圖標將顯示在狀態欄沒有下拉的狀態欄上;
setLargeIcon()用於指定大圖標,下拉狀態欄的時候就能看到大圖標了
setContentIntent()這里傳入一個PendingIntent類的對象用於指定點擊通知后的相應。
setDefaults()這里指定了當通知顯示的時候的效果,它會根據手機的環境來決定播放什么鈴聲,和如何振動。
最后:
manager.notify(1,notification);
使用NotificationManager的notify()方法讓通知顯示出來,第一個參數是一個id,要保證每個通知的id不同,第二個參數就是設置好的notification對象
具體效果就是:
想要實現點擊的效果就需要一個PendingIntent類,它主要提供幾種靜態方法實現獲取PendingIntent的實例,根據需求分別是getActivity(),getBroadcast(),getService(),比如這里使用的是:
PendingIntent pi = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);
getActivity(),getBroadcast(),getService()這三個方法的參數都是一個的,第一個參數是context,第二個通常是0,第三個是一個Intent對象,通過這個Intent對象可以構建出PendingIntent的意圖,第四個參數用於確定PendingIntent的行為,通常有四種值可以選:
FLAG_CANCEL_CURRENT:如果當前系統中已經存在一個相同的PendingIntent對象,那么就將先將已有的PendingIntent取消,然后重新生成一個PendingIntent對象。
FLAG_NO_CREATE:如果當前系統中不存在相同的PendingIntent對象,系統將不會創建該PendingIntent對象而是直接返回null。
FLAG_ONE_SHOT:該PendingIntent只作用一次。在該PendingIntent對象通過send()方法觸發過后,PendingIntent將自動調用cancel()進行銷毀,那么如果你再調用send()方法的話,系統將會返回一個SendIntentException。
FLAG_UPDATE_CURRENT:如果系統中有一個和你描述的PendingIntent對等的PendingInent,那么系統將使用該PendingIntent對象,但是會使用新的Intent來更新之前PendingIntent中的Intent對象數據,例如更新Intent中的Extras。
這里使用0即可。
Intent intent = new Intent(MainActivity.this,NoticeActivity.class);
這里傳入的intent對象是這樣一個啟動NoticeActivity活動的,所以點擊通知時會啟動NoticeActivity活動。
對於通知的設置還可以在build()之使用這些方法:
1、播放聲音
.setSound(Uri.fromFile(new File("/system/media/audio/ringtones/Luna.ohh")))
.setSound(Uri.fromFile(new File("/system/media/audio/ringtones/Luna.ohh")))
這個用於設置通知的聲音;
2、振動
.setVibrate(new long[] {0, 1000, 1000, 1000})
這個用於設置通知的振動的參數是一個長整型的數組,下標0的值表示通知到來時手機靜止的時長,下標1的值表示手機振動的時長,下標2的值又表示手機振動的時長,以此類推。通知這里表示通知到來時手機立即振動1秒,然后停止1秒,然后再振動1秒。
想要振動還需要權限
<uses-permission android:name="android.permission.VIBRATE"/>
3、LED
.setLights(Color.GREEN,1000,1000)
這個是設置通知到來時手機的LED燈,第一個參數是指定顏色,第二個參數指定亮起的時長,第二個是暗去的時長。
4、取消通知
.setAutoCancel(true)
這個是點擊這個通知后這個通知就消失。這里還能調用NotificationManager的cacel()方法顯式的取消這個通知,比如在這里可以在這個通知啟動的活動中設置一個按鈕然后調用這個方法,具體就是:
public class NoticeActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_notice); final NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); Button cacnel = (Button) findViewById(R.id.cancel); cacnel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { manager.cancel(1); } }); } }
manager.cancel(1)里面的參數就是通知的id。
5、大文本和大圖片
.setContentText("這是一個內容這是一個內容這是一個內容這是一個內容這是一個內容這是一個內容這是一個內容這是一個內容這是一個內容這是一個內容這是一個內容這是一個內容這是一個內容這是一個內容")
.setContentText()使用這個方法顯示一個長文本的時候會顯示不全。

這時候就需要使用setstyle()方法:
setStyle(new NotificationCompat.BigTextStyle().bigText("這是一個內容這是一個內容這是一個內容這是一個內容這是一個內容這是一個內容這是一個內容這是一個內容這是一個內容這是一個內容這是一個內容這是一個內容"))
這里創建了一個NotificationCompat.BigTextStyle()對象,這個對象適用於封裝長文本信息的,然后調用他的bigText()方法將文字內容傳入。
與之類似,還可以顯示一張大圖片:
.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(),R.drawable.image_1)))
NotificationCompat.BigPictureStyle()這個對象用於設置大圖片,然后調用它的bigPicture()方法將圖片傳入,然后通過調用BitmapFactory的decodeResource方法將圖片解析為Bitmap對象。
6、通知的重要程度
通知的重要程度使用setPriority()方法,通常有個整型的常量值可選:PRIORITY_DEFAULT這是一個默認的重要程度,和不設置一樣;PRIORITY_MIN,這表示系統旨在特定的情況才顯示,比如下拉的時候;PRIORITY_LOW,系統可能會縮小這個通知,改變它的順序,將其排在重要的通知的后面;PRIORITY_HIGH,會被系統放大,改變其順序,將其排在比較靠前的位置;PRIORITY_MAX是最高的重要程度,系統會立即顯示。比如:
.setPriority(NotificationCompat.PRIORITY_MAX)
當重要程度達到MAX時系統會彈出一個橫幅立即顯示這條通知,不過如果使用小米手機的話要自行開啟懸浮通知的權限。。