Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android開發之Notification(一)

android開發之Notification(一)

編輯:關於Android編程

“我沒有很聰明,也不是那麼努力,我只是有點不服輸”

0x01.簡介

A notification is a message you can display to the user outside of your application's normal UI. When you tell the system to issue a notification, it first appears as an icon in thenotification area. To see the details of the notification, the user opens thenotification drawer. Both the notification area and the notification drawer are system controlled areas that the user can view at any time.

--引用谷歌關於Notification的描述

Notification是一個將你程序的消息展示在程序之外的UI控件,當你告訴系統去產生一個Notification時,它會在Notification area出現一個圖標,你可以打開Notification drawer去看詳細的信息。Notification are 和Notification drawer都是系統控制的區域,用戶可以隨時看到。

Notification不僅僅用於顯示一則消息,也可以用於和用戶進行交互。比如音樂播放,它的Notification具有音樂控制功能,並且在android7.0(api level 24)上Notification可以直接通過Notification進行回復,比如有一則微信消息,你可以通過下拉框直接回復啦,不用通過點進去再回復了,我想在Android7.0系統上,微信和QQ應該會這麼做。效果圖如圖1.0(引用谷歌官網)。

\

圖1.0

 

0X02.最簡單的Notification

在Android2.0之前谷歌提供的是Notification類去構建一個Notification通知,而在之後supportV4包中引入了NotificationCompat來代替Notification類來構建,其中的原因我也不明白。即使谷歌在android3.0的時候在Notification類中加上Notification.Build類用於構造Notification,也不能逃脫Notification被淘汰的命運,這篇博客整篇都是用NotificationCompat來構造。值得一提,對於NotificationCompat.Build(this)這是采用設計模式中的構造模式。 谷歌說如果你想構造一個Notification你會用到Notification.Build類中很多方法,但是你必須要用到以下3個方法: setContentTitle() 設置Notification標題setContentText() 設置Notification內容setSmallIcon() 設置Notification小圖標(對,還有setLargeIcon不同圖片用於不同的設備) 谷歌說一定要有這3個方法其實是不對的,因為如果你使用自定義布局的Notification就不會涉及到這3個。但是毋庸置疑大部分都還是需要設置這3個屬性的。Notification當然除了這些屬性還有別可選屬性,但是谷歌還是建議你在可選屬性上至少選一個,不然用戶點了你的Notification什麼反應都沒有會讓人覺得很傻。 做一個最簡單的例子,構建一個Notification顯示出來。  
        NotificationCompat.Builder build = new NotificationCompat.Builder(this);//定義一個創建Notification的build
        build.setContentTitle("this is title").setContentText("this is text").setSmallIcon(R.mipmap.ic_launcher);//為Notification設置所需要的屬性
        NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);//獲取系統Notification服務
        manager.notify(0, build.build());//顯示
上面這個代碼是用來顯示一個Notification,並且點擊通知後會進入SpecialNotificationActivity這個Activity中。然後按退出呢,就退回原來的界面了。上面是一個最簡單的例子設置一個Notification。僅僅設置了必須的3個屬性。它只能用來通知一則消息。方法notify(int id, Notification notification),是通知系統加載這個Notificantion,一個應用程序中id不同,Notification就會不同。我們就可以通過id更新不同的Notification了。

0X03.結合PendingIntent的Notification

有的時候我們的需要為我們的Notification增加點擊事件。比如說一則郵件通知,當用戶點擊的時候,需要提供一個更為詳細的頁面用於展示具體的內容,那就需要在系統中啟動我們特定的Activity。我們一般都是用Intent從我們App的一個Activity跳到另外一個Activity,從外部啟動我們的的Activity,SDK提供了一個類是PendingIntent,有了這個我們就可以從系統啟動我們的組件了(如果大家需要詳細介紹,大家可以留言,我會把這個類的學習mark一下)。
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);//創建build對象
        builder.setContentTitle("this is title").setContentText("this is text").setSmallIcon(R.mipmap.ic_launcher);//設置必須的屬性
        Intent notifyIntent =  new Intent(this, SpecialNotificationActivity.class);//創建用於跳轉的Intent
        PendingIntent notifyPendingIntent = PendingIntent.getActivity(  this,
                        0,
                        notifyIntent,
                        PendingIntent.FLAG_UPDATE_CURRENT
                );//獲得可以在別的應用可以用的Intent,別名PendingIntent。
        builder.setContentIntent(notifyPendingIntent);//設置外部應用需要用的PendingIntent
        NotificationManager mNotificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);//獲取系統的Notification服務
        mNotificationManager.notify(0, builder.build());//顯示這個Notification
PendingIntent是在Intent的上面進行進一步的封裝,getActivity(Context context, int requestCode, Intent intent, int flag)可以獲得一個PendingIntent。我們看下具體的參數 \ context,intent就不說了,requestCode是和flag配套使用的,requestCode是用來標記PendingIntent是否相同,當flags設成FLAG_UPDATE_CURRENT時,並且賦給一個Notification,它會更新所有和它有相同的requestCode的PendingIntent內容(一個APP情況下),即使Notification擁有不用的ID。比如下面段代碼
        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);//獲取系統的Notification服務
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
        builder.setContentTitle("this is title1").setContentText("this is special").setSmallIcon(R.mipmap.ic_launcher);//設置必須的屬性
        Intent intent1 = new Intent(this, Activity1.class);
        PendingIntent pendingIntent2 = PendingIntent.getActivity(this, 0, intent1, PendingIntent.FLAG_CANCEL_CURRENT);
        builder.setContentIntent(pendingIntent2);
        notificationManager.notify(1, builder.build());
	//下面我們增加一個Notification,ID不相同,但是生成的PendingIntent的requestCode,並且把Flag設成FLAG_UPDATE_CURRENT.
        Intent intent2 = new Intent(this, Activity2.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent2, PendingIntent.FLAG_UPDATE_CURRENT);
        builder.setContentTitle("this is title 2");//顯示不同的標題
        builder.setContentIntent(pendingIntent);
        notificationManager.notify(2, builder.build());//ID不同就會顯示兩個Notification
一開始我們為title1設置的是跳轉到Activity1,為title2設置的是跳轉到Activity2。但是實際結果是點擊兩個都會跳轉到Activity2,這就是requestCode和flag共同下的作用,當第二個PendingIntent傳入Notification時,flag設置成FLAG_UPDATE_CURRENT,會更新所有requestCode和它相同的PendingIntent,所以Title1中的也被更新了。有位很詳細的介紹了PendingIntent的requestCode參數戳這查看。

0X04.自定義的Notification

當然可能自定義布局滿足不了我們,我們可以為Notification設定自己的布局。
       NotificationCompat.Builder build = new NotificationCompat.Builder(this);//定義一個創建Notification的build
        PendingIntent pi = PendingIntent.getActivity(this, 0, new Intent(this, Main2Activity.class), PendingIntent.FLAG_UPDATE_CURRENT);//獲得PendingIntent
        RemoteViews rm = new RemoteViews(getPackageName(), R.layout.notification_custom);//生成RemoteView
        rm.setOnClickPendingIntent(R.id.press_here_button, pi);//為其中一個按鈕設置點擊事件
        build.setContent(rm);//設置RemoteVIew
        NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);//獲取系統Notification服務
        manager.notify(0, build.build());//通知顯示


    
    
我們用RemoteViews(String packageName, int layoutId)實例化一個RemoteViews,第一個參數是你App安裝之後的地址,第二個是你布局文件的我id 我們通過setContent(RemoteView)這個方法設置自定義布局,這個時候setContentTitle等方法不會起作用了。setContent接受一個RemoteView這個類從名字也可以看出來,這是用來描述視圖可以用來在別的進程中展示。值得一提PendingIntent和RemoteView都繼承了Parcelable。 設置監聽setOnClickPendingIntent(int, PendingIntent)。我們可以啟動一些app的組件。

0X04.Notification的其它功能簡介

當然Notification還有很多其他的功能,不總結了,可以通過戳這到官網的介紹。 Builder.setPriority(int),這是一個設置Notification優先級的方法,值是從-2到2,沒有設置默認是0,沒有明確說明不同等級會有什麼區別,我麼自己應該明白當我們通知越緊急就把優先級設的越高。 Builder.setStyle(NotificationCompat.Style),這個方法可以用來顯示更多的信息,不僅僅只是設置text的內容 Builder.setAutoCancel(),創建的時候設置這個,用戶點擊的時候回自動取消 Builder.setProgress(max, progress, false),可以用來邊設置一個進度條的Notification  
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved