Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android “发送”;“分享意向”;(动作发送)从活动到服务_Android_Android Intent_Android Service - Fatal编程技术网

Android “发送”;“分享意向”;(动作发送)从活动到服务

Android “发送”;“分享意向”;(动作发送)从活动到服务,android,android-intent,android-service,Android,Android Intent,Android Service,任务是在已经运行的服务中以某种方式处理“共享”意图 至于动作\u SEND是一项活动动作,我们必须在活动中获取意图并将其广播给服务部门 问题在于,从逻辑上讲,在服务中实现所有“共享意图”处理,并且仅将活动用于广播意图 因此,服务必须接收意图(之前由活动接收和广播),因此我们可以调用getType()和get****Extra***(),以便了解实际共享的内容并以某种方式处理此数据 我们在活动中收到的意图包含动作action\u SEND(或action\u SEND\u MULTIPLE),对吗

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

至于
动作\u SEND
是一项活动动作,我们必须在活动中获取意图并将其广播给服务部门

问题在于,从逻辑上讲,在服务中实现所有“共享意图”处理,并且仅将活动用于广播意图

因此,服务必须接收意图(之前由活动接收和广播),因此我们可以调用
getType()
get****Extra***()
,以便了解实际共享的内容并以某种方式处理此数据

我们在活动中收到的意图包含动作
action\u SEND
(或
action\u SEND\u MULTIPLE
),对吗?因此,从逻辑上讲,我们可以通过调用
setAction()
将操作更改为intent对象,并将其广播给已经在侦听此特定操作的服务

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();
    }
    // ...
}
但这是行不通的,我在服役时没有收到这种意图。 如果我不复制我得到的意图并广播一个空的意图,我会在我的服务中收到它


我做错了什么?

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

其次,您必须调用
startService()
,调用
意图
,该意图将识别您的服务(例如,
新意图(this,ThisIsTheService.class)
)。在您的例子中,您正在获取一个
意图
来识别一个活动,使用复制构造函数来复制它,更改操作字符串,然后尝试使用它

而且,由于
意图
可包裹的
,因此您可以将其作为额外内容添加到特定于服务的
意图

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

您的服务可以在
onHandleIntent()
(如果是
IntentService
)或
onStartCommand()
(如果不是)中选择
EXTRA\u SEND
。此代码段假定您将
EXTRA\u SEND
定义为某个字符串。

Rats,当您的出现时,我的答案几乎是一样的:-)无论如何,这是正确的答案,请接受它。我的服务已经在运行,它不应该响应广播,而只是默默地处理数据。之所以我不在每次收到共享事件时启动服务,是因为运行中的服务包含的数据有点难以初始化(当外部usb存储与OTG电缆连接时,服务启动,服务使用USBDeviconnection和bulkTransfer根据fat32文件系统分区读取和解析数据。因此,当我收到共享意图时,我准备处理它并在usb上复制数据。例如,如果我在每个共享事件上初始化此数据,则需要花费一点时间我知道如何使用startService。可以通过运行服务来完成吗?我仍然可以使用sendBroadcast还是应该使用bindService?@nicolausYes:“我的服务已经在运行了,它不应该响应广播,只是静静地处理数据”--您仍然使用
startService()
将数据发送到服务。您可以调用
startService()
任意次数;服务仅在需要时创建。“如果我在每个共享事件上初始化此数据…”——将该逻辑放入服务的
onCreate()
。“我仍然可以使用sendBroadcast还是应该使用bindService?”--我不会使用这两种方法,而是使用
startService()
。在您的两个选项中,
bindService()
会更好,但要做到这一点需要技巧。