自定義通知,顯示自定義的通知,告別系統樣式的限制,讓你的通知更加漂亮。
1.自定義按鈕的響應需要api版本11(Android 3.0)以上的支持!
2.通知是遠程視圖,不跟發出通知的活動、服務等處在同一個運行空間!
3.通知上的對象只能在發出之前設置,不能再發出後獲取
===>要更新通知,只能是重新設置通知對象上的對象值,再重新發出通知。
網上方法說是使用setLatestEventInfo()方法
notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
但是效果並非你想要的效果,更新過後你的自定義通知的視圖是被覆蓋的,他的樣式是系統的樣式。所以只能是重新設置通知內容再發通知。
寫法步驟:
1.創建通知管理器、創建遠程視圖並綁定自定義通知視圖
NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.notify);//遠程視圖
2.設置遠程視圖上的對應控件的內容
// 設置遠程視圖中的控件內容
contentView.setImageViewResource(R.id.notify_music_icon, R.drawable.icon);//圖片控件的設置方法
contentView.setTextViewText(R.id.txt_notify_Title, playingName);//文本控件的設置方法
2.1.設置通知上對應按鈕點擊的響應動作(如果沒有自定義按鈕可以不寫)
contentView.setOnClickPendingIntent(R.id.btn_notify_next, pendingIntent);//設置了按鈕btn_notify_next的點擊的pendingIntent對象
3.設置通知的PendingIntent(點擊通知後要做什麼事)
Intent notificationIntent = new Intent(this, MainActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent , 0);
4.通知綁定遠程視圖、綁定PendingIntent和發通知
notification.contentView = contentView;// 綁定遠程視圖
notification.contentIntent = contentIntent;// 綁定 PendingIntent
notificationManager.notify(NOTIFYY_ID, notification);
注:pendingIntent對象可以綁定的是活動,服務或廣播(需要廣播類進行接收廣播)。
比如我們要實現下圖的通知,可以看到上面還有三個按鈕,我們還要進行響應按鈕動作:
圖片無法上傳,等等。。。。。。。。。。。
這是佈局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/RelativeLayout1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/lavenderblush"
android:orientation="vertical" >
<TextView
android:id="@+id/txt_notify_Title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/notify_music_icon"
android:layout_alignTop="@+id/notify_music_icon"
android:layout_marginLeft="5dp"
android:layout_toLeftOf="@+id/btn_notify_pause"
android:layout_toRightOf="@+id/notify_music_icon"
android:paddingTop="3dp"
android:text="TextView"
android:textColor="@color/black" />
<ImageView
android:id="@+id/notify_music_icon"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:src="@drawable/icon" />
<ImageView
android:id="@+id/btn_nitify_exit"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:clickable="true"
android:src="@drawable/btn_notify_exit" />
<ImageView
android:id="@+id/btn_notify_next"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_centerVertical="true"
android:layout_marginRight="3dp"
android:layout_toLeftOf="@+id/btn_nitify_exit"
android:clickable="true"
android:src="@drawable/btn_notify_next" />
<ImageView
android:id="@+id/btn_notify_pause"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_centerVertical="true"
android:layout_marginRight="3dp"
android:layout_toLeftOf="@+id/btn_notify_next"
android:clickable="true"
android:src="@drawable/btn_notify_pause" />
</RelativeLayout>
以下是完整通知代碼:
按鈕動作是發送廣播,用一個全局廣播類接收廣播
private void sendNotification() {
//1
notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);//通知管理器
//2
contentView = new RemoteViews(getPackageName(), R.layout.notify);//遠程視圖
// 設置遠程視圖中的控件內容
contentView.setImageViewResource(R.id.notify_music_icon, R.drawable.icon);
contentView.setTextViewText(R.id.txt_notify_Title, playingName);
//設置對應的三個按鈕和事件
Intent pauseIntent = new Intent(this, MyReceiver.class);//intent是一個廣播類對象
pauseIntent.setAction(Utils.NOTIFY_PAUSE);//設置動作
PendingIntent pausePendingIntent = PendingIntent.getBroadcast(this, 0,
pauseIntent, 0);//pendingIntent得到廣播
contentView.setOnClickPendingIntent(R.id.btn_notify_pause,
pausePendingIntent);//設置按鈕成帶PendingIntent的可點擊按鈕
Intent nextIntent = new Intent(this, MyReceiver.class);
nextIntent.setAction(Utils.NOTIFY_NEXT);
PendingIntent nextPendingIntent = PendingIntent.getBroadcast(this, 0,
nextIntent, 0);
contentView.setOnClickPendingIntent(R.id.btn_notify_next,
nextPendingIntent);
Intent exitIntent = new Intent(this, MyReceiver.class);
exitIntent.setAction(Utils.NOTIFY_EXIT);
PendingIntent exitPendingIntent = PendingIntent.getBroadcast(this, 0,
exitIntent, 0);
contentView.setOnClickPendingIntent(R.id.btn_nitify_exit,
exitPendingIntent);
//如果api版本11(android 3.0)以上按鈕才顯示
if (android.os.Build.VERSION.SDK_INT >= 11) {
contentView.setViewVisibility(R.id.btn_notify_pause, View.VISIBLE);
contentView.setViewVisibility(R.id.btn_notify_next, View.VISIBLE);
contentView.setViewVisibility(R.id.btn_nitify_exit, View.VISIBLE);
}
//3
notification = new Notification(R.drawable.music, "MusicPlayer", System.currentTimeMillis()); //實例化通知對象
// 綁定遠程視圖
notification.contentView = contentView;
// 4.定義 PendingIntent並綁定
Intent notificationIntent = new Intent(this, MainActivity.class);
contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
notification.contentIntent = contentIntent;// 綁定 PendingIntent
notification.flags = Notification.FLAG_NO_CLEAR;// 設置不可取消
// 5 發通知
notificationManager.notify(NOTIFY_ID, notification);
}
廣播類,用於通知上按鈕點擊後接收發過來的廣播,需要靜態的註冊廣播,使得系統全局都可以用。
public class MyReceiver extends BroadcastReceiver {
public MyReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (Utils.NOTIFY_EXIT.equals(action)) {
//在這裏做需要做的事情
}
if (Utils.NOTIFY_NEXT.equals(action)) {
//在這裏做需要做的事情
}
if (Utils.NOTIFY_PAUSE.equals(action)) {
//在這裏做需要做的事情
}
}
}
清單文件AndroidManifest.xml中廣播的靜態註冊和設置三個動作(動作字符串分別對應Utils.NOTIFY_EXIT,Utils.NOTIFY_NEXT,Utils.NOTIFY_PAUSE裏面的字符串)
<receiver
android:name="com.ql.mediademo2.MyReceiver"
>
<intent-filter >
<action android:name="_notifi_exit"/>
<action android:name="_notifi_next"/>
<action android:name="_notifi_pause"/>
</intent-filter>
</receiver>
通知的更新:
以下把更新通知封裝在了一個自定義方法中
private void notifyNotifycation() {
//重新設置通知上控件的數據
contentView.setImageViewResource(R.id.notify_music_icon, R.drawable.icon);//更新圖片
contentView.setTextViewText(R.id.txt_notify_Title, "XXXXX");//更新文本
notificationManager.notify(NOTIFY_ID, notification);//通知管理器重新發通知
}