您的位置:首页 > 移动开发 > Android开发

Notification 都不知道,还学什么 Android 应用开发

2017-07-28 21:10 411 查看

目录

Notification 的概念

在 Notification 中启动 Activity

在 Notification 中启动 Service

实现 Action

Notification 的概念

是 Android 系统提供的一个功能,所以它独立于 Activity 存在 。 使用 NotificationManager 来调用。

在 Notification 中启动 Activity

点击通知后,需要打开 Activity ,这时PendingIntent就派上了用处。

PendingIntent getService 方法的四个参数 。

第一个参数 Context :传入需要的上下文环境 。

第二个参数 requestCode (int) : 相当于ID 。

第三个参数 Intent :将要被运行的 Activity

第四个参数 flags (int) :为一个Intent 创建单个 PendingIntent 时,传入 。 FLAG_UPDATE_CURRENT , FLAG_CANCLE_CURRENT 。

代码实现

1.创建PendingIntent

public static PendingIntent contentIntent(Context context){

Intent intent=new Intent(context, MainActivity.class);

return   PendingIntent.getActivity(context,PendingIntentFlag,intent,PendingIntent.FLAG_UPDATE_CURRENT);

}


2.创建 Notification 有两种写法,第一种直接new出来,第二种是使用 NotificationBuilder ,然后创建 NotificationManager ,此步骤较多,但是更值得学习。

public static  final int  NOTIFICATION_ID= 1103;
public static void remindUserBecauseCharing (Context context){
NotificationCompat.Builder notificationBuilder= new NotificationCompat.Builder(context)
.setColor(ContextCompat.getColor(context,R.color.colorPrimary))
.setSmallIcon(R.drawable.ic_drink_notification)
.setLargeIcon(largeIcon(context))
//设置标题
.setContentTitle(context.getString(R.string.app_name))
//设置内容
.setContentText("通知内容")
//设置震动,声音 ,灯光
.setDefaults(DEFAULT_VIBRATE)
//传入PendingIntent
.setContentIntent(contentIntent(context))
.setAutoCancel(true);

if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.JELLY_BEAN){
//只有os4.1会使用heads up
notificationBuilder.setPriority(Notification.PRIORITY_HIGH);
}

NotificationManager notificationManager=(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(NOTIFICATION_ID,notificationBuilder.build());
}


在 Notification 中启动 Service

其实在 Notification 中启动其它组件,只需要调用不同的 get 方法,例如调用 getService 。

有人要问为什么只能用对应的 get 方法呢?你还记得吗?在写好 Intent 后还需要调用 startActivity 或者 startService ,而 PendingIntent 中传入了四个参数就OK了。 * 咱们用官方注释说话:*

* Retrieve a PendingIntent that will start a service, like calling
* {@link Context#startService Context.startService()}.  The start
* arguments given to the service will come from the extras of the Intent.
*


*意思是:传入的 Context 被用来调用startService。所以我们成功找到了 PendingIntent 的秘密。

实现 Action

通知组件还提供弱交互的功能 Action ,但是 Action 不可过多设置,两个已经是极限了。

创建相应的 Action ,在这里作者设置了两个,

一个“ 我知道了 ”,点击后清除通知。另一个“ 我马上喝水 ”,执行另一部分逻辑(读者暂时不需要关注具体的逻辑)。

public static NotificationCompat.Action ignoreReminderAction(Context context){
//创建 Intent
Intent intentToService = new Intent(context, WaterReminderIntentService.class);
//给 Intent 加 action
intentToService.setAction(ReminderTasks.ACTION_DISMISS_NOTIFICATION);
if(intentToService.getAction()!=null){
String actionString = intentToService.getAction();
Log.d("测试Action:",actionString);
}
//创建 PEndingIntent
PendingIntent pendingIntent= PendingIntent.getService(
context,
WATER_REMINDER_ACTION_IGNORE,
intentToService,
PendingIntent.FLAG_CANCEL_CURRENT );
// 创建 Action
return new NotificationCompat.Action(R.drawable.ic_local_drink_black_24px,"我知道了",pendingIntent);

}


2.在 NotificationBuilder 中 addAction

.addAction(ignoreReminderAction(context))


效果图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android