Android通知之自定義通知、響應通知上自定義按鈕和更新通知的實現

自定義通知,顯示自定義的通知,告別系統樣式的限制,讓你的通知更加漂亮。

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);//通知管理器重新發通知
}
發佈了60 篇原創文章 · 獲贊 22 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章