发送"分享意图" (ACTION_SEND)从活动到服务

时间:2014-11-29 22:24:00

标签: android android-intent android-service

任务是以某种方式处理"分享"意图已经运行服务

至于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();
    }
    // ...
}

但这不起作用,我在服务中没有收到这个意图。 如果我没有复制意图并且播放了一个空的,我会在我的服务中收到它。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

首先,要启动服务,请致电startService(),而不是sendBroadcast()。没有理由让服务响应广播,并且您正在通过这样做为您的应用添加安全问题。

其次,您必须在startService()上拨打Intent来识别您的服务(例如new Intent(this, ThisIsTheService.class))。在您的情况下,您正在使用Intent识别活动,使用复制构造函数来复制它,更改操作字符串,然后尝试使用它。

而且,由于IntentParcelable,您只需将其作为额外内容添加到特定于服务的Intent中:

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

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