Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Notification(Notification的通知欄常駐、Notification的各種樣式、Notification點擊無效)

Notification(Notification的通知欄常駐、Notification的各種樣式、Notification點擊無效)

編輯:關於Android編程

Android的Notification是android系統中很重要的一個機制, 產品人員常常利用通知欄的方式,跟用戶進行弱溝通。擁有推送通知的app要比沒有此類功能的app活躍率要高很多。另外類似於墨跡天氣,清理大師等 app,也會將通知欄常駐,利用自定義的布局,方便用戶及時快捷的查看所需的信息和使用快捷的功能。所以Notification的使用,也在開發當中, 使用的越來越頻繁。今天我就來跟大家分享一下Notification的常用事項。

我不了解大家平時怎麼使用Notification,我常常看到有些人的代碼是這樣寫的:

Notificationnotification=newNotification(notificationIcon,notificationTitle,when);

notification.defaults=Notification.DEFAULT_ALL;

Intentintent=newIntent(MainActivity.this,SecondActivity.class);

PendingIntentpendingIntent=PendingIntent.getActivity(MainActivity.this,0,intent,0);

notification.setLatestEventInfo(this,"測試展開title","測試展開內容",pendingIntent);

具體的代碼我就不貼全了,因為大家如果注意IDE的提示的話,就會發現,其實這是一種不推薦 的用法,API的支持已經過時了。最新的Notification的用法,是推薦使用V4包下的NotificationCompat.Builder, 利用它,進行各種設置,具體的用法先別著急,我們慢慢道來。

NotificationCompat.BuildernotifyBuilder=newNotificationCompat.Builder(

this);

首先,我們需要先初始化一個notifyBuilder,然後利用它的各種set方法,進行相關設置,具體的設置,我們參考下圖:

 

技術分享

 

圖示中的序號1,叫做

notifyBuilder.setContentTitle("ThisisMyNotification");

圖示中的序號3,叫做

notifyBuilder.setContentText("HelloWorld");

圖示中的需要5,叫做利用下面的方法來設置:

這三個參數的設定是必須的,每次調用Notification,必須得設定這三個參數。除去這三個以外,另外的2,4,6區域,分別是Large Icon,Content Info,Time,設置方法如下所示:

Bitmapbitmap=BitmapFactory.decodeResource(getResources(),R.drawable.bigicon);

notifyBuilder.setLargeIcon(bitmap);

//這裡用來顯示右下角的數字

notifyBuilder.setNumber(10);

notifyBuilder.setWhen(System.currentTimeMillis());

以上就是關於Notification的基本設置,下面,我們繼續看看其它方面的設置,直接上代碼:

//將AutoCancel設為true後,當你點擊通知欄的notification後,它會自動被取消消失

notifyBuilder.setAutoCancel(true);

//將Ongoing設為true那麼notification將不能滑動刪除

//notifyBuilder.setOngoing(true);

//從Android4.1開始,可以通過以下方法,設置notification的優先級,優先級越高的,通知排的越靠前,優先級低的,不會在手機最頂部的狀態欄顯示圖標

notifyBuilder.setPriority(NotificationCompat.PRIORITY_MAX);

//notifyBuilder.setPriority(NotificationCompat.PRIORITY_MIN);

notifyBuilder.setTicker("Hi,Notificationishere");

//Uriuri=

//Uri.parse("android.resource://"+getPackageName()+"/"+R.raw.cat);

//Uriuri=Uri.parse("file:///mnt/sdcard/cat.mp3");

//notifyBuilder.setSound(uri);

//Notification.DEFAULT_ALL:鈴聲、閃光、震動均系統默認。

//Notification.DEFAULT_SOUND:系統默認鈴聲。

//Notification.DEFAULT_VIBRATE:系統默認震動。

//Notification.DEFAULT_LIGHTS:系統默認閃光。

//notifyBuilder.setDefaults(Notification.DEFAULT_ALL);

NotificationManagermNotificationManager=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);

mNotificationManager.notify(NOTIFY_ID,notifyBuilder.build());

如上面的注釋所示,如果你想點擊完notification後,該通知自動消失,那麼你就需要調用setAutoCancel(boolean b)這個方法,並且將其設為true,如果你想讓你的通知欄常駐,用戶無法滑動刪除,也不能通過手機的清除鍵 刪除,類似於墨跡天氣等app的通知欄,那麼你可以設置setOngoing方法,也設為true,這樣,通知欄只能通過代碼調用cancel方法才能消失,很霸道地,有木有!另外,從Android4.1時代開始,系統允許設置Notification的優先級,對於優先級高的通知,會排在 通知欄的前面,並在會在手機最上端的Status Bar顯示一個圖標,如果優先級設定的較低,那麼就會被系統顯示在通知欄的後面,並且Status Bar不再顯示相應的圖標,設置優先級的方法,就是調用setPriority(int p)。另外,當啟動通知欄的時候,我們常常可以在手機最上端的Status Bar上面,會閃現一段提示語,用來提醒用戶,這段提示語具體顯示的文字,就是靠setTicker()這個方法來實現的。除此之外,我們還可以設置,推送通知時的鈴聲、震動效果,閃光燈效果等等,具體的我就不一一列舉了,參考上面的示例代碼即可,需要注意 一點的是,設置通知的鈴聲,除去調用系統自帶的外,還有兩種方式,分別是調用SD卡中的聲音文件和項目工程自帶的聲音文件,這兩種方式都需要用到Uri的 地址,具體如何獲取這兩種的Uri,我已經在上面的代碼中,寫的很詳細了,大家可以參考上面的代碼,在自己的項目中實驗一下。

說了這麼多,還有最重要的一點沒有講,那就是在你設置完notification的各 種屬性後,你需要啟動這個notification,否則就前功盡棄了,啟動的方法,如上面的示例代碼所示,你需要先獲取一個 NotificationManager的實例,然後調用notify的方法,notifyBuilder.build()這個方法,可以實例化一個 notification的實例,另外,你還需要為這個notification分配一個獨一無二的的id號,將來notification的更新和刪 除,都是依靠這個id號來做索引對應的。

有時候,我們會涉及到這麼一個需求,那就是,產品設計,希望我們能夠監聽 notification的銷毀,意思就是說,當用戶手動滑動通知將其刪除或者通過手機的刪除按鈕將其清空時,我們希望可以捕獲到這一信息,並作出相應的 處理。比如說,我們在通知欄發送了一個通知,用來更新一個資源的下載進度,當用戶刪除這個通知後,我們希望可以監聽到這一變化,作出相應的處理,比如取消 下載,比如重新下載等等,那麼,應該如何監聽取消的行為呢?請看代碼:

IntentdeleteIntent=newIntent(this,DeleteService.class);

intdeleteCode=(int)SystemClock.uptimeMillis();

PendingIntentdeletePendingIntent=PendingIntent.getService(this,

deleteCode,deleteIntent,PendingIntent.FLAG_UPDATE_CURRENT);

notifyBuilder.setDeleteIntent(deletePendingIntent);

我 們給notifyBuilder設置一個DeleteIntent,這裡指向了一個service,當刪除的行為發生後,系統就會啟動這個 service,我們就可以在這個service中,做相應的邏輯處理了,當然,這裡我只是舉了一個例子,用來啟動service,大家也可以將 Intent指向一個Activity或者一個廣播,不過PendingIntent.getService()這個方法,就需要換成 PendingIntent.getActivity()或者PendingIntent.getBroadCast()這兩個方法。

上面的內容,我們大概了解了如何給notification設定顯示的內容,和如何監 聽銷毀的行為。但是常常,我們會發現,除了以上功能外,我們經常遇見的情形時,當我們點擊了一個notification後,就會自動打開一個頁面,展示 出信息來源的具體頁面,接下來,我們就針對這種情況,來看看代碼是如何控制的。

剛剛提到的自動跳轉頁面的功能,看似很簡單的一個邏輯,其實也包含了各種邏輯處理情況,其中最主要的是有兩種:

一:當我們處在手機桌面主屏的時候,突然來了一條郵箱的信息,來了一 封新郵件,我們點擊通知欄,系統會為我們打開最新收到的郵件,當我們看完郵件後,按返回鍵,我們並不會馬上回到手機桌面的主屏上,而是先返回到收件箱界 面,然後再返回到郵件APP的主界面,然後再返回到手機桌面的主屏上,它是按照郵件APP的頁面隊列返回的。

二:還是舉剛才那個例子,當我們收到新郵件的通知後,我們點擊打開新收到的郵件,當我們閱讀完之後,我們想要點擊返回鍵,立刻返回到我們剛剛所處的界面,繼續進行剛才還在進行的任務。

這兩種情況,在產品設計中,常常出現,所以我們也要想辦法去實現,那麼如何去實現這兩種情況呢,我們一個一個來看。

首先請看第一種情況的代碼:

IntentnotifyIntent=newIntent(this,NotifyRegularActivity.class);

TaskStackBuilderstackBuilder=TaskStackBuilder.create(this);

stackBuilder.addParentStack(NotifyRegularActivity.class);

stackBuilder.addNextIntent(notifyIntent);

//當設置下面PendingIntent.FLAG_UPDATE_CURRENT這個參數的時候,常常使得點擊通知欄沒效果,你需要給notification設置一個獨一無二的requestCode

intrequestCode=(int)SystemClock.uptimeMillis();

PendingIntentresultPendingIntent=stackBuilder.getPendingIntent(

requestCode,PendingIntent.FLAG_UPDATE_CURRENT);

notifyBuilder.setContentIntent(resultPendingIntent);

我們繼續貼上AndroidManist.xml的配置代碼:

android:name="com.example.notificationtest.MainActivity"

android:label="@string/app_name">

android:name="com.example.notificationtest.OtherActivity"

android:label="OtherActivity"

android:parentActivityName="com.example.notificationtest.MainActivity">

android:name="android.support.PARENT_ACTIVITY"

android:value="com.example.notificationtest.MainActivity"/>

android:name="com.example.notificationtest.NotifyRegularActivity"

android:label="NotifyRegularActivity"

android:parentActivityName="com.example.notificationtest.OtherActivity">

android:name="android.support.PARENT_ACTIVITY"

android:value="com.example.notificationtest.OtherActivity"/>

好,我們來分析一下上面的代碼。首先我們設置了一個Intent,將其指向 NotifyRegularActivity,然後我們用到了TaskStackBuilder,它可以用來控制界面返回的導航堆棧。

TaskStackBuilderstackBuilder=TaskStackBuilder.create(this);

stackBuilder.addParentStack(NotifyRegularActivity.class);

stackBuilder.addNextIntent(notifyIntent);

我們利用這段代碼,首先實例化了一個TaskStackBuilder,然後調用addParentStack()和addNextIntent(), 設置它的返回堆棧和跳轉頁面,跳轉頁面的Intent很好理解,跟大家平時的設置方式是一樣的,那麼它的返回堆棧是如何控制的呢?這就需要上面xml配置 文件的配置了,大家請看,在上面的配置文件中,一共有三個Activity,分別是MainActivity,OtherActivity,和 NotifyRegularActivity,其中NotifyRegularActivity就是我們點擊通知欄後,要自動跳轉的界面。在配置文件當 中,

我們給後面兩個Activity,設置了這麼一個屬性android:parentActivityName,它指的就是該activity的返回路徑,因為剛剛我們在調用addParentStack()這個方法的時候,設置的參數是NotifyRegularActivity.class所以根據上面配置文件的配置內容,那麼它的返回堆棧的順序就是:

 

技術分享

 

需要注意的是,為了向下兼容版本,我們在設置android:parentActivityName這個屬性的時候,還需要在配置文件中,為每個Activity進行如下設置:

