Android中PendingIntent的简单使用

PendingIntent在Android中用于封装Intent操作,如启动Service或Activity。它常与AlarmManager和Notification结合,例如在AlarmManager中设置周期任务,通过PendingIntent触发Service执行。在与Notification配合时,PendingIntent能启动指定的Activity。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PendingIntent主要用于包装一个Intent及该Intent对应的动作。

例如,PendingIntent调用getSerivce接口,可以包装一个启动Service的Intent;
调用getActivity接口,可以包装一个启动Activity的Intent。


PendingIntent一般与AlarmManager、Notification等一起工作。
例如:

public static void setServiceAlarm(Context context, boolean isOn) {
    //得到启动服务对应的Intent
    Intent i = PollService.newIntent(context);

    //利用PendingIntent的getService接口,得到封装后的PendingIntent
    //第二个参数,是区分PendingIntent来源的请求代码
    //第四个参数,是决定如何创建PendingIntent的标志位
    PendingIntent pi = PendingIntent.getService(context, 0, i, 0);

    AlarmManager alarmManager = (AlarmManager)
            context.getSystemService(Context.ALARM_SERVICE);

    if (isOn) {
        //AlarmManager循环处理PendingIntent
        //其中,第一个参数描述定时器时间基准常量
        //第二个参数指定定时器启动的时间
        //第三个参数指定时间间隔
        alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME,
                SystemClock.elapsedRealtime(), POLL_INTERVAL, pi);
    } else {
        //取消定时器   
        alarmManager.cancel(pi);
        //同时调用PendingIntent的cancel接口
        pi.cancel();
    }
}

使用AlarmManager安排周期任务后,PendingIntent将被定时处理,
每次都可以拉起其中封装的服务。


上述例子中,提到了创建PendingIntent时,可以指定标志位,例如:

public static boolean isServiceAlarmOn(Context context) {
    Intent i = PollService.newIntent(context);

    //指定FLAG_NO_CREATE后,不会主动创建PendingIntent,而是读取系统中的记录,
    PendingIntent pi = PendingIntent.getService(context, 0, i, PendingIntent.FLAG_NO_CREATE);

    return pi != null;
}

PendingIntent与Notification合作的代码类似于:

...........
Resources res = getResources();
Intent i = PhotoGalleryActivity.newIntent(this);
PendingIntent pi = PendingIntent.getActivity(this, 0, i, 0);

//这里使用的支持库中的NotificationCompat
Notification notification = new NotificationCompat.Builder(this)
        //设置通知对应的一些信息
        .setTicker(res.getString(R.string.new_pictures_title))
        .setSmallIcon(android.R.drawable.ic_menu_report_image)
        .setContentTitle(res.getString(R.string.new_pictures_title))
        .setContentText(res.getString(R.string.new_pictures_text))
        //添加通知对应的PendingIntent
        //一旦点击通知后,PendingIntent将被处理
        .setContentIntent(pi)
        .setAutoCancel(true)
        .build();

NotificationManagerCompat notificationManager =
        NotificationManagerCompat.from(this);
notificationManager.notify(0, notification);
.............
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值