在 onReceive 中包含您的意图时使用 setComponent()

Use of setComponent() when including extras with your intent in onReceive

当我在 onReceive 中设置要由我的接收器拾取的警报时,我想通过我的待处理意图传递额外内容,然后在我的接收意图中作为额外内容传递,以供我的调度服务接收以包含在我的通知。

例如设置闹钟提醒我在 'y' 时间内服用名称为 'x' 的药。我希望在触发警报时在通知中显示名称 'x'。

我发现 this answer 很有帮助。

但是,在 here 提供的 Google Android 示例项目调度程序中,它建议如果您的接收方意图包括需要传递给服务的额外内容,请使用setComponent() 以指示服务应处理接收者的意图:

ComponentName comp = new ComponentName(context.getPackageName(), 
           MyService.class.getName());

// This intent passed in this call will include the wake lock extra as well as
// the receiver intent contents.
startWakefulService(context, (intent.setComponent(comp)));

我引用的答案没有这样做。

是否仅当来自 onReceive 的组件是服务时才需要使用 setComponent,而当组件是 activity 时不需要使用 setComponent?

谢谢,山姆。

However, in the Google Android sample project scheduler available from here, it advises that if your receiver intent includes extras that need to be passed along to the service, use setComponent() to indicate that the service should handle the receiver's intent:

您链接到的页面上没有与此相关的内容。

The answer I referenced does not do this.

是的,确实如此。它通过 Intent 构造函数设置组件。

Is it only required to use setComponent when the component from onReceive is a service and this is not required when the component is an activity?

设置组件,无论是通过构造函数还是setComponent(),用于指示这是应该处理操作的组件,创建所谓的显式Intent。如果您不设置该组件,则其他条件(如操作字符串和 Uri)将用于推断谁应该处理该操作(隐式 Intent)。

一般来说,尽可能使用明确的 Intent 对象,其组件没有 <intent-filter>,以获得最大的安全性。

显式与隐式 Intent 对象的使用与所讨论的组件是 activity、服务还是接收器没有直接关系。