android:name="android.support.PARENT_ACTIVITY"

android:value="com.example.notificationtest.MainActivity"/>

具體的value的指向,就需要你自己設定了,總之,它指向了該activity的返回頁面。對TaskStackBuilder設置完成之後,我們再通過下面的代碼獲取PendingIntent,,然後賦值給notifyBuilder即可:

//當設置下面PendingIntent.FLAG_UPDATE_CURRENT這個參數的時候,常常使得點擊通知欄沒效果,你需要給notification設置一個獨一無二的requestCode

intrequestCode=(int)SystemClock.uptimeMillis();

PendingIntentresultPendingIntent=stackBuilder.getPendingIntent(

requestCode,PendingIntent.FLAG_UPDATE_CURRENT);

notifyBuilder.setContentIntent(resultPendingIntent);

這裡有兩點需要注意一下:

1:PendingIntent.FLAG_UPDATE_CURRENT這個參數一般有四種選擇分別是:

FLAG_CANCEL_CURRENT:如果構建的PendingIntent已經存在,則取消前一個,重新構建一個。

FLAG_NO_CREATE:如果前一個PendingIntent已經不存在了,將不再構建它。

FLAG_ONE_SHOT:表明這裡構建的PendingIntent只能使用一次。

FLAG_UPDATE_CURRENT:如果構建的PendingIntent已經存在,那麼系統將不會重復創建,只是把之前不同的傳值替換掉。

如果沒有特殊要求的話,我們常常會使用FLAG_UPDATE_CURRENT這個參數來構造PendingIntent,但是這樣常常會引發第二個問題,什麼問題呢?呵呵~

2:如上所述我們使用 FLAG_UPDATE_CURRENT這個參數後,常常會發現,我們點擊通知欄後,系統沒有響應,時靈時不靈的,很是憂郁,這是為什麼呢?原來使用 FLAG_UPDATE_CURRENT這個參數後,系統不會重新創建新的PendingIntent,這樣一來,如果你傳遞的Intent的 extra參數沒有變化的話,那麼系統就會認為你沒有發送新的PendingIntent,這樣就不會重新響應你的點擊事件。一般情況下,為了能夠區分每 次的PendingIntent不一樣,我們常常會在構造Intent的時候,設置不同的Action或者Extra值,這樣一來,及時是使用 FLAG_UPDATE_CURRENT這個參數,系統也會因為傳值參數的變化而去響應每次的點擊跳轉事件。不過這種解決方法還是有些麻煩,有時候,我們 根本不需要傳遞額外的Aciton或者參數值,這該怎麼辦呢?哈哈,解決代碼已經在上面的代碼中寫出來了,在stackBuilder.getPendingIntent(requestCode, PendingIntent.FLAG_UPDATE_CURRENT)這個方法中,我們注意到第一個參數,這裡,我們只要為這個參數設置一個獨一無二的標識,那麼剛剛提到的點擊無響應的問題就迎刃而解了,我平時的設置辦法就是利用這段代碼:

intrequestCode=(int)SystemClock.uptimeMillis();

獲取發布通知時的時間,將它作為requestCode,這樣就可以避免這些問題了。不過如果你要是使用FLAG_CANCEL_CURRENT這個參數的話,就會每次都創建一個新的,那麼剛剛提到的這兩個問題,也都不存在了,具體怎麼用,看你實際的業務要求了。

上面的講解,我們就可以解決剛剛討論的第一種情形了,下面我們來說一下,第二種情形,也就是點擊返回鍵後,直接返回剛剛任務所處的界面,看看這個如何實現。來,看代碼:

IntentnotifyIntent=newIntent(this,NotifySpecialActivity.class);

notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK

|Intent.FLAG_ACTIVITY_CLEAR_TASK);

//CreatesthePendingIntent

//當設置下面PendingIntent.FLAG_UPDATE_CURRENT這個參數的時候,常常使得點擊通知欄沒效果,你需要給notification設置一個獨一無二的requestCode

