訊息通知之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種值
(3)設定通知,為了更好的相容性,可以呼叫support-v4的NotificationCompat來設定FLAG_ONE_SHOT, FLAG_NO_CREATE, FLAG_CANCEL_CURRENT, FLAG_UPDATE_CURRENT,
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);
當然還有很多很多其他的....