Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android開發入門:Toast and Notification使用介紹

Android開發入門:Toast and Notification使用介紹

編輯:Android開發實例

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

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

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

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

  1. 直接使用靜態方法:makeText(Context, int/CharSequence,int);
    1.  
      1. Toast toast = Toast.makeText(UsingIntent.this, "Some thing you want to show", Toast.LENGTH_LONG);toast.show(); 

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

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

  1. // LayoutInflater inflater = (LayoutInflater) YouAcvity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); A  
  2.                                      View view = getLayoutInflater().inflate(your_layout_file,null); //B :A,B二者中選其一即可,在這裡只是提供二種途徑  
  3.                                      Toast toast = new Toast(YouActivity.this);  
  4.                                      toast.setDuration(Toast.LENGTH_LONG);  
  5.                                      toast.setView(view);  
  6.                                      toast.show(); //別忘記invoke show方法  

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

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

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

  1. try {  
  2.   Field field =toast.getClass().getDeclaredField("mTN");                               
  3.     field.setAccessible(true); Object object = field.get(toast);  
  4.   Method method=object.getClass().getDeclaredMethod("show",null);  
  5.   //object 最後定義在類裡面,這樣方面多次使用,比如關閉Toast  
  6.   method.invoke(object,new Object[0]);  
  7.   //new Object[0]可以用null代替,但是因為是可變參數,所以最好使用new Object[0]   
  8.   } catch (Exception e)  
  9.   {  
  10.    e.printStackTrace();  
  11.   } 

  如果有關閉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: 

  1. <?xml version="1.0" encoding="utf-8"?> 
  2.  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.      android:orientation="vertical" android:layout_width="fill_parent" 
  4.      android:layout_height="fill_parent"> 
  5.    
  6.      <Button 
  7.          android:id="@+id/notification_demo1" 
  8.          android:layout_width="match_parent" 
  9.          android:layout_height="wrap_content" 
  10.          android:text="@string/notification_btn_string1" 
  11.          /> 
  12.      <Button 
  13.          android:id="@+id/notification_demo2" 
  14.          android:layout_width="match_parent" 
  15.          android:layout_height="wrap_content" 
  16.          android:text="@string/notification_btn_string2" 
  17.          /> 
  18.      <Button 
  19.          android:id="@+id/notification_demo2_1" 
  20.          android:layout_width="match_parent" 
  21.          android:layout_height="wrap_content" 
  22.          android:text="@string/notification_btn_string2_1" 
  23.          /> 
  24.      <Button 
  25.          android:id="@+id/notification_demo3" 
  26.          android:layout_width="match_parent" 
  27.          android:layout_height="wrap_content" 
  28.          android:text="@string/notification_btn_string3" 
  29.          /> 
  30.      <Button 
  31.          android:id="@+id/notification_demo4" 
  32.          android:layout_width="match_parent" 
  33.          android:layout_height="wrap_content" 
  34.          android:text="@string/notification_btn_string4" 
  35.          /> 
  36.      <Button 
  37.          android:id="@+id/notification_demo5" 
  38.          android:layout_width="match_parent" 
  39.          android:layout_height="wrap_content" 
  40.          android:text="@string/notification_btn_string5" 
  41.          /> 
  42.  </LinearLayout> 

Code

  1. package com.ringcentral.wolf.ch04;  
  2.    
  3.    
  4.  import com.ringcentral.wolf.R;  
  5.  import com.ringcentral.wolf.ch03.UsingIntent;  
  6.    
  7.  import android.app.Activity;  
  8.  import android.app.Notification;  
  9.  import android.app.NotificationManager;  
  10.  import android.app.PendingIntent;  
  11.  import android.content.Intent;  
  12.  import android.os.Bundle;  
  13.  import android.support.v4.app.NotificationCompat;  
  14.  import android.support.v4.app.TaskStackBuilder;  
  15.  import android.view.View;  
  16.  import android.view.View.OnClickListener;  
  17.  import android.widget.Button;  
  18.    
  19.  public class NotificationTest extends Activity implements OnClickListener {  
  20.      private NotificationManager nManager;  
  21.      private Button demo1;  
  22.      private Button demo2;  
  23.      private Button demo2_1;  
  24.      private Button demo3;  
  25.      private Button demo4;  
  26.      private Button demo5;  
  27.        
  28.      NotificationCompat.Builder builder;  
  29.      @Override 
  30.      public void onCreate(Bundle savedInstanceState    ){  
  31.          super.onCreate(savedInstanceState);  
  32.          setContentView(com.ringcentral.wolf.R.layout.notification);  
  33.          nManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);  
  34.          demo1 = (Button) findViewById(R.id.notification_demo1);  
  35.          demo2 = (Button) findViewById(R.id.notification_demo2);  
  36.          demo2_1= (Button) findViewById(R.id.notification_demo2_1);  
  37.          demo3 = (Button) findViewById(R.id.notification_demo3);  
  38.          demo4 = (Button) findViewById(R.id.notification_demo4);  
  39.          demo5 = (Button) findViewById(R.id.notification_demo5);  
  40.          builder = new NotificationCompat.Builder(this);  
  41.        
  42.            
  43.          demo1.setOnClickListener(this);  
  44.          demo2.setOnClickListener(this);  
  45.          demo3.setOnClickListener(this);  
  46.          demo4.setOnClickListener(this);  
  47.          demo5.setOnClickListener(this);  
  48.          demo2_1.setOnClickListener(this);  
  49.      }  
  50.        
  51.      @SuppressWarnings("deprecation")  
  52.      private void demo1(int id){  
  53.          /**  
  54.           * 也可以調用構造方法,設置屬性  
  55.           */ 
  56.          Notification notification = new Notification();  
  57.          notification.icon = R.drawable.smile;  
  58.          notification.number = 2<<2;  
  59.          notification.when = System.currentTimeMillis();  
  60.          notification.tickerText="You have a new message!! Come from Demo1";  
  61.          notification.defaults=Notification.DEFAULT_SOUND;  
  62.          //notification.flags =Notification.FLAG_NO_CLEAR;  
  63.          notification.flags=Notification.FLAG_ONGOING_EVENT;  
  64.            
  65.          PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, getIntent(), 0);  
  66.          notification.setLatestEventInfo(this, "Demo1", "First notification Message with Demo1!", pendingIntent);  
  67.            
  68.          nManager.notify(id,notification);  
  69.            
  70.      }  
  71.        
  72.      private void demo2(int id){  
  73.          builder.setSmallIcon(R.drawable.smile)  
  74.          .setContentTitle("Demo2")  
  75.          .setContentText("Using 'NotificationCompat.Builder '");  
  76.          builder.setDefaults(Notification.DEFAULT_VIBRATE).setTicker("You have a new message!! Come from Demo2");  
  77.            
  78.          Intent intent = new Intent(this,UsingIntent.class);  
  79.            
  80.          TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);  
  81.          stackBuilder.addParentStack(UsingIntent.class);  
  82.          stackBuilder.addNextIntent(intent);  
  83.            
  84.          PendingIntent pendingIntent = stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);  
  85.            
  86.          builder.setContentIntent(pendingIntent);  
  87.          nManager.notify(id, builder.build());  
  88.      }  
  89.      private void demo2_1(int id){  
  90.          builder.setSmallIcon(R.drawable.smile)  
  91.          .setContentTitle("Demo2_1")  
  92.          .setContentText("Using 'getActivity '");  
  93.          builder.setDefaults(Notification.DEFAULT_VIBRATE).setTicker("You have a new message!! Come from Demo2_1");  
  94.            
  95.          Intent intent = new Intent(this,UsingIntent.class);  
  96.          intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK );  
  97.            
  98.          PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);  
  99.          builder.setContentIntent(pendingIntent);  
  100.          nManager.notify(id, builder.build());  
  101.      }  
  102.      private void clear1(int id){  
  103.          nManager.cancel(id);  
  104.      }  
  105.      private void clearAll(){  
  106.          nManager.cancelAll();  
  107.      }  
  108.      /**  
  109.       * 如果要更新通知,簡單:保持 id 不變,進行重新繪制;新產生的通知會自動覆蓋舊通知!!!  
  110.       */ 
  111.      private void update(int id){  
  112.          builder.setContentTitle("Update Demo2");  
  113.          builder.setContentText("Update Demo");  
  114.          builder.setDefaults(Notification.DEFAULT_VIBRATE).setTicker("Updte a new message!! Come from Demo2");  
  115.          Intent intent = new Intent(this,UsingIntent.class);  
  116.            
  117.          TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);  
  118.          stackBuilder.addParentStack(UsingIntent.class);  
  119.          stackBuilder.addNextIntent(intent);  
  120.            
  121.          PendingIntent pendingIntent = stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);  
  122.          builder.setContentIntent(pendingIntent);  
  123.          nManager.notify(id, builder.build());  
  124.            
  125.      }  
  126.      @Override 
  127.      public void onClick(View v) {  
  128.          switch (v.getId()) {  
  129.          case R.id.notification_demo1:  
  130.              demo1(R.id.notification_demo1);  
  131.              break;  
  132.          case R.id.notification_demo2:  
  133.              demo2(R.id.notification_demo2);  
  134.              break;  
  135.          case R.id.notification_demo2_1:  
  136.              demo2_1(R.id.notification_demo2);  
  137.              break;  
  138.          case R.id.notification_demo3:  
  139.              clear1(R.id.notification_demo1);  
  140.              break;  
  141.          case R.id.notification_demo4:  
  142.              clearAll();  
  143.              break;  
  144.          case R.id.notification_demo5:  
  145.              update(R.id.notification_demo2);  
  146.              break;  
  147.          default:  
  148.              break;  
  149.          }  
  150.            
  151.      }  
  152.        
  153.  } 

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

  1. <uses-permission android:name="android.permission.VIBRATE"/> 

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

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

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

  • 創建後台推棧基於Intent啟動的Activity
  1. 先創建Intent對象
  2. TaskStackBuilder.create()來創建一個任務棧
  3. 調用addParentStack()把後台推棧添加到棧中,調用addNextIntent()來添加Intent對象
  4. 用TastStackBuilder對象調用getPendingIntent()獲得一個PendingIntent。
  5. 最後調用:setContentIntent把PendingIntent對象作為參數。
  •  不創建後台推棧,可以設置一個專用的Activity
  1. 第一步也是先創建Intent對象
  2. 設置Flags:   
    1. intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK ); 
  3. PendingIntent.getActivity(.....)
  4. 最後調用:setContentIntent把PendingIntent對象作為參數。

 Demo程序主界面:

 

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