intrequestCode=(int)SystemClock.uptimeMillis();

PendingIntentpendIntent=PendingIntent.getActivity(this,requestCode,

notifyIntent,PendingIntent.FLAG_UPDATE_CURRENT);

notifyBuilder.setContentIntent(pendIntent);

繼續看配置文件的設置:

android:name="com.example.notificationtest.NotifySpecialActivity"

android:excludeFromRecents="true"

android:label="NotifySpecialActivity"

android:launchMode="singleTask"

android:taskAffinity="">

在代碼中,我們設置NotifySpecialActivity為我們要跳轉的界面,然後在xml的配置文件中,我們重點設置了這三個屬性:android:excludeFromRecents="true",android:launchMode="singleTask",android:taskAffinity="",第一個屬性的設置,是將該界面從最近任務欄當中移除,防止用戶通過最近任務欄而進入到該界面,這樣一來,只能通過通知來的點擊來進入。第二種屬性的設置就很常見了,是為了防止該界面存在的情況下,重復創建該Activity,第三屬性是為了配置代碼中的這段來設置的:

notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK

|Intent.FLAG_ACTIVITY_CLEAR_TASK);

這樣的作用是為此次跳轉界面的行為重新分配一個任務堆棧,而不從屬於其它的任務堆棧,這樣的話,當我們點擊返回鍵後,就可以直接返回到剛剛用戶所處的任務界面了。由於這裡我們不再使用TaskStackBuilder,所以最後需要調用PendingIntent.getActivity(this, requestCode,notifyIntent,PendingIntent.FLAG_UPDATE_CURRENT)這個方法來構造一個PendingIntent,然後賦值給notifyBuilder。這樣,剛剛討論過的第二種情形,我們就可以解決了,相比較第一種來說,這種解決方式更為簡潔,不過處理的業務邏輯也不一樣,大家斟酌而定。

Notificaton在平時的產品設計中,常常用來顯示跟網絡交互的進度,我們常常的做法是在通知欄上面,顯示一個進度條,用來更新交互的進度,這個的實現方式很簡單,主要依賴於mBuilder.setProgress()這個方法,具體的做法可以參考下面的代碼:

finalNotificationManagermNotifyManager=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);

finalNotificationCompat.BuildermBuilder=newNotificationCompat.Builder(

this);

mBuilder.setContentTitle("PictureDownload")

.setContentText("Downloadinprogress")

.setSmallIcon(R.drawable.small);

newThread(newRunnable(){

@Override

publicvoidrun(){

intincr;

for(incr=0;incr<=100;incr+=5){

//mBuilder.setProgress(100,incr,false);

mBuilder.setProgress(0,0,true);

mNotifyManager.notify(NOTIFY_ID,mBuilder.build());

try{

Thread.sleep(1*1000);

}catch(InterruptedExceptione){

}

}

mBuilder.setContentText("Downloadcomplete").setProgress(0,0,

false);

mNotifyManager.notify(NOTIFY_ID,mBuilder.build());

}

}

//Startsthethreadbycallingtherun()methodinitsRunnable

).start();

}

在代碼中,我們開啟了一個線程,裡面進行20次for循環,每次循環都會調用setProgress這個方法,因為每次調用的NOTIFY_ID都是相同的,所以系統會根據這個ID來更新notification的進度而不會重新創建一個新的Notification。setProgress這個方法一共有兩種方法,一種是這樣的:

mBuilder.setProgress(100,incr,false);

第一個參數指的的是進度的總長度,第二個參數是目前進行的長度,然後將第三個參數設為false,我們可以看到的效果就如下圖:

 

技術分享

 

我們可以看見進度條的確切位置和進度情況。還有一種使用方法是這樣的:

mBuilder.setProgress(0,0,true);

將前兩個參數都設為0,然後將最後這個參數設為true,這樣的進度條效果是一種連續模糊的,適合進行時間不確定的網絡連接,效果圖如下:

 

技術分享

 

最後,當我們的任務完成後,我們需要取消進度條的顯示,這時候我們需要調用如下方法:

mBuilder.setContentText("Downloadcomplete").setProgress(0,0,

false);

設置一個任務完成後的文本描述,然後將setProgress的前兩個參數都設為0,最後一個參數設為false,這樣進度條就不會在通知欄上面顯示了,效果圖:

 

技術分享

 

Notification的進度條的使用方法就是這些,如果大家平時用的不多,最好還是根據上面貼出的源代碼,自己聯系一遍,稍候我也會把本次工程的源代碼打包,上傳到CSDN的資源庫中,供大家參考。

上面跟大家介紹的,都是Notification的一種常規樣式,自從Android4.1之後,谷歌引入了一種新的樣式,叫做Big View,效果就是相對於傳統的Notification,它的顯示區域更大,顯示的內容也更多一些。關於Big View,谷歌支持了三種模式,分別是:

Big text style還有newNotificationCompat.Builder(

this).setSmallIcon(R.drawable.small)

.setContentTitle("Picturetracker")

.setContentText("Picturereceived");

NotificationCompat.BigPictureStylepicStyle=newNotificationCompat.BigPictureStyle();

Bitmapbitmap=BitmapFactory.decodeResource(getResources(),R.drawable.bigpic);

picStyle.bigPicture(bitmap);

mBuilder.setStyle(picStyle);

NotificationManagermNotifyManager=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);

mNotifyManager.notify(NOTIFY_ID,mBuilder.build());

首先我們實例化一個NotificationCompat.BigPictureStyle,然後讀取要展示的圖片資源,調用picStyle.bigPicture(bitmap)這個方法設置圖片,最後調用notifyBuilder的mBuilder.setStyle(picStyle)方法,設置好BIG VIEW的樣式,就OK了,代碼簡單的令人發指,我就不多解釋了,大家參考上面的示例代碼即可。

接下來,我們再看看Inbox style這種樣式是如何設置的:

NotificationCompat.BuildermBuilder=newNotificationCompat.Builder(

this).setSmallIcon(R.drawable.small)

.setContentTitle("Inboxtracker")

.setContentText("Inboxreceived");

NotificationCompat.InboxStyleinboxStyle=newNotificationCompat.InboxStyle();

String[]events=newString[6];

events[0]="Hellomyoneworld";

events[1]="Hellomytwoworld";

events[2]="Hellomythreeworld";

events[3]="Hellomyfourworld";

events[4]="Hellomyfiveworld";

events[5]="Hellomysixworld";

inboxStyle.setBigContentTitle("Inboxtrackerdetails:");

for(inti=0;iinboxStyle.addLine(events[i]);

}

inboxStyle.setBigContentTitle("Thersaresixmessages");

inboxStyle.setSummaryText("It‘ssoeasy,right?");

mBuilder.setStyle(inboxStyle);

NotificationManagermNotifyManager=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);

mNotifyManager.notify(NOTIFY_ID,mBuilder.build());

唉,代碼是不是再簡單不過了,我都不好意思班門弄斧的介紹這段代碼了。主要聲明一下三個方法的使用吧,inboxStyle.addLine(),這個方法是用來設置下圖中黃色區域的文字,inboxStyle.setBigContentTitle("Thers are six messages")這個方法是用來設置紅色區域的文字內容,inboxStyle.setSummaryText("It‘s so easy,right?")是用來設置綠色區域的內容顯示,其他的基本設置在之前的內容中,都已經介紹了很多了,我就不重復介紹了。

 

技術分享

 

通過上面的學習,想必大家已經對Notification有了一個比較全面的了解了,最後, 我再給大家介紹一種自定義 Notification布局的用法。自定義Notification布局的app有很多,比如像墨跡天氣,Clean Master等等,利用自定義布局,將用戶所需信息和快捷功能,多樣化的展示在通知欄上面,給大家看一下Clean Master的截圖:

 

技術分享

 

