android - 从 Activity 向服务发送 "share intent"(ACTION_SEND)

标签 android android-intent android-service

任务是在已经运行的服务中以某种方式处理“共享” Intent 。

至于 ACTION_SEND 是一个 Activity 操作,我们必须在 Activity 中获取 Intent 并将其广播到服务。

问题在于,在服务中实现所有“共享 Intent ”处理并仅将 Activity 用于广播 Intent 是合乎逻辑的。

所以服务必须接收 Intent (之前由 Activity 接收和广播)所以我们可以调用 getType()get****Extra***() 以了解实际共享的内容并以某种方式处理这些数据。

我们在 Activity 中收到的 Intent 具有操作 ACTION_SEND(或 ACTION_SEND_MULTIPLE),对吗?所以从逻辑上讲,我们可以通过调用 setAction() 来改变 Action 到 Intent 对象并将它广播到我们已经在监听这个特定 Action 的服务。

public class HandleShareIntentActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Intent intent = getIntent();     
        Intent broadcastIntent = new Intent(intent);

        // If I initialize empty intent there is no problem, 
        // I'll receive it in service            
        // Intent broadcastIntent = new Intent();

        broadcastIntent.setAction(Constants.ACTION_SHARE);
        broadcastIntent.setFlags(0);
        sendBroadcast(broadcastIntent);

        finish();
    }
    // ...
}

但这不起作用,我在服务中没有收到此 Intent 。 如果我不复制我得到的 Intent 并广播一个空的 Intent ,我会在我的服务中收到它。

我做错了什么?

最佳答案

首先,要启动服务,请调用 startService(),而不是 sendBroadcast()。没有理由让服务响应广播,这样做会给您的应用增加安全问题。

其次,您必须在将标识您的服务的Intent 上调用startService()(例如,new Intent(this, ThisIsTheService.class))。在你的例子中,你正在获取一个 Intent 标识一个 activity,使用复制构造函数来制作它的副本,更改操作字符串,然后尝试使用它。

而且,由于 IntentParcelable,您可以将它作为额外添加到服务特定的 Intent 中:

startService(new Intent(this, ThisIsTheService.class).putExtra(EXTRA_SEND, getIntent()));

并且您的服务可以在 onHandleIntent()(如果它是 IntentService)或 onStartCommand()< 中选择 EXTRA_SEND/(如果不是)。此代码 fragment 假定您将 EXTRA_SEND 定义为某处的某个字符串。

关于android - 从 Activity 向服务发送 "share intent"(ACTION_SEND),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27207808/

相关文章:

android - 如何检查 Intent 是显式还是隐式?

android - 一个具有多个 Action 处理功能的广播接收器与多个广播接收器

android - 通过xml更改Android ActionBar中的标题文本颜色

java - 安慰。将带有 "link"的文本写入类/行

android - 如何通过 Intent 播放 YouTube 视频?

android - 启动服务并返回数据

android - Android 服务中错误处理的最佳实践

java - 我怎样才能获得所有可用的宽度?

android - 如何为android VideoView实现暂停 Action ?

java - 重新启用长按 map