Android N新特性——Notification快速回復

胡小小小瑞發表於2016-08-07

Android N引入了一些新的API,其中增加了快速回復,捆綁通知,自定義檢視和訊息樣式,這篇文章主要給大家講一下快速回復功能是如何實現的。

首先我們利用Button的點選事件去觸發新增一個Notification,程式碼如下:

MainActivity.java

public static final String KEY_TEXT_REPLY = "key_text_reply";//獲取快速回復內容的key
public static final int NOTIFICATION_ID = 100;
......
private void addNotification(){

        String replyLabel = getResources().getString(R.string.reply_label);
        //建立一個遠端輸入(既:通知欄的快捷回覆)
        RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY)
                .setLabel(replyLabel)
                .build();

        //點選快速回復中傳送按鈕的時候,會傳送一個廣播給GetMessageReceiver 
        Intent intent = new Intent(MainActivity.this,GetMessageReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this,0,intent,
            PendingIntent.FLAG_ONE_SHOT);

        //建立快速回復的動作,並新增remoteInut
        Notification.Action replyAction = new Notification.Action.Builder(
                R.drawable.ic_chat_blue_24dp, 
                getString(R.string.label), pendingIntent)
                .addRemoteInput(remoteInput)
                .build();

        //建立一個Notification,並設定title,content,icon等內容
        Notification newMessageNotification = new Notification.Builder(this)
                .setSmallIcon(R.drawable.ic_account_circle_white_24dp)
                .setContentTitle(getString(R.string.title))
                .setContentText(getString(R.string.content))
                .addAction(replyAction)
                .build();

        //發出通知
        NotificationManager notificationManager = 
             (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        notificationManager.notify(NOTIFICATION_ID, newMessageNotification);
    }

上面的程式碼寫好之後,我們點選Button,通知欄就會彈出一個Android N風格的Notification,如下圖:
這裡寫圖片描述
點選Notification中的快速回覆按鈕,就會彈出一個編輯框,讓使用者輸入要回復的內容,如下圖:
這裡寫圖片描述

到這裡,我們的Android N特性的Notification就新增完成了,下面再說一說如何獲取快速回復中的內容。上面我們設定了一個pendingIntent,這個pendingIntent的作用就是當使用者點選傳送的時候,會傳送一個廣播出去,GetMessageReceiver就會接受到這個廣播,我們可以在這個廣播中獲取使用者輸入的回覆資訊,程式碼如下:

GetMessageReceiver.java

    @Override
    public void onReceive(Context context, final Intent intent) {
        this.context = context;
        //模擬傳送訊息
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    String replyContent = getMessageText(intent).toString();
                    Log.i("GetMessageReceiver",replyContent);
                    Thread.sleep(3000);//設定三秒鐘之後更新Notification的狀態
                    updateNotification();
                    Thread.sleep(3000);//三秒鐘後移除Notification
                    cancalNotification();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    //獲取快捷回覆中使用者輸入的字串
    private CharSequence getMessageText(Intent intent) {
        Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
        if (remoteInput != null) {
            **//通過KEY_TEXT_REPLY來獲取輸入的內容**
            return remoteInput.getCharSequence(MainActivity.KEY_TEXT_REPLY);
        }
        return null;
    }

    //訊息傳送狀態的Notification
    private void updateNotification(){
        Notification repliedNotification =
                new Notification.Builder(context)
                        .setSmallIcon(R.drawable.ic_account_circle_white_24dp)
                        .setContentText("訊息傳送成功!")
                        .build();

        //利用NOTIFICATION_ID同一個ID,更新Notification的內容
        notificationManager = (NotificationManager)
            context.getSystemService(context.NOTIFICATION_SERVICE);
        notificationManager.notify(MainActivity.NOTIFICATION_ID,
            repliedNotification);
    }

    //移除Notification
    private void cancalNotification(){
        notificationManager.cancel(MainActivity.NOTIFICATION_ID);
    }

上述程式碼是GetMessageReceiver這個廣播接收器中的一些操作,並且模擬了傳送簡訊的過程

注意:BroadcastReceiver的生命週期只有十秒鐘左右,如果耗時操作時間過長,就會引起ANR,這裡是為了簡便程式碼,所以才在BroadcastReceiver中新增了模擬傳送資訊這個耗時操作,大家以後用到的時候,可以在BroadcastReceiver中開啟一個Service,然後在這個Service中進行一些耗時的操作!!!!!!!!!

Demo地址:https://github.com/hurui1990/AndroidNDemo

好了,到這裡為止,整個Android N Notification快速回復的新特性內容已經講完了,如果有什麼不對的地方,歡迎大家指正,謝謝!

相關文章