Android種使用Notification實現通知管理以及自訂通知欄(Notification樣本四),自訂notification
樣本一:實現通知欄管理
當針對相同類型的事件多次發出通知,作為開發人員,應該避免使用全新的通知,這時就應該考慮更新之前通知欄的一些值來達到提醒使用者的目的。例如我們手機的簡訊系統,當不斷有新訊息傳來時,我們的通知欄僅僅是更改傳來簡訊的數目,而不是對每條簡訊單獨做一個通知欄用於提示。
修改通知
可以設定一條通知,當然可以更新一條通知,我們通過在調用NotificationManager.notify(ID, notification)時所使用的ID來更新它。為了更新你之前發布的通知,你需要更新或者建立一個NotificationCompat.Builder對象,從之前的通知中建立一個Notification對象,然後發布它使用你之前使用的ID。如果之前的通知仍然可見,系統將直接更新通知的內容,如果之前的通知不可見了,一條新的通知將被建立。
下面的代碼示範了更新,以反映已發生的事件數目量的通知。 它疊加通知,顯示的摘要:
(注意示範,通知數量會累積而且點擊通知後通知欄消失)
這裡我們不再示範點擊按鈕以及跳轉頁面的布局檔案,直接上java實現代碼:
1 import android.app.Notification; 2 import android.app.NotificationManager; 3 import android.app.PendingIntent; 4 import android.content.Context; 5 import android.content.Intent; 6 import android.graphics.BitmapFactory; 7 import android.support.v7.app.AppCompatActivity; 8 import android.os.Bundle; 9 import android.support.v7.app.NotificationCompat;10 import android.view.View;11 import android.widget.RemoteViews;12 public class MainActivity extends AppCompatActivity {13 private static final int NO_1 = 0x1;14 int num =1;//初始通知數量為115 @Override16 protected void onCreate(Bundle savedInstanceState) {17 super.onCreate(savedInstanceState);18 setContentView(R.layout.activity_main);19 }20 //按鈕點擊事件(通知欄)21 public void show1(View v){22 NotificationCompat.Builder builder = new NotificationCompat.Builder(this);23 builder.setSmallIcon(R.mipmap.ic_launcher);24 builder.setContentTitle("新訊息");25 builder.setContentText("你有一條新的訊息");26 builder.setNumber(num++);27 //設定點擊通知跳轉頁面後,通知消失28 builder.setAutoCancel(true);29 Intent intent = new Intent(this,Main2Activity.class);30 PendingIntent pi = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);31 builder.setContentIntent(pi);32 Notification notification = builder.build();33 NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);34 notificationManager.notify(NO_1,notification);35 }36 }
當我們設定setAutoCancel()為false時,顯示效果如下(點擊後通知欄不消失):
樣本二:自訂通知欄
通知的架構允許你去自訂通知的布局。通過RemoteViews對象來定義通知的外觀。自訂通知布局與常規通知相似,但是它是基於定義在XML檔案的RemoteViews對象來操作的。
自訂通知的可用高度是取決於通知視圖的。正常的視圖布局高度限制在64dp,可展開視圖的布局高度限制在256dp。
為了去定義自己的通知布局,從擴充XML檔案擷取一個RemoteViews對象的執行個體開始。然後,類似於調用setContentTitle()方法一樣,我們需要調用setContent()。為了能設定更多細節,我們使用RemoteViews對象的方法來設定更多的內容。
1.建立一個單獨的XML檔案,用來定義通知的布局。你可以使用任何你想用的名字,但尾碼必須是.xml。
2.在應用裡面,使用RemoteViews對象的方法來給你的通知設定文本和表徵圖,通過調用setContent()把你的RemoteViews對象放到NotificationCompat.Builder裡面。避免使用背景映像,因為你的文本可能會變得不太好閱讀。
RemoteViews對象也包含一些方法用來給你去添加Chronometer和ProgressBar。想要瞭解更多自訂通知條布局的事情,參考RemoteViews的文檔。
注意:當你使用自訂的通知條的時候,特別要注意你自訂的通知條在不同方向與解析度的裝置上是如何工作的。當然這條建議對所有的視圖布局都很重要。但對通知條來說是尤其重要的,因為通知抽屜的控制項十分的有限。不要把自己的通知條做的太複雜,確保它的靈活性。
為自訂的通知條文本使用樣式資源(Usingstyle resources for custom notification text)
自訂通知條的時候總是使用樣式資源去定義文本。通知的背景顏色會變得與裝置與目前的版本的android有很大的反差。使用樣式檔案能幫你很好的解決這一點。從Android 2.3開始,系統就為標準的通知布局定義了文本的樣式,如果你在Android2.3 以及其更高的版本上使用同樣的樣式,你必須確保你的文本相對於背景是可以看見的。
注意:
Notification的自訂布局是RemoteViews,和其他RemoteViews一樣,在自訂視圖布局檔案中,僅支援FrameLayout、LinearLayout、RelativeLayout三種布局控制項和AnalogClock、Chronometer、Button、ImageButton、ImageView、ProgressBar、TextView、ViewFlipper、ListView、GridView、StackView和AdapterViewFlipper這些顯示控制項,不支援這些類的子類或Android提供的其他控制項。否則會引起ClassNotFoundException異常。
帶按鈕的布局相應點擊事件在3.0以下版本不啟作用。
下面簡單示範自訂音樂播放notification(未設定setongoing常駐):
Layout中message.xml(自訂布局):
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="horizontal" android:layout_width="match_parent" 4 android:layout_height="wrap_content" 5 android:gravity="center"> 6 <ImageView 7 android:id="@+id/iv" 8 android:layout_width="wrap_content" 9 android:layout_height="wrap_content"10 android:src="@mipmap/ic_launcher"/>11 <TextView12 android:id="@+id/tv"13 android:layout_width="wrap_content"14 android:layout_height="wrap_content"15 android:layout_weight="1"16 android:gravity="center"17 android:text="仗劍走天涯"/>18 <Button19 android:id="@+id/btn1"20 android:layout_width="wrap_content"21 android:layout_height="wrap_content"22 android:text="播放"/>23 <Button24 android:id="@+id/btn2"25 android:layout_width="wrap_content"26 android:layout_height="wrap_content"27 android:text="下一首"/>28 </LinearLayout>
MainActivity對應java實現代碼的MainActivity.java(只示範點擊事件):
1 public void show2(View v){ 2 NotificationCompat.Builder builder = new NotificationCompat.Builder(this); 3 builder.setSmallIcon(R.mipmap.guojia); 4 RemoteViews rv = new RemoteViews(getPackageName(),R.layout.message); 5 rv.setTextViewText(R.id.tv,"泡沫");//修改自訂View中的歌名 6 //修改自訂View中的圖片(兩種方法) 7 // rv.setImageViewResource(R.id.iv,R.mipmap.ic_launcher); 8 rv.setImageViewBitmap(R.id.iv, BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher)); 9 builder.setContent(rv);10 Notification notification = builder.build();11 NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);12 notificationManager.notify(NO_2,notification);13 }
至此notification相關知識點就總結完了,謝謝大家關注,晚安
相關連結:
Android中使用Notification實現普通通知欄(Notification樣本一)Android中使用Notification實現寬視圖通知欄(Notification樣本二)Android中使用Notification實現進度通知欄(Notification樣本三)