關(guān)于通知
當(dāng)某個(gè)應(yīng)用程序希望向用戶發(fā)出一些提示信息,而該應(yīng)用程序又不在前臺(tái)運(yùn)行時(shí),就可以借助通知來(lái)實(shí)現(xiàn)。發(fā)出一個(gè)通知后,手機(jī)最上方的狀態(tài)欄中會(huì)顯示一個(gè)通知的圖標(biāo),下拉狀態(tài)欄后可以看到通知的詳細(xì)內(nèi)容。
A. 通知使用場(chǎng)景
通知可以在活動(dòng)、廣播接收器和服務(wù)里創(chuàng)建。相比于廣播接收器和服務(wù),在活動(dòng)里創(chuàng)建通知的場(chǎng)景還是比較少的,因?yàn)橐话阒挥挟?dāng)程序進(jìn)入到后臺(tái)的時(shí)候我們才需要使用通知。
B. 創(chuàng)建通知的詳細(xì)步驟
1.獲取NotificationManager的實(shí)例:
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
通過(guò)getSystemService()方法獲取到NotificationManager;
方法接收一個(gè)字符串參數(shù)用于確定獲取系統(tǒng)的哪個(gè)服務(wù),這里傳入NOTIFICATION_SERVICE就表示獲取的是通知管理器。
2.使用support-v4包中的NotificationCompat類的Builder構(gòu)造器來(lái)創(chuàng)建Notification對(duì)象。
Notification notification = new NotificationCompat.Builder(this)
.setContentTitle("This is content title")
.setContentText("This is context text")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
.build();
1.setContentTitle 用于指定通知的標(biāo)題內(nèi)容。
2.setContentText 用于指定通知的正文內(nèi)容,下拉系統(tǒng)狀態(tài)欄就可以看到。
3.setWhen 用于指定通知被創(chuàng)建的時(shí)間,以毫秒為單位,下拉系統(tǒng)狀態(tài)欄就會(huì)看到。
4.setSmallIcon 用于設(shè)置通知的小圖標(biāo),注意只能使用純alpha圖層的圖片進(jìn)行設(shè)置,小圖標(biāo)會(huì)顯示在系統(tǒng)狀態(tài)欄上。
5.setLargeIcon 用于設(shè)置通知的大圖標(biāo),下拉系統(tǒng)狀態(tài)欄即可見(jiàn)。
3.調(diào)用NotificationManager的notify方法讓通知顯示出來(lái)。
manager.notify(1, notification);
notify方法接收兩個(gè)參數(shù):第一個(gè)參數(shù)是id,保證為每個(gè)通知所指定的id都是不同的。第二個(gè)參數(shù)是Notification對(duì)象,這里直接換入剛剛創(chuàng)建好的Notification對(duì)象。
4.栗子:
- 新建項(xiàng)目,修改activity_main.xml中的代碼:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.fkq.inform.MainActivity">
<Button
android:id="@+id/send_notice"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Send Notice" />
</LinearLayout>
布局很簡(jiǎn)單,添加一個(gè)Button按鈕,用于發(fā)送通知。
- 修改MainActivity中的代碼:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.send_notice);
button.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.send_notice:
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Notification notification = new NotificationCompat.Builder(this)
.setContentTitle("This is content title")
.setContentText("This is context text")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
.build();
manager.notify(1, notification);
break;
}
}
}
C. 實(shí)現(xiàn)通知的點(diǎn)擊效果-PendingIntent
1.PendingIntent和Intent相同點(diǎn)和不同點(diǎn):
相同點(diǎn):都可以去指明某一個(gè)“意圖”,都可以用于啟動(dòng)活動(dòng)、啟動(dòng)服務(wù)以及發(fā)送廣播等。
不同點(diǎn):Intent更傾向于立即執(zhí)行某個(gè)動(dòng)作,而PendingIntent更加傾向于在某個(gè)合適的時(shí)機(jī)去執(zhí)行某個(gè)動(dòng)作。
總之:PendingIntent簡(jiǎn)單的理解為延遲執(zhí)行的Intent。
2.PendingIntent用法:
PendingIntent提供了幾個(gè)靜態(tài)方法用于獲取PendingIntent的實(shí)例,我們可以根據(jù)需求來(lái)選擇是使用getActivity方法、getBroadcast方法、還是getService方法。
這三個(gè)方法所接收的參數(shù)是相同的,第一個(gè)參數(shù)是Context,第二個(gè)參數(shù)一般用不到,傳入0即可,第三個(gè)參數(shù)是Intent對(duì)象,我們可以通過(guò)這個(gè)對(duì)象構(gòu)建出PendingIntent的“意圖”,第四個(gè)參數(shù)用于確定PendingIntent的行為,有Flag_ONE_SHOT、FLAG_NO_CREATE、FLAG_CANCEL_CURRENT和FLAG_UPDATE_CURRENT這4種值可選,通常傳入0即可。
NotificationCompat.Builder構(gòu)造器還可以再連綴一個(gè)setContentIntent方法,接收的參數(shù)正是一個(gè)PendingIntent對(duì)象。因此,這里就可以通過(guò)PendingIntent構(gòu)建出一個(gè)延遲執(zhí)行的“意圖”,當(dāng)用戶點(diǎn)擊這條通知時(shí)就會(huì)執(zhí)行相應(yīng)的邏輯。
3.添加點(diǎn)擊功能:
- 創(chuàng)建NotificationActivity和notification_layout:
public class NotificationActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.notification_layout);
}
}
<activity android:name=".NotificationActivity"></activity>
- 修改MainActivity:
Intent intent = new Intent(this, NotificationActivity.class);
PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Notification notification = new NotificationCompat.Builder(this)
.setContentTitle("This is content title")
.setContentText("This is context text")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
.setContentIntent(pi)
.build();
manager.notify(1, notification);
1.使用Intent表達(dá)出我們想要啟動(dòng)NotificationActivity的“意圖”。
2.然后將構(gòu)建好的Intent對(duì)象傳入到PendingIntent的getActivity里面,以得到PendingIntent的實(shí)例。
3.接著在NotificationCompat.Builder中調(diào)用setContentIntent方法,把它作為參數(shù)傳入即可。
D. 點(diǎn)擊通知后取消在系統(tǒng)的狀態(tài)欄上的通知
1.在NotificationCompat.Builder中連綴一個(gè)setAutoCancel方法,傳入true即可。
Notification notification = new NotificationCompat.Builder(this)
.setContentTitle("This is content title")
.setContentText("This is context text")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
.setContentIntent(pi)
.setAutoCancel(true)
.build();
2.顯式地調(diào)用Notification的cancel方法將它取消:
public class NotificationActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.notification_layout);
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
manager.cancel(1);
}
}
如果想取消哪條通知,在cancel方法中傳入該通知的id就行了
E. 通知的進(jìn)階技巧
1.通知到達(dá)有聲音:
2.通知到達(dá)震動(dòng):
Notification notification = new NotificationCompat.Builder(this)
.setContentTitle("This is content title")
.setContentText("This is context text")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
.setContentIntent(pi)
.setSound(Uri.fromFile(new File("/system/media/audio/ringtones/Little_Beat.ogg")))
.setVibrate(new long[]{0,1000,0,0})
.build();
1.setSound方法接收一個(gè)Uri參數(shù),比如每個(gè)手機(jī)的/system/media/audio/ringtones目錄下都有很多的音頻文件,以上是vivo x9i手機(jī)的。
2.setVibrate方法接收一個(gè)長(zhǎng)整型的數(shù)組,用于設(shè)置手機(jī)靜止和振動(dòng)的時(shí)長(zhǎng),以毫秒為單位:下標(biāo)為0的值表示手機(jī)靜止的時(shí)長(zhǎng),下標(biāo)為1的值表示手機(jī)振動(dòng)的時(shí)長(zhǎng),下標(biāo)為2的值又表示手機(jī)靜止的時(shí)長(zhǎng),以此類推。
3.如果想要通知到來(lái)的時(shí)候立刻振動(dòng)1秒,代碼如上所示。
4.手機(jī)振動(dòng)實(shí)際證明不需要聲明權(quán)限。
3.控制手機(jī)LED燈的顯示:
4.使用通知的默認(rèn)效果:振動(dòng)方式和鈴聲跟隨系統(tǒng):
Notification notification = new NotificationCompat.Builder(this)
.setContentTitle("This is content title")
.setContentText("This is context text")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
.setContentIntent(pi)
.setDefaults(NotificationCompat.DEFAULT_ALL)
.setLights(Color.GREEN, 1000, 1000)
.build();
注意:
1.LED燈的閃爍要在鎖屏的狀態(tài)下顯示。
2.LED燈的顏色可能受手機(jī)的定制原因,不是所有的顏色都起作用。
F. 通知的高級(jí)功能
- setStyle方法接收一個(gè)NotificationCompat.Style參數(shù),這個(gè)參數(shù)就是用來(lái)構(gòu)建具體的富文本信息的,如長(zhǎng)文字,圖片等。
1.顯示長(zhǎng)文字:
.setStyle(new NotificationCompat.BigTextStyle().bigText("【美媒稱中國(guó)奇跡沒(méi)有結(jié)束】“增長(zhǎng)表現(xiàn)超出預(yù)期”,對(duì)于中國(guó)國(guó)家統(tǒng)計(jì)局公布的今年一季度6.9%的國(guó)內(nèi)生產(chǎn)總值(GDP)增長(zhǎng)率"))
setStyle方法中創(chuàng)建一個(gè)NotificationCompat.BigTextStyle對(duì)象,這個(gè)對(duì)象就是用于封裝長(zhǎng)文字信息的,我們調(diào)用它的bigText方法并將文字內(nèi)容傳入就可以了。
2.顯示一張大圖片:
.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(), R.drawable.fkq)))
setStyle方法中創(chuàng)建一個(gè)NotificationCompat.BigPictureStyle對(duì)象,這個(gè)對(duì)象就是用于設(shè)置大圖片的,然后調(diào)用它的bigPicture方法將圖片傳入。
通過(guò)BitmapFactory的decodeResource方法將圖片解析成Bitmap對(duì)象,再傳入bigPicture方法就可以了。
- setPriority方法用于設(shè)置通知的重要程度,一共5個(gè)常量值可選:
- PRIORITY_DEFAULT 表示默認(rèn)的重要程序,和不設(shè)置效果一樣。
- PRIORITY_MIN 表示最低的重要程度,系統(tǒng)可能只會(huì)在特定的場(chǎng)景才顯示這條通知,比如用戶下拉狀態(tài)欄的時(shí)候。
- PRIORITY_LOW 表示較低的重要程度,系統(tǒng)可能會(huì)將這類通知縮小,或改變其顯示的順序,將其排在更重要的通知之后。
- PRIORITY_HIGH 表示較高的重要程度,系統(tǒng)可能會(huì)將這類通知放大,或改變其顯示的順序,將其排在比較靠前的位置。
- PRIORITY_MAX 表示最高的重要程度,這類通知消息必須要讓用戶立刻看到,甚至需要用戶做出響應(yīng)操作。
.setPriority(NotificationCompat.PRIORITY_MAX)