任务是在已经运行的服务中以某种方式处理“共享” 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,使用复制构造函数来制作它的副本,更改操作字符串,然后尝试使用它。
而且,由于 Intent
是 Parcelable
,您可以将它作为额外添加到服务特定的 Intent
中:
startService(new Intent(this, ThisIsTheService.class).putExtra(EXTRA_SEND, getIntent()));
并且您的服务可以在 onHandleIntent()
(如果它是 IntentService
)或 onStartCommand()< 中选择
(如果不是)。此代码 fragment 假定您将 EXTRA_SEND
/EXTRA_SEND
定义为某处的某个字符串。
关于android - 从 Activity 向服务发送 "share intent"(ACTION_SEND),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27207808/