Android Notification用法全解析

關(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è)常量值可選:
  1. PRIORITY_DEFAULT 表示默認(rèn)的重要程序,和不設(shè)置效果一樣。
  2. PRIORITY_MIN 表示最低的重要程度,系統(tǒng)可能只會(huì)在特定的場(chǎng)景才顯示這條通知,比如用戶下拉狀態(tài)欄的時(shí)候。
  3. PRIORITY_LOW 表示較低的重要程度,系統(tǒng)可能會(huì)將這類通知縮小,或改變其顯示的順序,將其排在更重要的通知之后。
  4. PRIORITY_HIGH 表示較高的重要程度,系統(tǒng)可能會(huì)將這類通知放大,或改變其顯示的順序,將其排在比較靠前的位置。
  5. PRIORITY_MAX 表示最高的重要程度,這類通知消息必須要讓用戶立刻看到,甚至需要用戶做出響應(yīng)操作。
.setPriority(NotificationCompat.PRIORITY_MAX)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容