Notification也就是通知的意思,它的作用是在手機通知欄顯示一條信息,這對於app不在前臺的時候用處很大,下面我們來看一下它的使用方法吧。
一、簡單使用
廢話不多說,直接上代碼:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private NotificationManager mManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
String channelId = "msg";
String channelName = "消息";
int importance = NotificationManager.IMPORTANCE_DEFAULT;
createNotificationChannel(channelId, channelName, importance);
}
findViewById(R.id.start_notify).setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.start_notify:
startNotify();
break;
default:
break;
}
}
@RequiresApi(api = Build.VERSION_CODES.O)
private void createNotificationChannel(String channelId, String channelName, int importance) {
NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);
mManager.createNotificationChannel(channel);
}
private void startNotify() {
Notification notification = new NotificationCompat.Builder(this, "msg")
.setContentTitle("標題")
.setContentText("內容")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher))
.setAutoCancel(true)
.build();
mManager.notify(1, notification);
}
}
xml文件比較簡單,裏面就一個按鈕,這裏就不展示了,下面來一一介紹上面代碼的作用。
第一步:創建NotificationManager對象,這個對象是用來發送通知的;
第二步:創建通知渠道,這個是Android8.0之後新增的,如果你的targetSdkVersion大於26的話這個東西是必須要配置的,如果沒有配置的話在8.0以上的手機將無法使用通知;
在這個裏面有三個參數,具體作用如下:
1、id:這個屬性是用來區分不同的通知,值不能過長。
2、name:這個屬性是在設置裏面展示給用戶看的。
3、importance:通知的重要程度,不同的重要程度展示效果也不同。
第三步:創建通知實例,在構建器裏面我們需要配置下通知渠道的id,與創建渠道的時候要一致,隨後我們可以配置一些常用參數:
1、setContentTitle:設置通知標題。
2、setContentText:設置通知內容。
3、setWhen:設置時間。
4、setSmallIcon:設置小圖標。
5、setLargetIcon:設置大圖標。
6、setAutoCancel:設置點擊通知後自動清除信息。
最後調用build方法構建。
第四步:調用NotificationManager對象的notify方法發送通知。
最終效果:
這個時候我們發現,哎,怎麼小圖標是空的,這是由於在Android5.0之後,Google要求所有應用程序的通知欄圖標應該只使用alpha圖層來進行繪製,而不應該包括RGB圖層,簡單點來說就是隻能使用白底的圖標。這裏我們爲了簡單起見,直接使用Android Studio生成一個圖標先湊合着用着吧。
方法如下:
在Icon Type中選擇Notification Icons選項然後一路確定即可。
然後把setSmallIcon換上我們新增的圖片運行:
這個時候我們發現圖片變成了灰底的,要改變顏色我們只需要在Notification中加一個setColor這個屬性即可:
.setColor(ContextCompat.getColor(this, R.color.colorPrimary))
最終效果:
二、跳轉
1、先新建一個Activity用來做跳轉的界面。
2、編寫跳轉代碼:
Intent intent = new Intent(this, SecondActivity.class);
PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);
Notification notification = new NotificationCompat.Builder(this, "msg")
...
.setContentIntent(pi)
.build();
mManager.notify(1, notification);
這裏我們首先創建了一個Intent,然後創建了PendingIntent,最後調用setContentIntent把PendingIntent傳入即可,
效果如下:
通知的基本使用到這裏就基本完成啦。
三、進階知識
1、長文本
當我們想要在通知裏面展現長文本時如果直接使用setContentText就會變成這樣:
這個時候我們需要用到一個setStyle方法來設置長文本,這個屬性會把setContentText設置的內容給覆蓋掉:
.setStyle(new NotificationCompat.BigTextStyle().bigText("很長很長很長很長很長很長很長很長很長很長很長很長很長很長很長的內容"))
這樣就可以展示長文本啦
2、大圖片
設置大圖片也是調用setStyle這個方法,代碼如下:
// 構建一個 Style
NotificationCompat.BigPictureStyle bigPictureStyle =
new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(),R.drawable.timg));
// 設置標題
bigPictureStyle.setBigContentTitle("標題");
// 設置副標題,簡介文字
bigPictureStyle.setSummaryText("我是內容");
notification.setStyle(bigPictureStyle)
這樣設置即可:
3、自定義通知
第一步、創建RemoteViews實例:
RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.layout_custom);
第二步、調用setContent把remoteViews設置進去即可(注:前面的setStyle要去掉,否則自定義視圖不會生效):
.setContent(remoteViews)
更新RemoteViews:
remoteViews.setTextViewText(R.id.btn_1, "按鈕1");
第一個參數設置想要改變的控件,第二個參數設置想要改變的文本。
這裏只是簡單的展示一下,其他方法可以自行查閱RemoteViews方法。
點擊事件:
remoteViews.setOnClickPendingIntent(R.id.btn_1, pi);
第一個參數設置點擊事件作用的控件,第二個參數爲PendingIntent。
最終效果:
到這裏通知的使用就基本告一段落啦,下面是完整的Activity代碼:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private NotificationManager mManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
String channelId = "msg";
String channelName = "消息";
int importance = NotificationManager.IMPORTANCE_DEFAULT;
createNotificationChannel(channelId, channelName, importance);
}
findViewById(R.id.start_notify).setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.start_notify:
startNotify();
break;
default:
break;
}
}
@RequiresApi(api = Build.VERSION_CODES.O)
private void createNotificationChannel(String channelId, String channelName, int importance) {
NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);
mManager.createNotificationChannel(channel);
}
private void startNotify() {
// 構建一個 Style
NotificationCompat.BigPictureStyle bigPictureStyle =
new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(),R.drawable.timg));
// 設置標題
bigPictureStyle.setBigContentTitle("標題");
// 設置副標題,簡介文字
bigPictureStyle.setSummaryText("我是內容");
Intent intent = new Intent(this, SecondActivity.class);
PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);
RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.layout_custom);
remoteViews.setOnClickPendingIntent(R.id.btn_1, pi);
remoteViews.setTextViewText(R.id.btn_1, "按鈕1");
Notification notification = new NotificationCompat.Builder(this, "msg")
.setContentTitle("標題")
.setContentText("很長很長很長很長很長很長很長很長很長很長很長很長很長很長很長的內容")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.drawable.ic_stat_name)
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher))
.setAutoCancel(true)
.setColor(ContextCompat.getColor(this, R.color.colorPrimary))
.setContentIntent(pi)
// .setStyle(bigPictureStyle)
.setContent(remoteViews)
.build();
mManager.notify(1, notification);
}
}