PendingIntent可以看做是对Intent的包装,通过名称可以看出PendingIntent用于处理即将发生的意图,而Intent用来处理马上发生的意图。而对于通知来说,它是一个系统级的全局的通知,并不确定这个意图被执行的时间。当在应用外部执行PendingIntent时,因为它保存了触发App的Context,使得外部App可以如果当前App一样执行PendingIntent里的Intent,就算执行时触发通知的App已经不存在了,也能通过存在PendingIntent里的Context照常执行Intent,并且还可以处理Intent所带来的额外的信息
PendingIntent提供了多个静态的getXxx()方法,用于获得适用于不同场景的PendingIntent对象。一般需要传递的几个参数都很常规,只介绍一个flag参数,用于标识PendingIntent的构造选择:
FLAG_CANCEL_CURRENT:如果构建的PendingIntent已经存在,则取消前一个,重新构建一个。
FLAG_NO_CREATE:如果前一个PendingIntent已经不存在了,将不再构建它。
FLAG_ONE_SHOT:表明这里构建的PendingIntent只能使用一次。
FLAG_UPDATE_CURRENT:如果构建的PendingIntent已经存在,则替换它,常用。
默认通知步骤简述:
1.创建一个manager
2.创建一个builder用于设置通知的属性
3.设置builder的属性(标题,大图标,小图标,内容等)
4.创建一个pendingIntent
自定义通知步骤:
1.创建remoteviews对象
2.设置remoteviews对象的属性
3.设置自定义通知的点击响应事件,创建一个pendingintent,设置并关联响应事件
4.根据builder创建notification
5.利用manager将通知显示出来
public class MainActivity extends AppCompatActivity {
private Button defaultStyle;
private Button cancelButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
defaultStyle = (Button) findViewById(R.id.default_style);
defaultStyle.setOnClickListener(new View.OnClickListener() {
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
@Override
public void onClick(View view) {
// 首先需要一个manager
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
// 创建一个builder用于设置通知的属性
Notification.Builder builder = new Notification.Builder(MainActivity.this);
// 设置builder的属性
// 设置大图标
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher);
builder.setLargeIcon(bitmap);
// 设置消息来时的提示
builder.setTicker("通知来了");
// 设置通知标题
builder.setContentTitle("紧急通知");
// 设置通知内容
builder.setContentText("今天放假");
// 设置小图标
builder.setSmallIcon(R.mipmap.ic_launcher);
builder.setAutoCancel(true);
// 创建一个跳转Intent
Intent intent = new Intent(MainActivity.this,Main2Activity.class);
// 第一个参数:上下文对象 第二个参数:返回的状态码 打三个参数:一个intent,通常是跳转的intent
// 第四个参数:是通知与页面的更新类型
PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this,100,intent,PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(pendingIntent);
// 设置自定义通知
// 创建remoteviews对象
RemoteViews views = new RemoteViews(getPackageName(),R.layout.notificationlayout);
// 设置remoteviews对象的属性
views.setTextViewText(R.id.title,"喜马拉雅听书");
views.setTextViewText(R.id.text,"姑娘你真是条汉子");
builder.setContent(views);
// 设置自定义通知的点击响应事件
// 1.创建一个pendingintent
Intent intent1 = new Intent(MainActivity.this,Main2Activity.class);
PendingIntent pendingIntent1 = PendingIntent.getActivity(MainActivity.this,100,intent1,PendingIntent.FLAG_UPDATE_CURRENT);
// 2.设置并关联响应事件
views.setOnClickPendingIntent(R.id.butinfo,pendingIntent1);
// 根据builder创建notification
Notification notification = builder.build();
// 利用manager将通知显示出来
manager.notify(100,notification);
}
});
cancelButton = (Button) findViewById(R.id.cancel_notification);
cancelButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 1. 拿到manager
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
// 2.取消通知
// 取消所有通知
manager.cancelAll();
// 取消指定的通知,根据id号来确定对象
// manager.cancel(110);
}
});
}
}