PendingIntent的解读。

前言

最近做一个dialog需要不点击确定过段时间还是会提示。就用到了PendingIntent和AlarmManager的组合来完成这项任务,中间遇到些问题。这里闲了下来,就看了下源码。但是忽然感觉源码不能回答我的问题,因为这里一个非常重要的参数(target)通过native来新构建的(ps这里貌似有adil,这一块不熟悉),调用的进程(AlarmManager、Notifiction)等目标进程不容易跟踪。但是通过读javadoc也了解了不少内容。就在这里写一篇短的博客当一个笔记。

PendingIntent的作用

基本功能很像intent。因为target本身一定包含一个intent,有机会再具体研究具体构成。这里主要说明下从javadoc得到的信息。具体作用是在当前context不存在时候,PendingIntent依然可以正常工作,这里非常适合定时工作,例如用在AlarmManager、Notifiction等中。

注意事项

  1. 作为构造参数的intent尽量使用详细的classname。这里推荐使用
    java
    intent.setclass(Context packageContext, Class<?> cls);

    这里很多近似的代码。这里都是intent的内容。就不在这里详细研究了。
  2. 跨进程注意权限问题。
  3. 当有两个同样动作的intent的动作时候,应该让他们两个不一样,具体如何做我也不会(ps我是直接动用系统flag设置强制更新)。
  4. 有些方法没研究,

主要方法

这里主要是用来启动activity和service和发送广播。因此包含了三个主要方法getactivity()、getservice()、getBroadcast(),可以创建出一个用于启动activity、service、发送广播里的pengdingintent的实例。这里包含四个参数。第一个是context,也就是启动的context。第二个是requestcode。这里是用来返回值时使用的,具体如何使用没有测试(我都是默认填0,因为我不需要返回)。第三个参数是intent,也就是所要执行的动作(刚才提要尽量使用具体的classname)。第四个是个flag。标志着对于已经存在相同目的的PendingIntent是如何处理。这里简单介绍几个参数的意思,
1. FLAG_ONE_SHOT 当前PendingIntent仅仅能使用一次。使用过后立马回收
2.FLAG_NO_CREATE 、

       *Flag indicating that if the described PendingIntent does not
     * already exist, then simply return null instead of creating it.

这里貌似是说如果没有就返回空。不在创建。
3.FLAG_CANCEL_CURRENT要是当前存在就取消当前的。
4.FLAG_UPDATE_CURRENT更新当前的

代码讲解

获得service

        Intent intent = new Intent(this,MyService.class);
        PendingIntent pendingIntent = PendingIntent.getService(this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);

获取activity

        Intent intent1 = new Intent();
        intent1.setClassName(this.getPackageName(), Main2Activity.class.getName());
        PendingIntent pendingIntent1 = PendingIntent.getActivity(this,0,intent1,PendingIntent.FLAG_UPDATE_CURRENT);

获取广播

        Intent intent2 = new Intent("android.TEST.BRO");
        PendingIntent pendingIntent2 = PendingIntent.getService(this,0,intent2,PendingIntent.FLAG_UPDATE_CURRENT);

具体使用这里写了两个例子供大家参考:


        AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
        alarmManager.set
        (AlarmManager.RTC, Calendar.getInstance().getTimeInMillis() + 1000, pendingIntent);
         Notification notify3 = new Notification.Builder(this)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setTicker("通过notifiction启动activity")
                .setContentTitle("Notification Title")
                .setContentText("This is the notification message")
                .setContentIntent(pendingIntent1).setNumber(1).build();
        notify3.flags |= Notification.FLAG_AUTO_CANCEL;
        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(1,notify3);

附上示例代码

下载地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值