其實要是實現這種自定義布局的Notification,非常簡單,我們這就給大家展示代碼設置和布局配置:

先看看java代碼:

NotificationCompat.BuildermBuilder=newNotificationCompat.Builder(this);

RemoteViewsremoteView=newRemoteViews(getPackageName(),R.layout.remote);

remoteView.setTextViewText(R.id.text,"CustomText");

remoteView.setTextViewText(R.id.btn,"CustomButton");

remoteView.setImageViewResource(R.id.image,R.drawable.ic_launcher);

IntentnotifyIntent=newIntent(this,NotifySpecialActivity.class);

notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK

|Intent.FLAG_ACTIVITY_CLEAR_TASK);

//CreatesthePendingIntent

//當設置下面PendingIntent.FLAG_UPDATE_CURRENT這個參數的時候,常常使得點擊通知欄沒效果,你需要給notification設置一個獨一無二的requestCode

intrequestCode=(int)SystemClock.uptimeMillis();

PendingIntentpendIntent=PendingIntent.getActivity(this,requestCode,

notifyIntent,PendingIntent.FLAG_UPDATE_CURRENT);

remoteView.setOnClickPendingIntent(R.id.btn,pendIntent);

mBuilder.setSmallIcon(R.drawable.small);

mBuilder.setContent(remoteView);

NotificationManagermNotifyManager=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);

mNotifyManager.notify(NOTIFY_ID,mBuilder.build());

再來看看xml布局文件是什麼樣的:

android:layout_height="64dp">

android:id="@+id/image"

android:layout_width="wrap_content"

android:layout_height="match_parent"

android:layout_alignParentLeft="true"

android:gravity="center"/>

android:id="@+id/text"

android:layout_width="wrap_content"

android:layout_height="match_parent"

android:layout_centerInParent="true"

android:gravity="center"/>

android:id="@+id/btn"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentRight="true"

android:gravity="center"/>

我們首先利用下面這行代碼去解析上面的布局文件

RemoteViewsremoteView=newRemoteViews(getPackageName(),R.layout.remote);

然後根據每個控件的id號進行資源設置:

remoteView.setTextViewText(R.id.text,"CustomText");

remoteView.setTextViewText(R.id.btn,"CustomButton");

remoteView.setImageViewResource(R.id.image,R.drawable.ic_launcher);

我們也可以為這些控件單獨設置點擊事件,比如設置Button的點擊事件:

remoteView.setOnClickPendingIntent(R.id.btn,pendIntent);

上面第二個參數pendingIntent的獲取,在之前的講解中,已經介紹了好幾種方式了,這裡我們隨便選擇一種來實現了:

IntentnotifyIntent=newIntent(this,NotifySpecialActivity.class);

notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK

|Intent.FLAG_ACTIVITY_CLEAR_TASK);

//CreatesthePendingIntent

//當設置下面PendingIntent.FLAG_UPDATE_CURRENT這個參數的時候,常常使得點擊通知欄沒效果,你需要給notification設置一個獨一無二的requestCode

intrequestCode=(int)SystemClock.uptimeMillis();

PendingIntentpendIntent=PendingIntent.getActivity(this,requestCode,

notifyIntent,PendingIntent.FLAG_UPDATE_CURRENT);

最後,我們要調用下面這段代碼,將自定義的RemoteView設置給notifyBuilder,然後調用發送通知的方法就OK了。

mBuilder.setContent(remoteView);

最後的最後,需要再給大家介紹兩個方法,那就是通過代碼來取消Notification,咱不能只管殺不管埋啊,哈哈~

NotificationManagercancelNotificationManager=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);

cancelNotificationManager.cancel(NOTIFY_ID);

cancelNotificationManager.cancelAll();

cancelNotificationManager.cancel(NOTIFY_ID)這個方法是根據之前發布通知時,分配的ID號,來取消對應的通知欄。cancelNotificationManager.cancelAll()這個方法是取消所有之前發布過的通知欄,比較暴力一點哈。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved