任务是以某种方式处理"分享"意图已经运行服务。
至于ACTION_SEND
是一项活动行动,我们必须在活动中获取意图并将其广播给服务。
问题是它在逻辑上实现所有"共享意图"服务处理和使用活动仅用于广播意图。
因此服务必须接收意图(以前通过活动接收和广播),以便我们可以调用getType()
和get****Extra***()
以便知道实际共享的内容并以某种方式处理此数据
我们在活动中收到的意图是行动ACTION_SEND
(或ACTION_SEND_MULTIPLE
),对吧?因此,从逻辑上讲,我们可以通过调用setAction()
来改变对意图对象的操作,并将其广播到已经在侦听此特定操作的服务中。
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();
}
// ...
}
但这不起作用,我在服务中没有收到这个意图。 如果我没有复制意图并且播放了一个空的,我会在我的服务中收到它。
我做错了什么?
答案 0 :(得分:2)
首先,要启动服务,请致电startService()
,而不是sendBroadcast()
。没有理由让服务响应广播,并且您正在通过这样做为您的应用添加安全问题。
其次,您必须在startService()
上拨打Intent
来识别您的服务(例如new Intent(this, ThisIsTheService.class)
)。在您的情况下,您正在使用Intent
识别活动,使用复制构造函数来复制它,更改操作字符串,然后尝试使用它。
而且,由于Intent
为Parcelable
,您只需将其作为额外内容添加到特定于服务的Intent
中:
startService(new Intent(this, ThisIsTheService.class).putExtra(EXTRA_SEND, getIntent()));
并且您的服务可以在EXTRA_SEND
(如果是onHandleIntent()
)或IntentService
(如果不是)onStartCommand()
中选择EXTRA_SEND
。此代码段假定您将{{1}}定义为某处某个字符串。