PendingIntent和Intent的区别

本文深入探讨了Android中Intent与PendingIntent的区别与应用,通过具体示例解析了PendingIntent如何用于延迟执行Intent,特别是在通知、短信发送等场景下的使用方法。
Java代码
  1. Notification n = new Notification(R.drawable.face_1, "Service启动", System.currentTimeMillis());
  2. PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, TServiceHolder.class), 0);
  3. n.setLatestEventInfo(this, "任务标题", "任务内容", contentIntent);
  4. nManager.notify(NOTIFICATION_ID, n); // 任务栏启动

PendingIntent和Intent的区别:An Intent is something that is used right now; a PendingIntent is something that may create an Intent in the future. You will use a PendingIntent with Notifications, AlarmManager, etc.

1. GSM网络中android发送短信示例

(1)代码节选

Java代码
  1. String msg ="你好,美女";
  2. String number = "135****6784";
  3. SmsManager sms = SmsManager.getDefault();
  4. PendingIntent pi = PendingIntent.getBroadcast(SmsActivity.this,0,new Intent(...),0);
  5. sms.sendTextMessage(number, null, msg, pi, null);
  6. Toast.makeText(SmsActivity.this,"发送成功",Toast.LENGHT_LONG).show();

(2)代码解释

PendingIntent就是一个Intent的描述,我们可以把这个描述交给别的程序,别的程序根据这个描述在后面的别的时间做你安排做的事情 (By giving a PendingIntent to another application, you are granting it the right to perform the operation you have specified as if the other application was yourself,就相当于PendingIntent代表了Intent)。本例中别的程序就是发送短信的程序,短信发送成功后要把intent广播出去 。
函数SmsManager.sendTextMessage(String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent)中参数解释:
1)PendingIntent sentIntent:当短信发出时,成功的话sendIntent会把其内部的描述的intent广播出去,否则产生错误代码并通过android.app.PendingIntent.OnFinished进行回调,这个参数最好不为空,否则会存在资源浪费的潜在问题;
2)PendingIntent deliveryIntent:是当消息已经传递给收信人后所进行的PendingIntent广播。
查看PendingIntent 类可以看到许多的Send函数,就是PendingIntent在进行被赋予的相关的操作。

总结:

Intent 表示一个目的,第一个参数表示所在类,第二个参数表示目标类
PendingIntent 即是一个Intent的描述
PendingIntent和Intent的区别:
PendingIntent就是一个Intent的描述,我们可以把这个描述交给别的程序,别的程序根据这个描述在后面的别的时间做你安排做的事情
换种说法Intent 字面意思是意图,即我们的目的,我们想要做的事情,在activity中,我们可以立即执行它
PendingIntent 相当于对intent执行了包装,我们不一定一定要马上执行它,我们将其包装后,传递给其他activity或application
这时,获取到PendingIntent 的application 能够根据里面的intent 来得知发出者的意图,选择拦击或者继续传递或者执行

转载于:https://my.oschina.net/haquanwen/blog/52998

### PendingIntent 中显式 Intent 隐式 Intent区别及示例 #### 显式 Intent 的定义使用 显式 Intent 是指在创建 `Intent` 时明确指定目标组件的类名,例如通过 `setClass()` 或 `setComponent()` 方法。这种方式直接告诉系统应该启动哪个组件,因此不会依赖系统进行匹配,确保 `Intent` 被准确发送到预期的目标组件[^3]。 示例代码如下: ```java Intent intent = new Intent(); intent.setComponent(new ComponentName("com.example.app", "com.example.app.TargetActivity")); PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE); ``` 在上述代码中,`PendingIntent` 封装了一个显式 `Intent`,其目标组件是 `com.example.app.TargetActivity`。这种方式适用于目标组件已知且固定的情况,具有较高的安全性准确性。 #### 隐式 Intent 的定义使用 隐式 Intent 不指定具体的目标组件,而是通过 `action`、`category`、`data` 等属性描述要执行的操作,系统会根据 `IntentFilter` 匹配合适的组件来响应该 `Intent`。这种方式具有较高的灵活性,但也可能导致不确定性,因为多个组件可能匹配同一个 `Intent`[^3]。 示例代码如下: ```java Intent intent = new Intent("com.example.action.CUSTOM_ACTION"); intent.setPackage("com.example.app"); PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE); ``` 在上述代码中,`Intent` 的 `action` 为 `"com.example.action.CUSTOM_ACTION"`,并且通过 `setPackage()` 限制了目标组件只能在 `com.example.app` 包中查找。这种方式虽然仍为隐式 `Intent`,但通过限定包名,缩小了潜在的接收者范围,从而提高安全性。 #### 显式 Intent 隐式 Intent区别 | 特性 | 显式 Intent | 隐式 Intent | |------|-------------|-------------| | **目标组件** | 明确指定组件名称 | 不指定具体组件,由系统匹配 | | **匹配机制** | 直接发送给指定组件 | 系统根据 `IntentFilter` 匹配 | | **适用场景** | 启动特定组件,如自身应用内的 `Activity` 或 `Service` | 启动未知组件,如调用系统功能或第三方服务 | | **安全性** | 高,不会被其他组件意外接收 | 相对较低,可能被多个组件匹配 | | **灵活性** | 低,必须明确知道目标组件 | 高,可适配多种组件 | #### PendingIntent 中使用显式隐式 Intent 的注意事项 - **显式 Intent** 在 `PendingIntent` 中使用时,不需要额外设置 `package` 属性,因为目标组件已经明确指定。 - **隐式 Intent** 在 `PendingIntent` 中使用时,建议通过 `setPackage()` 限定目标包名,以避免被其他应用的组件接收[^2]。 - 从 Android 12 开始,创建 `PendingIntent` 时应使用 `FLAG_IMMUTABLE` 或 `FLAG_MUTABLE` 标志位,以控制 `Intent` 是否可以被修改,从而增强安全性。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值