Android技巧小結之新舊版本Notification

來源:互聯網
上載者:User

標籤:android   io   ar   os   使用   sp   on   art   log   

最近開發用到了通知功能,但有幾個地方老是提示deprecated,然後就找了篇文章學習了下新舊版本的不同。

Notification即通知,用於在通知欄顯示提示資訊。

在較新的版本中(API level  > 11),Notification類中的一些方法被Android聲明deprecated(棄用),其實基本上相當於全部棄用了,因為這個類本身方法就少得可憐。

Android官方聲明棄用,一定有它的理由,雖然我也不知道是什麼。奈何本人輕度強迫症患者,人家都建議你不要用了,那就不要老是恪守著N年前的東西了。

就像是以前,一說到標籤頁,大家基本上都會想到TabHost配合ActivityGroup,但Android後來提倡Fragment。

廢話說多了,還是小結一下使用方法。下面按照建立一個通知的步驟一步一步來,同時給出新舊實現方法。

1、擷取Notification管理器

NotificationManager noteMng = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);

 

2、建立一個Notification,設定狀態列顯示樣式

private Notification note;
//API 11以下
note = new Notification(R.drawable.ico_launcher "顯示於螢幕頂端狀態列的文本", System.currentTimeMillis());
//API 11及以上
Notification.Builder builder = new Notification.Builder(nowContext).setTicker("顯示於螢幕頂端狀態列的文本")
.setSmallIcon(R.drawable.ic_laucher);

API 11以上版本中,狀態列顯示的樣式跟下拉通知欄中顯示的樣式,可以一起設定,就是通過Notification.Builder類來實現,這裡的Builder只調用了兩個方法來設定狀態列顯示樣式。

 

3、設定Notification標誌位(非必要步驟)
//FLAG_ONGOING_EVENT表明有程式在運行,該Notification不可由使用者清除
note.flags = Notification.FLAG_ONGOING_EVENT;

 

4、設定點擊Notification後的觸發事件
//通過Intent,使得點擊Notification之後會啟動新的Activity
Intent i = new Intent(nowContext, AnotherActivity.class);
//該標誌位表示如果Intent要啟動的Activity在棧頂,則無須建立新的執行個體
i.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(nowContext, 100, i, PendingIntent.FLAG_UPDATE_CURRENT);

 

5、設定Notification在通知欄裡的樣式
(1)系統預設樣式
//API 11以下:
note.setLatestEventInfo(nowContext, "take me to your heart", "Micheal learn to rock", pendingIntent);

//API 16及以上,build()方法要求API 16及以上

//一會API 11以上,一會API16以上,我也很想知道Android的API是怎麼設計的
note = builder.setContentIntent(pendingIntent).setContentTitle("title").setContentText("text").build();

(2)自訂樣式:

自訂樣式,就是讓Notification在通知欄顯示成自訂的xml布局
應當注意的是,Notification的自訂樣式,只支援以下可視組件:
FrameLayout, LinearLayout, RelativeLayout
TextView, Button, AnalogClock, ImageView, ImageButton, Chronometer, ProgressBar

RemoteView view = new RemoteView(nowActivity.getPackageName(), R.layout.note_layout);
//API 11以下
note.contentView = view;
note.contentIntent = pendingIntent;
//API 16及以上,又是build()方法導致的,汗。。
note = builder.setContent(view).setContentIntent(pendingIntent).build();

這個步驟裡有一個很值得注意的地方:pendingIntent被設定為note的contentIntent的值,就意味著點擊了這個通知才會觸發該Intent。

那麼如果只是想讓自訂布局裡的某個按鈕觸發呢?比如說,弄了一個音樂播放器,Service負責播放音樂,Notification顯示當前播放進度和一些簡單的暫停按鈕、上一首、下一首按鈕,讓使用者不用再開啟介面就可以通過Notification上的按鈕操縱音樂播放。

假設說想讓自訂布局裡的一個id為R.id.button1的按鈕來觸發這個Intent,可以如下操作:

view.setOnClickPendingIntent(R.id.button1, pendingIntent);//在上面建立RemoteView執行個體後加上這句

然後注意,pendingIntent已經綁定到按鈕上了,上面Notificatiion執行個體中,設定contentIntent的語句要去掉。

 

6、發布該通知,第一個參數為該notification的ID
noteMng.notify(10, note);

 

在編碼的時候,如果你的minSdkVersion設定的不符合,會立即提示你的。所以你要考慮下要滿足的最小版本情況,具體可以根據當時的各個版本的佔有量來衡量下,當然了,希望大家推進新版本的使用,盡量用新版本的開發代碼進行開發。

如果採用新版本的android16版本以下的在安裝的時候就會提示Failure [INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION]。這個就是因為設定的minSdkVersion太大的原因。如果相容的話改成小些的版本號碼就可以安裝了。

Android技巧小結之新舊版本Notification

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.