Android開發之Toast and Notification

來源:互聯網
上載者:User

Toast: http://developer.android.com/reference/android/widget/Toast.html 

  在部分手機中如果當把編輯完的訊息發送完成之後,通常在手機下方會出現:”訊息發送成功“的提示訊息或相類似的提示訊息,並且通常會短暫的停留之後會自動消失;那麼這個就是一個典型的Toast應用;

  訊息提示框的種類有多種比如說:Dialog(在以後章節中會介紹)。而Toast與Dialog不同:Dialog是以獨佔的方式顯示的,換句話說就是:如果不關閉它Dialog會一直顯示於當前介面,而Toast則會短暫的停留之後自動關閉;

  實現Toast其實很簡單,在這裡介紹三種方式:

    調用makeText方法,會以文本的方式來進行顯示,因為它預設載入一個TextView,而第三參數可以通過:Toast的二個靜態域LENGTH_LONG/LENGTH_SHORT來進行設定; 之所以返回一個Toast是為了方便擴充,比如調用setDuration方法;

  2.  添加一些自己想要的效果,個人覺得有點像重寫makeText方法的味道

  

// LayoutInflater inflater = (LayoutInflater) YouAcvity.= getLayoutInflater().inflate(your_layout_file,=  Toast(YouActivity.

  3.   Toast訊息提示框會在一定時間後自動消失,如果想永遠停留該怎麼辦呢?能不能做得到呢?

      首先告訴你永遠停留是可以做得到的,可怎麼去實現呢?

      查看源碼後獲知,Toast.show方法是採用隊列來進行顯示,系統會依次取出一個Toast並顯示,等到一定的時間後它會自動消失,系統再會取出下一Toast,直接在整個隊列中沒有Toast為止;在Toast類有個私人的靜態內部類叫作:TN;因為TN是私人,那麼該如何訪問呢? 答案是反射。

   Field field =toast.getClass().getDeclaredField("mTN");                             
field.setAccessible(); Object object = Method method=object.getClass().getDeclaredMethod("show", 5 //object 最後定義在類裡面,這樣方面多次使用,比如關閉Toast method.invoke(object, Object[0 //new Object[0]可以用null代替,但是因為是可變參數,所以最好使用new Object[0] 7 } }

  如果有關閉Toast,可以使用(//method =object.getClass().getDeclaredMethod("hide",null););同時Toast提供一個其它的方法比如:setGravity方法;    

Notification:  http://developer.android.com/reference/android/app/Notification.html

  • 理論基礎:
    •   狀態條與狀態列:用圖說明可能會更清楚,請見!
      • 狀態條:
      • 狀態列:,需要執行下拉動作,才可以查看整個狀態列具體資訊。
      • 關係:狀態列包含狀態條!
    • Notification 有這些組件:
      • 內容標題
      • 大表徵圖 : 通常顯示在左側
      • 內容文本
      • Content info: 譯為備忘資訊應該會好點,Anyway ,you can believe your choice.
      • 小表徵圖
      • 時間戳記
  • 如何運用Notification
    • 擷取NotificationManager對象
    • 獲得Notification對象
    • 設定Notification屬性
    • 設定PendingIntent
    • Invoke notify方法

總體分這五步!!!

Notification設計哲學是:管理通知對象,通知實體物件,Build對象(內部類),以及PendingIntent!

管理通知對象:NotificationManager: 擁有發布,更新,取消等通知功能。

通知實體物件:擁有多個實體屬性

Build對象:用於建立通知實體物件以及設定相關屬性

PendingIntent: 如果要啟動新的Activity通常是調用startActivity,startActivityForResult;而PendingIntent是對Intent的進一步封裝,以便當我們查看Notification執行相應動作時轉入對應的Activity.

在Andorid 3.0以下建立通知對象通常是直接利用:Notification的構建函數進行,而伴隨的Android os的更新升級,更多時候是使用另外二個支援類(內部類):NotificationCompat.Builder,Notification.Builder 這二者功能類似,主要區別在於:NotificationCompat.Builder可以相容API level 4,並且它是由:SupportLibrary提供。

實碼演練:這時提供一個小Demo。

Layout file: 

View Code

Code

NotificationTest Activity nManager = demo1 = demo2 = demo2_1= demo3 = demo4 = demo5 = builder = NotificationCompat.Builder( demo1.setOnClickListener( demo2.setOnClickListener( demo3.setOnClickListener( demo4.setOnClickListener( demo5.setOnClickListener( demo2_1.setOnClickListener( @SuppressWarnings("deprecation" demo1( Notification notification = notification.icon = notification.number = 2<<2 notification.when = notification.tickerText="You have a new message!! Come from Demo1" notification.defaults= notification.flags= PendingIntent pendingIntent = PendingIntent.getActivity(, 0, getIntent(), 0 notification.setLatestEventInfo(, "Demo1", "First notification Message with Demo1!" demo2( .setContentTitle("Demo2" .setContentText("Using 'NotificationCompat.Builder '" builder.setDefaults(Notification.DEFAULT_VIBRATE).setTicker("You have a new message!! Come from Demo2" Intent intent = Intent(,UsingIntent. TaskStackBuilder stackBuilder = TaskStackBuilder.create( stackBuilder.addParentStack(UsingIntent. PendingIntent pendingIntent = stackBuilder.getPendingIntent(0 demo2_1( .setContentTitle("Demo2_1" .setContentText("Using 'getActivity '" builder.setDefaults(Notification.DEFAULT_VIBRATE).setTicker("You have a new message!! Come from Demo2_1" Intent intent = Intent(,UsingIntent. intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK| PendingIntent pendingIntent = PendingIntent.getActivity(, 0 clear1( update( builder.setContentTitle("Update Demo2" builder.setContentText("Update Demo" builder.setDefaults(Notification.DEFAULT_VIBRATE).setTicker("Updte a new message!! Come from Demo2" Intent intent = Intent(,UsingIntent. TaskStackBuilder stackBuilder = TaskStackBuilder.create( stackBuilder.addParentStack(UsingIntent. PendingIntent pendingIntent = stackBuilder.getPendingIntent(0 }View Code

如果要有震動效果,請在manifest file中設定:

 

 備忘:這隻是提供Demo代碼,並不能直接複製,如果要練習,要本地化;另外UsingIntent類很簡單就是一Activity,因為在這裡就沒有提供。

如果是android 4.1及以後本版,還可以使用BigView,考慮到普及率不高,這裡不於解釋,感興趣的同學可以直接上官網。

利用PendingIntent設定Activity比較重要,它有二種方式:

  • 建立後台推棧基於Intent啟動的Activity
  •  不建立後台推棧,可以設定一個專用的Activity

 Demo程式主介面:

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.