Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android源碼淺析--notification

android源碼淺析--notification

編輯:關於Android編程

類概述:   一個表示如何使用NotificationManager把一個持久的通知呈現給用戶的類。   The Notification.Builder has been added to make it easier to construct Notifications.   添加Notification.Builder使構建Notification更容易。               靜態變量:   [java]   /**     * Use all default values (where applicable).     */     public static final int DEFAULT_ALL = ~0;          /**     * Use the default notification sound. This will ignore any given     * {@link #sound}.     *      * @see #defaults     */      public static final int DEFAULT_SOUND = 1;        /**     * Use the default notification vibrate. This will ignore any given     * {@link #vibrate}. Using phone vibration requires the      * {@link android.Manifest.permission#VIBRATE VIBRATE} permission.     *      * @see #defaults     */      public static final int DEFAULT_VIBRATE = 2;          /**     * Use the default notification lights. This will ignore the     * {@link #FLAG_SHOW_LIGHTS} bit, and {@link #ledARGB}, {@link #ledOffMS}, or     * {@link #ledOnMS}.     *      * @see #defaults     */      public static final int DEFAULT_LIGHTS = 4;             定義了默認的燈、震動、聲音和全部屬性。震動的話需要添加android.permission.VIBRATE權限。   [java]        * Use this constant as the value for audioStreamType to request that       * the default stream type for notifications be used.  Currently the       * default stream type is STREAM_RING.       */       public static final int STREAM_DEFAULT = -1;             notification默認的音頻類型。   [java]   /**   * Bit to be bitwise-ored into the {@link #flags} field that should be   * set if you want the LED on for this notification.   * <ul>   * <li>To turn the LED off, pass 0 in the alpha channel for colorARGB   *      or 0 for both ledOnMS and ledOffMS.</li>   * <li>To turn the LED on, pass 1 for ledOnMS and 0 for ledOffMS.</li>   * <li>To flash the LED, pass the number of milliseconds that it should   *      be on and off to ledOnMS and ledOffMS.</li>   * </ul>   * <p>   * Since hardware varies, you are not guaranteed that any of the values   * you pass are honored exactly.  Use the system defaults (TODO) if possible   * because they will be set to values that work on any given hardware.   * <p>   * The alpha channel must be set for forward compatibility.   *    */   public static final int FLAG_SHOW_LIGHTS        = 0x00000001;      /**   * Bit to be bitwise-ored into the {@link #flags} field that should be   * set if this notification is in reference to something that is ongoing,   * like a phone call.  It should not be set if this notification is in   * reference to something that happened at a particular point in time,   * like a missed phone call.   */   public static final int FLAG_ONGOING_EVENT      = 0x00000002;      /**   * Bit to be bitwise-ored into the {@link #flags} field that if set,   * the audio will be repeated until the notification is   * cancelled or the notification window is opened.   */   public static final int FLAG_INSISTENT          = 0x00000004;      /**   * Bit to be bitwise-ored into the {@link #flags} field that should be   * set if you want the sound and/or vibration play each time the   * notification is sent, even if it has not been canceled before that.   */   public static final int FLAG_ONLY_ALERT_ONCE    = 0x00000008;      /**   * Bit to be bitwise-ored into the {@link #flags} field that should be   * set if the notification should be canceled when it is clicked by the   * user.  On tablets, the    */   public static final int FLAG_AUTO_CANCEL        = 0x00000010;      /**   * Bit to be bitwise-ored into the {@link #flags} field that should be   * set if the notification should not be canceled when the user clicks   * the Clear all button.   */   public static final int FLAG_NO_CLEAR           = 0x00000020;      /**   * Bit to be bitwise-ored into the {@link #flags} field that should be   * set if this notification represents a currently running service.  This   * will normally be set for you by {@link Service#startForeground}.   */   public static final int FLAG_FOREGROUND_SERVICE = 0x00000040;      /**   * Bit to be bitwise-ored into the {@link #flags} field that should be set if this notification   * represents a high-priority event that may be shown to the user even if notifications are   * otherwise unavailable (that is, when the status bar is hidden). This flag is ideally used   * in conjunction with {@link #fullScreenIntent}.   */   public static final int FLAG_HIGH_PRIORITY = 0x00000080;     FLAG_SHOW_LIGHTS: 如果想為Notification添加LED燈提示,需要在Flag屬性中添加FLAG_SHOW_LIGHT標志位。 LED關閉狀態下,0表示顏色或者LED燈開關 LED開啟狀態下,1代表LED開,0代表LED關。 LED閃爍狀態下,ledOnMS表示燈亮時間,ledOffMS表示燈滅時間。 因為硬件不一,所以不能保證在各種硬件上都能夠奏效,應盡可能使用系統給定的默認值(TODO),它能夠適配各種硬件。 alpha通道必須設置為向前兼容性 FLAG_ONGOING_EVENT: 如果需要notification常駐狀態欄,引用正在進行的活動,如一個打進的電話,需要在Flag屬性中添加FLAG_ONGOING_EVENT標志位。但是其不能引用一個過去已經發生的活動,如一個未接電話。(設置其Flag,notification將被放入“正在進行”組)         FLAG_INSISTENT: 設置此Flag,在通知取消或通知窗口打開之前,音頻會一直重復。 FLAG_ONLY_ALERT_ONCE: 設置此Flag,震動和聲音只執行一次。 FLAG_AUTO_CANCEL: 設置此Flag,當用戶點擊時,通知會被清除。 FLAG_NO_CLEAR: 設置此Flag,當用戶點擊清除所有按鈕時,該通知不被清除。 FLAG_FOREGROUND_SERVICE: 設置此Flag,表示該通知為正運行的服務(當你退出手機QQ時,在狀態欄會看到一個QQ圖標) FLAG_HIGH_PRIORITY: 一個過時的Flag,現在已使用優先級字段代替。設置該Flag表示一高優先級事件,當通知不可以使用(狀態欄被隱藏時)也可通知用戶,應配合fullScreenIntent使用。   常量 [java] view plaincopy /**   * The timestamp for the notification.  The icons and expanded views   * are sorted by this key.   */   public long when;      /**   * The resource id of a drawable to use as the icon in the status bar.   * This is required; notifications with an invalid icon resource will not be shown.   */   public int icon;      /**   * If the icon in the status bar is to have more than one level, you can set this.  Otherwise,   * leave it at its default value of 0.   *   * @see android.widget.ImageView#setImageLevel   * @see android.graphics.drawable#setLevel   */   public int iconLevel;      /**   * The number of events that this notification represents.  For example, in a new mail   * notification, this could be the number of unread messages.  This number is superimposed over   * the icon in the status bar.  If the number is 0 or negative, it is not shown in the status   * bar.   */   public int number;      /**   * The intent to execute when the expanded status entry is clicked.  If   * this is an activity, it must include the   * {@link android.content.Intent#FLAG_ACTIVITY_NEW_TASK} flag, which requires   * that you take care of task management as described in the   * <a href="{@docRoot}guide/topics/fundamentals/tasks-and-back-stack.html">Tasks and Back   * Stack</a> document.  In particular, make sure to read the notification section   * <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html#HandlingNotifications">Handling   * Notifications</a> for the correct ways to launch an application from a   * notification.   */   public PendingIntent contentIntent;      /**   * The intent to execute when the status entry is deleted by the user   * with the "Clear All Notifications" button. This probably shouldn't   * be launching an activity since several of those will be sent at the   * same time.   */   public PendingIntent deleteIntent;      /**   * An intent to launch instead of posting the notification to the status bar.   *   * @see Notification.Builder#setFullScreenIntent   */   public PendingIntent fullScreenIntent;      /**   * Text to scroll across the screen when this item is added to   * the status bar on large and smaller devices.   *   * <p>This field is provided separately from the other ticker fields   * both for compatibility and to allow an application to choose different   * text for when the text scrolls in and when it is displayed all at once   * in conjunction with one or more icons.   *   * @see #tickerView   */   public CharSequence tickerText;      /**   * The view to show as the ticker in the status bar when the notification   * is posted.   */   public RemoteViews tickerView;      /**   * The view that will represent this notification in the expanded status bar.   */   public RemoteViews contentView;      /**   * The bitmap that may escape the bounds of the panel and bar.   */   public Bitmap largeIcon;      /**   * The sound to play.   *    * <p>   * To play the default notification sound, see {@link #defaults}.    * </p>   */   public Uri sound;     when: 通知的時間戳,通知圖標會根據該時間戳在狀態欄進行排序。 icon: 在狀態欄中顯示的圖標,如果是無效資源,不予顯示。 iconLevel: 如果狀態欄中的icon有等級之分,可以設置此參數,默認情況下,一般為0. number: 通知事件發生的次數,比如一個郵件通知,這個參數表示未讀郵件數。這個數字會疊加到狀態欄中通知圖標上,如果為0或者負,則不顯示。 contentIntent: The intent to execute when the expanded status entry is clicked.當擴展狀態內容被點擊時觸發該intent(expanded status entry不知道該如何翻譯是好了)如果是要跳轉到一個Activity,一定要包含FLAG_ACTIVITY_NEW_TASK這個標志位,用於調整堆棧中的Task。能夠確保正確的從一個通知進入一個應用。 deleteIntent: 當用戶點擊“clean all button"或者滑動取消通知時觸發該Intent,不能啟動一個activity或者server(因為會在同一時間發送)。 fullScreenIntent: 全屏狀態下代替狀態欄中intent功能 tickerText: 當通知發送時像股票一樣提示文本。 contentView: 在狀態欄中代表Notification的View。 largeIcon: 可以脫離狀態欄的圖片 sound: 通知聲音 audioStreamType: 視頻播放流類型 vibrate: 震動類型 ledARGB: LED燈顏色 ledOnMS: LED燈閃爍時,燈亮時間。 ledOffMS: LED燈閃爍時,燈滅時間。 defaults: LED默認值。     構造函數   默認構造函數: [java]  /**   * Constructs a Notification object with everything set to 0.   * You might want to consider using {@link Builder} instead.   */   public Notification()   {       this.when = System.currentTimeMillis();   }     可以用Notification.Builder來替代構造一個Notification(關於Builder建造者模式 http://blog.csdn.net/aomandeshangxiao/article/details/8214646)。   [java]   /**       * @hide       */       public Notification(Context context, int icon, CharSequence tickerText, long when,               CharSequence contentTitle, CharSequence contentText, Intent contentIntent)       {           this.when = when;           this.icon = icon;           this.tickerText = tickerText;           setLatestEventInfo(context, contentTitle, contentText,                   PendingIntent.getActivity(context, 0, contentIntent, 0));       }     這個構造函數被hide,setLatestEventInfo方法也被deprecate,不建議使用,使用Notification.Builder即可。  /**      * Constructs a Notification object with the information needed to      * have a status bar icon without the standard expanded view.      *      * @param icon          The resource id of the icon to put in the status bar.      * @param tickerText    The text that flows by in the status bar when the notification first      *                      activates.      * @param when          The time to show in the time field.  In the System.currentTimeMillis      *                      timebase.      *      * @deprecated Use {@link Builder} instead.      */      @Deprecated      public Notification(int icon, CharSequence tickerText, long when)      {          this.icon = icon;          this.tickerText = tickerText;          this.when = when;      }     這個構造函數是deprecated(棄用)的。 [java]  /**      * Unflatten the notification from a parcel.      */      public Notification(Parcel parcel)      {          int version = parcel.readInt();             when = parcel.readLong();          icon = parcel.readInt();          number = parcel.readInt();          if (parcel.readInt() != 0) {              contentIntent = PendingIntent.CREATOR.createFromParcel(parcel);          }          if (parcel.readInt() != 0) {              deleteIntent = PendingIntent.CREATOR.createFromParcel(parcel);          }          if (parcel.readInt() != 0) {              tickerText = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(parcel);          }          if (parcel.readInt() != 0) {              tickerView = RemoteViews.CREATOR.createFromParcel(parcel);          }          if (parcel.readInt() != 0) {              contentView = RemoteViews.CREATOR.createFromParcel(parcel);          }          if (parcel.readInt() != 0) {              largeIcon = Bitmap.CREATOR.createFromParcel(parcel);          }          defaults = parcel.readInt();          flags = parcel.readInt();          if (parcel.readInt() != 0) {              sound = Uri.CREATOR.createFromParcel(parcel);          }             audioStreamType = parcel.readInt();          vibrate = parcel.createLongArray();          ledARGB = parcel.readInt();          ledOnMS = parcel.readInt();          ledOffMS = parcel.readInt();          iconLevel = parcel.readInt();             if (parcel.readInt() != 0) {              fullScreenIntent = PendingIntent.CREATOR.createFromParcel(parcel);          }      }     通過一個Parcel一個參數來構造一個Notification。     其他方法 [java]   @Override   public Notification clone() {       Notification that = new Notification();          that.when = this.when;       that.icon = this.icon;       that.number = this.number;          // PendingIntents are global, so there's no reason (or way) to clone them.       that.contentIntent = this.contentIntent;       that.deleteIntent = this.deleteIntent;       that.fullScreenIntent = this.fullScreenIntent;          if (this.tickerText != null) {           that.tickerText = this.tickerText.toString();       }       if (this.tickerView != null) {           that.tickerView = this.tickerView.clone();       }       if (this.contentView != null) {           that.contentView = this.contentView.clone();       }       if (this.largeIcon != null) {           that.largeIcon = Bitmap.createBitmap(this.largeIcon);       }       that.iconLevel = this.iconLevel;       that.sound = this.sound; // android.net.Uri is immutable       that.audioStreamType = this.audioStreamType;          final long[] vibrate = this.vibrate;       if (vibrate != null) {           final int N = vibrate.length;           final long[] vib = that.vibrate = new long[N];           System.arraycopy(vibrate, 0, vib, 0, N);       }          that.ledARGB = this.ledARGB;       that.ledOnMS = this.ledOnMS;       that.ledOffMS = this.ledOffMS;       that.defaults = this.defaults;              that.flags = this.flags;          return that;   }     官網解釋: Creates and returns a copy of this Object. The default implementation returns a so-called "shallow" copy: It creates a new instance of the same class and then copies the field values (including object references) from this instance to the new instance. A "deep" copy, in contrast, would also recursively clone nested objects. A subclass that needs to implement this kind of cloning should call super.clone() to create the new instance and then create deep copies of the nested, mutable objects.   創建並返回這個對象的一個拷貝。默認的實現返回一個所謂的“淺“復制:它創建一個新的實例相同的類,然後從這個實例復制字段值(包括對象引用)生成新實例。相對應的“深度”拷貝,也會遞歸地復制嵌套對象。一個子類,實現這種克隆需要調用super.clone()方法來創建一個深層嵌套的、可變的實例。   [java]   public int describeContents() {           return 0;       }     描述了在Parcelable中包含的各種特殊對象的編組表示。在代碼中直接返回0。     [java]   /**      * Flatten this notification from a parcel.      */      public void writeToParcel(Parcel parcel, int flags)      {          parcel.writeInt(1);             parcel.writeLong(when);          parcel.writeInt(icon);          parcel.writeInt(number);          if (contentIntent != null) {              parcel.writeInt(1);              contentIntent.writeToParcel(parcel, 0);          } else {              parcel.writeInt(0);          }          if (deleteIntent != null) {              parcel.writeInt(1);              deleteIntent.writeToParcel(parcel, 0);          } else {              parcel.writeInt(0);          }          if (tickerText != null) {              parcel.writeInt(1);              TextUtils.writeToParcel(tickerText, parcel, flags);          } else {              parcel.writeInt(0);          }          if (tickerView != null) {              parcel.writeInt(1);              tickerView.writeToParcel(parcel, 0);          } else {              parcel.writeInt(0);          }          if (contentView != null) {              parcel.writeInt(1);              contentView.writeToParcel(parcel, 0);          } else {              parcel.writeInt(0);          }          if (largeIcon != null) {              parcel.writeInt(1);              largeIcon.writeToParcel(parcel, 0);          } else {              parcel.writeInt(0);          }             parcel.writeInt(defaults);          parcel.writeInt(this.flags);             if (sound != null) {              parcel.writeInt(1);              sound.writeToParcel(parcel, 0);          } else {              parcel.writeInt(0);          }          parcel.writeInt(audioStreamType);          parcel.writeLongArray(vibrate);          parcel.writeInt(ledARGB);          parcel.writeInt(ledOnMS);          parcel.writeInt(ledOffMS);          parcel.writeInt(iconLevel);             if (fullScreenIntent != null) {              parcel.writeInt(1);              fullScreenIntent.writeToParcel(parcel, 0);          } else {              parcel.writeInt(0);          }      }   用Notification填充Parcel。 [java]   /**     * Parcelable.Creator that instantiates Notification objects     */     public static final Parcelable.Creator<Notification> CREATOR             = new Parcelable.Creator<Notification>()     {         public Notification createFromParcel(Parcel parcel)         {             return new Notification(parcel);         }            public Notification[] newArray(int size)         {             return new Notification[size];         }     };     通過Parcelable.Creator來實例化Notification。 [java]        * Sets the {@link #contentView} field to be a view with the standard "Latest Event"       * layout.       *       * <p>Uses the {@link #icon} and {@link #when} fields to set the icon and time fields       * in the view.</p>       * @param context       The context for your application / activity.       * @param contentTitle The title that goes in the expanded entry.       * @param contentText  The text that goes in the expanded entry.       * @param contentIntent The intent to launch when the user clicks the expanded notification.       * If this is an activity, it must include the       * {@link android.content.Intent#FLAG_ACTIVITY_NEW_TASK} flag, which requires       * that you take care of task management as described in the       * <a href="{@docRoot}guide/topics/fundamentals/tasks-and-back-stack.html">Tasks and Back       * Stack</a> document.       *        * @deprecated Use {@link Builder} instead.       */       @Deprecated       public void setLatestEventInfo(Context context,               CharSequence contentTitle, CharSequence contentText, PendingIntent contentIntent) {           RemoteViews contentView = new RemoteViews(context.getPackageName(),                   R.layout.status_bar_latest_event_content);           if (this.icon != 0) {               contentView.setImageViewResource(R.id.icon, this.icon);           }           if (contentTitle != null) {               contentView.setTextViewText(R.id.title, contentTitle);           }           if (contentText != null) {               contentView.setTextViewText(R.id.text, contentText);           }           if (this.when != 0) {               contentView.setLong(R.id.time, "setTime", when);           }              this.contentView = contentView;           this.contentIntent = contentIntent;       }     上面提到的setLatestEventInfo方法,被棄用,使用Notification.Builder替代。 設置最新點擊的內容視圖,通過設置圖標,時間等參數。 [java]   @Override       public String toString() {           StringBuilder sb = new StringBuilder();           sb.append("Notification(contentView=");           if (contentView != null) {               sb.append(contentView.getPackage());               sb.append("/0x");               sb.append(Integer.toHexString(contentView.getLayoutId()));           } else {               sb.append("null");           }           sb.append(" vibrate=");           if (this.vibrate != null) {               int N = this.vibrate.length-1;               sb.append("[");               for (int i=0; i<N; i++) {                   sb.append(this.vibrate[i]);                   sb.append(',');               }               if (N != -1) {                   sb.append(this.vibrate[N]);               }               sb.append("]");           } else if ((this.defaults & DEFAULT_VIBRATE) != 0) {               sb.append("default");           } else {               sb.append("null");           }           sb.append(",sound=");           if (this.sound != null) {               sb.append(this.sound.toString());           } else if ((this.defaults & DEFAULT_SOUND) != 0) {               sb.append("default");           } else {               sb.append("null");           }           sb.append(",defaults=0x");           sb.append(Integer.toHexString(this.defaults));           sb.append(",flags=0x");           sb.append(Integer.toHexString(this.flags));           if ((this.flags & FLAG_HIGH_PRIORITY) != 0) {               sb.append("!!!1!one!");           }           sb.append(")");           return sb.toString();       }     toString()方法。     建造者(Builder) 首先,Builder類是一個靜態內部類: [java]   public static class Builder {     裡面使用到的全局變量: [java]   private Context mContext;              private long mWhen;           private int mSmallIcon;           private int mSmallIconLevel;           private int mNumber;           private CharSequence mContentTitle;           private CharSequence mContentText;           private CharSequence mContentInfo;           private PendingIntent mContentIntent;           private RemoteViews mContentView;           private PendingIntent mDeleteIntent;           private PendingIntent mFullScreenIntent;           private CharSequence mTickerText;           private RemoteViews mTickerView;           private Bitmap mLargeIcon;           private Uri mSound;           private int mAudioStreamType;           private long[] mVibrate;           private int mLedArgb;           private int mLedOnMs;           private int mLedOffMs;           private int mDefaults;           private int mFlags;           private int mProgressMax;           private int mProgress;           private boolean mProgressIndeterminate;     參考上面Notification的全局變量。   構造函數: [java]   /**           * Constructor.           *           * Automatically sets the when field to {@link System#currentTimeMillis()           * System.currentTimeMllis()} and the audio stream to the {@link #STREAM_DEFAULT}.           *           * @param context A {@link Context} that will be used to construct the           *      RemoteViews. The Context will not be held past the lifetime of this           *      Builder object.           */           public Builder(Context context) {               mContext = context;                  // Set defaults to match the defaults of a Notification               mWhen = System.currentTimeMillis();               mAudioStreamType = STREAM_DEFAULT;           }     需要傳入一個Context,然後獲取下當前時間,設置下視頻流類型。 設置當前事件時間:系統會根據這個時間在狀態欄上為Notification排序。 [java]    * Set the time that the event occurred.  Notifications in the panel are   * sorted by this time.   */   public Builder setWhen(long when) {       mWhen = when;       return this;   }     設置圖標:   [java]          /**           * Set the small icon to use in the notification layouts.  Different classes of devices           * may return different sizes.  See the UX guidelines for more information on how to           * design these icons.           *           * @param icon A resource ID in the application's package of the drawble to use.           */           public Builder setSmallIcon(int icon) {               mSmallIcon = icon;               return this;           }                 /**           * A variant of {@link #setSmallIcon(int) setSmallIcon(int)} that takes an additional           * level parameter for when the icon is a {@link android.graphics.drawable.LevelListDrawable           * LevelListDrawable}.           *           * @param icon A resource ID in the application's package of the drawble to use.           * @param level The level to use for the icon.           *           * @see android.graphics.drawable.LevelListDrawable           */           public Builder setSmallIcon(int icon, int level) {               mSmallIcon = icon;               mSmallIconLevel = level;               return this;           }     設置Notification布局的小圖標,不同的硬件設備會顯示不同的尺寸。可以查看UX文檔獲取更多如何設計圖標的信息。   設置內容標題: [java]  /**          * Set the title (first row) of the notification, in a standard notification.          */          public Builder setContentTitle(CharSequence title) {              mContentTitle = title;              return this;          }     設置Notification的第一行標題。   設置內容: [java]  /**           * Set the text (second row) of the notification, in a standard notification.           */           public Builder setContentText(CharSequence text) {               mContentText = text;               return this;           }     設置Notification的第二行內容。   設置Notification右側數字: [java]   /**           * Set the large number at the right-hand side of the notification.  This is           * equivalent to setContentInfo, although it might show the number in a different           * font size for readability.           */           public Builder setNumber(int number) {               mNumber = number;               return this;           }     設置在狀態欄右側顯示的數字,等同於setContentInfo,也可以顯示數字。   設置Notification右側顯示的文本:   [java]   /**           * Set the large text at the right-hand side of the notification.           */           public Builder setContentInfo(CharSequence info) {               mContentInfo = info;               return this;           }     設置進度: [java]   /**           * Set the progress this notification represents, which may be           * represented as a {@link ProgressBar}.           */           public Builder setProgress(int max, int progress, boolean indeterminate) {               mProgressMax = max;               mProgress = progress;               mProgressIndeterminate = indeterminate;               return this;           }     Notification就相當於一個ProgrssBar。   設置內容視圖: [java]   **            * Supply a custom RemoteViews to use instead of the standard one.            */           public Builder setContent(RemoteViews views) {               mContentView = views;               return this;           }     使用自定義視圖替代標准視圖。   設置PendingIntent: [java]   /**           * Supply a {@link PendingIntent} to send when the notification is clicked.           * If you do not supply an intent, you can now add PendingIntents to individual           * views to be launched when clicked by calling {@link RemoteViews#setOnClickPendingIntent           * RemoteViews.setOnClickPendingIntent(int,PendingIntent)}.  Be sure to           * read {@link Notification#contentIntent Notification.contentIntent} for           * how to correctly use this.           */           public Builder setContentIntent(PendingIntent intent) {               mContentIntent = intent;               return this;           }   當Notification被點擊時提供一個PendingIntent,如果沒有提供這個intent,可以在點擊時調用RemoteViews.setOnclickPendingIntent(int,PendingIntent)去設置一個PendingIntent.   設置DeleteIntent:   [java]  /**           * Supply a {@link PendingIntent} to send when the notification is cleared by the user           * directly from the notification panel.  For example, this intent is sent when the user           * clicks the "Clear all" button, or the individual "X" buttons on notifications.  This           * intent is not sent when the application calls {@link NotificationManager#cancel           * NotificationManager.cancel(int)}.           */           public Builder setDeleteIntent(PendingIntent intent) {               mDeleteIntent = intent;               return this;           }     設置一個當用戶清除狀態欄中的Notification是觸發的PendingIntent。   設置FullScreenIntent:   [java]   /**          * An intent to launch instead of posting the notification to the status bar.          * Only for use with extremely high-priority notifications demanding the user's          * <strong>immediate</strong> attention, such as an incoming phone call or          * alarm clock that the user has explicitly set to a particular time.          * If this facility is used for something else, please give the user an option          * to turn it off and use a normal notification, as this can be extremely          * disruptive.          *          * @param intent The pending intent to launch.          * @param highPriority Passing true will cause this notification to be sent          *          even if other notifications are suppressed.          */          public Builder setFullScreenIntent(PendingIntent intent, boolean highPriority) {              mFullScreenIntent = intent;              setFlag(FLAG_HIGH_PRIORITY, highPriority);              return this;          }     一個全屏狀態下替代狀態欄上的Notification的intent,僅適用於使用非常高的優先級通知,會引起用戶的即時關注,如用戶已顯式設置為一個特定的時間,一個來電或鬧鐘。   設置TickerText:   [java]   /**           * Set the text that is displayed in the status bar when the notification first           * arrives.           */           public Builder setTicker(CharSequence tickerText) {               mTickerText = tickerText;               return this;           }                 /**           * Set the text that is displayed in the status bar when the notification first           * arrives, and also a RemoteViews object that may be displayed instead on some           * devices.           */           public Builder setTicker(CharSequence tickerText, RemoteViews views) {               mTickerText = tickerText;               mTickerView = views;               return this;           }   設置Notification第一次到達時在status Bar 上面顯示的文本,第二個方法裡面還可以設置一個自定義視圖。   設置大圖標:   [java]   /**           * Set the large icon that is shown in the ticker and notification.           */           public Builder setLargeIcon(Bitmap icon) {               mLargeIcon = icon;               return this;           }       設置聲音: [java]   /**           * Set the sound to play.  It will play on the default stream.           */           public Builder setSound(Uri sound) {               mSound = sound;               mAudioStreamType = STREAM_DEFAULT;               return this;           }                 /**           * Set the sound to play.  It will play on the stream you supply.           *           * @see #STREAM_DEFAULT           * @see AudioManager for the <code>STREAM_</code> constants.           */           public Builder setSound(Uri sound, int streamType) {               mSound = sound;               mAudioStreamType = streamType;               return this;           }       設置震動: [java]   /**           * Set the vibration pattern to use.           *           * @see android.os.Vibrator for a discussion of the <code>pattern</code>           * parameter.           */           public Builder setVibrate(long[] pattern) {               mVibrate = pattern;               return this;           }     設置LED燈光: [java]   /**           * Set the argb value that you would like the LED on the device to blnk, as well as the           * rate.  The rate is specified in terms of the number of milliseconds to be on           * and then the number of milliseconds to be off.           */           public Builder setLights(int argb, int onMs, int offMs) {               mLedArgb = argb;               mLedOnMs = onMs;               mLedOffMs = offMs;               return this;           }     設置Ongoing: [java]   /**          * Set whether this is an ongoing notification.          *          * <p>Ongoing notifications differ from regular notifications in the following ways:          * <ul>          *   <li>Ongoing notifications are sorted above the regular notifications in the          *   notification panel.</li>          *   <li>Ongoing notifications do not have an 'X' close button, and are not affected          *   by the "Clear all" button.          * </ul>          */          public Builder setOngoing(boolean ongoing) {              setFlag(FLAG_ONGOING_EVENT, ongoing);              return this;          }     設置Notification是否是正在進行。   設置是否只提示一次:   [java]   /**           * Set this flag if you would only like the sound, vibrate           * and ticker to be played if the notification is not already showing.           */           public Builder setOnlyAlertOnce(boolean onlyAlertOnce) {               setFlag(FLAG_ONLY_ALERT_ONCE, onlyAlertOnce);               return this;           }     設置是否自動取消: [java]           * Setting this flag will make it so the notification is automatically           * canceled when the user clicks it in the panel.  The PendingIntent           * set with {@link #setDeleteIntent} will be broadcast when the notification           * is canceled.           */           public Builder setAutoCancel(boolean autoCancel) {               setFlag(FLAG_AUTO_CANCEL, autoCancel);               return this;           }     裡面都用的私有setFlag方法:   [java]   private void setFlag(int mask, boolean value) {              if (value) {                  mFlags |= mask;              } else {                  mFlags &= ~mask;              }          }     使用默認設置: [java]   /**           * Set the default notification options that will be used.           * <p>           * The value should be one or more of the following fields combined with           * bitwise-or:           * {@link #DEFAULT_SOUND}, {@link #DEFAULT_VIBRATE}, {@link #DEFAULT_LIGHTS}.           * <p>           * For all default values, use {@link #DEFAULT_ALL}.           */           public Builder setDefaults(int defaults) {               mDefaults = defaults;               return this;           }     通過ID獲取notification視圖: [java]   private RemoteViews makeRemoteViews(int resId) {              RemoteViews contentView = new RemoteViews(mContext.getPackageName(), resId);              boolean hasLine3 = false;              if (mSmallIcon != 0) {                  contentView.setImageViewResource(R.id.icon, mSmallIcon);                  contentView.setViewVisibility(R.id.icon, View.VISIBLE);              } else {                  contentView.setViewVisibility(R.id.icon, View.GONE);              }              if (mContentTitle != null) {                  contentView.setTextViewText(R.id.title, mContentTitle);              }              if (mContentText != null) {                  contentView.setTextViewText(R.id.text, mContentText);                  hasLine3 = true;              }              if (mContentInfo != null) {                  contentView.setTextViewText(R.id.info, mContentInfo);                  contentView.setViewVisibility(R.id.info, View.VISIBLE);                  hasLine3 = true;              } else if (mNumber > 0) {                  final int tooBig = mContext.getResources().getInteger(                          R.integer.status_bar_notification_info_maxnum);                  if (mNumber > tooBig) {                      contentView.setTextViewText(R.id.info, mContext.getResources().getString(                                  R.string.status_bar_notification_info_overflow));                  } else {                      NumberFormat f = NumberFormat.getIntegerInstance();                      contentView.setTextViewText(R.id.info, f.format(mNumber));                  }                  contentView.setViewVisibility(R.id.info, View.VISIBLE);                  hasLine3 = true;              } else {                  contentView.setViewVisibility(R.id.info, View.GONE);              }              if (mProgressMax != 0 || mProgressIndeterminate) {                  contentView.setProgressBar(                          R.id.progress, mProgressMax, mProgress, mProgressIndeterminate);                  contentView.setViewVisibility(R.id.progress, View.VISIBLE);              } else {                  contentView.setViewVisibility(R.id.progress, View.GONE);              }              if (mWhen != 0) {                  contentView.setLong(R.id.time, "setTime", mWhen);              }              contentView.setViewVisibility(R.id.line3, hasLine3 ? View.VISIBLE : View.GONE);              return contentView;          }     獲取默認視圖: [java]  private RemoteViews makeContentView() {               if (mContentView != null) {                   return mContentView;               } else {                       return makeRemoteViews(mLargeIcon == null                               ? R.layout.status_bar_latest_event_content                           : R.layout.status_bar_latest_event_content_large_icon);               }           }     獲取TickerView: [java]   private RemoteViews makeTickerView() {              if (mTickerView != null) {                  return mTickerView;              } else {                  if (mContentView == null) {                      return makeRemoteViews(mLargeIcon == null                              ? R.layout.status_bar_latest_event_ticker                              : R.layout.status_bar_latest_event_ticker_large_icon);                  } else {                      return null;                  }              }          }     注意上面三個方法均是私有方法,在外部不能訪問,在下面的方法中調用到了這些方法     通過Builder最後獲取一個Notification: [java]  /**          * Combine all of the options that have been set and return a new {@link Notification}          * object.          */          public Notification getNotification() {              Notification n = new Notification();              n.when = mWhen;              n.icon = mSmallIcon;              n.iconLevel = mSmallIconLevel;              n.number = mNumber;              n.contentView = makeContentView();              n.contentIntent = mContentIntent;              n.deleteIntent = mDeleteIntent;              n.fullScreenIntent = mFullScreenIntent;              n.tickerText = mTickerText;              n.tickerView = makeTickerView();              n.largeIcon = mLargeIcon;              n.sound = mSound;              n.audioStreamType = mAudioStreamType;              n.vibrate = mVibrate;              n.ledARGB = mLedArgb;              n.ledOnMS = mLedOnMs;              n.ledOffMS = mLedOffMs;              n.defaults = mDefaults;              n.flags = mFlags;              if (mLedOnMs != 0 && mLedOffMs != 0) {                  n.flags |= FLAG_SHOW_LIGHTS;              }              if ((mDefaults & DEFAULT_LIGHTS) != 0) {                  n.flags |= FLAG_SHOW_LIGHTS;              }              return n;          }     Builder的最後,提供一個完整的產品出來。  
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved