1. 程式人生 > >訊息通知之Notification與PendingIntent

訊息通知之Notification與PendingIntent

Notification-----狀態列資訊通知

一.簡意:

(1)訊息通知:當某些應用有訊息時,在手機最上方的狀態列會有一條通知

二,基本用法:

(1)獲取服務:通過getSystemService來獲取NotificationManager服務

NotificationManager manager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);

(2)設定點選通知資訊後跳轉的Activity,如果你不需要則忽略此步驟(對應的在notification也不需要設定ContentIntent):

利用PendingIntent來發送:

  ---建立intent物件:

Intent intent = new Intent(this , NotificationActivity.class);
 -----然後建立PendingIntent物件:
        //4個引數:context,0,intent,確定PendingIntent的行為
        //PendingIntent.getActivity(),getBroadcast(),getService()等方法
        PendingIntent pendingIntent = PendingIntent.getActivity(this , 0 , intent , 0);

看一下,PendingIntent的原始碼,如下:前面還有一大堆解釋,點選getActivity,自己去看一下

大概就是:上下文物件,請求碼(基本傳0),Intent物件,flag標籤

    public static PendingIntent getActivity(Context context, int requestCode,
            Intent intent, @Flags int flags) {
        return getActivity(context, requestCode, intent, flags, null);
    }
flag標籤值(一般可傳0):可選4種值
                    FLAG_ONE_SHOT,
                    FLAG_NO_CREATE,
                    FLAG_CANCEL_CURRENT,
                    FLAG_UPDATE_CURRENT,
(3)設定通知,為了更好的相容性,可以呼叫support-v4的NotificationCompat來設定

Notification notification = new NotificationCompat.Builder(context).build();

        Notification notification = new NotificationCompat.Builder(this)
                //設定標題
                .setContentTitle("你好6")
                //設定內容
                .setContentText("為什麼你會好6呢?原因是....")
                //設定時間
                .setWhen(System.currentTimeMillis())
                //設定小圖示
                .setSmallIcon(R.mipmap.p1)
                //設定大圖示,當系統下拉時就會看到大圖示
                .setLargeIcon(BitmapFactory.decodeResource(getResources() , R.mipmap.t2))
                //設定點選時跳轉的PendingIntent
                .setContentIntent(pendingIntent)
                //設定點選通知後,通知取消,也可以在程式碼中去取消
               // .setAutoCancel(true)
                .build();
以上是常用方法:

.設定標題,內容,時間,顏色,小圖示,大圖示,跳轉,點選後取消通知,等等

當然,最後一定要.build()方法

(4)呼叫NotificationManager的notify()方法來顯示:

原始碼:兩個引數,第一個是id,第二個是Notificatioin物件(這個id,當我們點選該通知需要獲取資料時,可能會用到)

    public void notify(int id, Notification notification)
    {
        notify(null, id, notification);
    }
如:
        //第一個引數id,第二個Notification物件
        manager.notify(1 , notification);
(5)建立點選跳轉的Activity,當然,你若不需要跳轉,可以忽略

可以在onCreate方法中,增加點選後取消通知的方法(如果你沒有在傳送時設定setAutoCancel方法的話)

    private void cancleNotification() {
        NotificationManager manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
        manager.cancel(1);//取消通知,引數是,傳送時的id
    }
(6)試一下:效果

點擊發送按鈕後:


下拉:


新增通知,跳轉到另一個Activity,截圖略

三,其他用法:

(1)設定震動,當通知時會震動:setVibrate()

                //設定震動:引數一個long[]{}陣列,裡面可以依次設定:靜止時長,震動時長,靜止時長,震動時長....
                .setVibrate(new long[]{0, 1000 , 1000 , 1000})
需要新增震動許可權:
<uses-permission android:name="android.permission.VIBRATE"/>
(2)設定閃爍效果:
                //設定閃爍燈:3個引數:顏色,燈亮時長,燈暗時長
                .setLights(Color.YELLOW , 1000 , 1000)
特別是當手機鎖屏後效果明顯

(3)設定播放鈴聲:當然這個使用者一般都不會喜歡發條通知還播放音樂

              //設定發出通知時播放的音樂
               // .setSound(Uri.parse())
(4)設定超長文字或者圖片時,若果需要全部顯示出來,可以用:setStyle()方法,接受Style物件

如;

.setStyle(new NotificationCompat.BigTextStyle().bigText("str"))
設定一個字串文字,當然也可以傳入圖片物件
                //設定超大圖片
                .setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(
                        getResources() , R.mipmap.p1
                )))
因為bigPicture()接收一個Bitmap物件,故而...

(5)設定通知重要性:有5個選項

                //設定通知的重要性:5個值,從低到高
                //public static final int PRIORITY_MIN = -2;    //特定效果才通知
                //public static final int PRIORITY_LOW = -1;    //縮小或者位置靠後
                //public static final int PRIORITY_DEFAULT = 0; //預設
                //public static final int PRIORITY_HIGH = 1;    //放大或者位置靠前
                //public static final int PRIORITY_MAX = 2;     //獨立通知
                .setPriority(NotificationCompat.PRIORITY_MAX)
(6)當然,如果你不想設定這些東東,但是想要鈴聲啊等效果,可以設定預設
                //設定預設效果:不需要自己設定音樂鈴聲,等等
                //.setDefaults(NotificationCompat.DEFAULT_ALL)

四.PendingIntent:

(1)intent是隨著Activity而消失的,而PendingIntent可以看做是對Intent的包裝,是延遲的intent

(2)通常通過getActivity,getBroadcast ,getService來得到pendingintent的例項

(3)常用情況:狀態列通知,傳送簡訊等等

(4)主要作用:用來在某個事件完成後執行特定的Action

如:

傳送簡訊(通知例子上面有了)

定義動作:

    //定義動作
    private final static String SEND_ACTION      = "send";
    private final static String DELIVERED_ACTION = "delivered";
建立SmsManager和PendingIntent物件:(2個deliveredPI用於對方接收到後通知你對方已經接收)
        //獲取SmsManager管理器
        SmsManager s = SmsManager.getDefault();
        //建立PendingIntent物件:4個引數:context,0,intent,flag
        PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SEND_ACTION),
                PendingIntent.FLAG_CANCEL_CURRENT);
        PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, new Intent(DELIVERED_ACTION),
                PendingIntent.FLAG_CANCEL_CURRENT);
註冊傳送:
        // 傳送完成
        registerReceiver(new BroadcastReceiver() {

            @Override
            public void onReceive(Context context, Intent intent) {
                switch (getResultCode()) {
                    case Activity.RESULT_OK:
                        Toast.makeText(getBaseContext(), "傳送成功!", Toast.LENGTH_SHORT).show();
                        break;
                    case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                        Toast.makeText(getBaseContext(), "Send Failed because generic failure cause.",
                                Toast.LENGTH_SHORT).show();
                        break;
                    case SmsManager.RESULT_ERROR_NO_SERVICE:
                        Toast.makeText(getBaseContext(), "Send Failed because service is currently unavailable.",
                                Toast.LENGTH_SHORT).show();
                        break;
                    case SmsManager.RESULT_ERROR_NULL_PDU:
                        Toast.makeText(getBaseContext(), "Send Failed because no pdu provided.", Toast.LENGTH_SHORT).show();
                        break;
                    case SmsManager.RESULT_ERROR_RADIO_OFF:
                        Toast.makeText(getBaseContext(), "Send Failed because radio was explicitly turned off.",
                                Toast.LENGTH_SHORT).show();
                        break;
                    default:
                        Toast.makeText(getBaseContext(), "Send Failed.", Toast.LENGTH_SHORT).show();
                        break;
                }
            }
        }, new IntentFilter(SEND_ACTION));
註冊通知你對方接收成功(當對方接收時呼叫)
        // 通知你對方已經接收
        registerReceiver(new BroadcastReceiver() {

            @Override
            public void onReceive(Context context, Intent intent) {
                switch (getResultCode()) {
                    case Activity.RESULT_OK:
                        Toast.makeText(getBaseContext(), "Delivered Success!", Toast.LENGTH_SHORT).show();
                        break;
                    default:
                        Toast.makeText(getBaseContext(), "Delivered Failed!", Toast.LENGTH_SHORT).show();
                        break;
                }
            }
        }, new IntentFilter(DELIVERED_ACTION));
利用SmsManager來啟動傳送:
 s.sendTextMessage(receiver, null, text, sentPI, deliveredPI);

當然還有很多很多其他的....