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

目录

Notification 的概念

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

在 Notification 中启动 Activity

  • 点击通知后,需要打开 Activity ,这时PendingIntent就派上了用处。
  • PendingIntent getService 方法的四个参数 。
    1. 第一个参数 Context :传入需要的上下文环境 。
    2. 第二个参数 requestCode (int) : 相当于ID 。
    3. 第三个参数 Intent :将要被运行的 Activity
    4. 第四个参数 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 不可过多设置,两个已经是极限了。
    1. 创建相应的 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))

效果图这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值