Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.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
Java 如何使用putExtra将类实例传递给服务_Java_Android_Flutter - Fatal编程技术网

Java 如何使用putExtra将类实例传递给服务

Java 如何使用putExtra将类实例传递给服务,java,android,flutter,Java,Android,Flutter,我有一个类,它使用import io.flatter.plugin.common.MethodChannel的类实例,但现在我想将该类实例传递给一个可以调用它的服务,但我无法绕过它 我尝试过使用putExtra,但我似乎找不到从服务端获得它的方法 例如: Intent playIntent = new Intent(activity.getApplicationContext(), MusicPlayerService.class); playIntent.putExtra("activeAud

我有一个类,它使用import io.flatter.plugin.common.MethodChannel的类实例,但现在我想将该类实例传递给一个可以调用它的服务,但我无法绕过它

我尝试过使用putExtra,但我似乎找不到从服务端获得它的方法

例如:

Intent playIntent = new Intent(activity.getApplicationContext(), MusicPlayerService.class);
playIntent.putExtra("activeAudioUrl", activeAudio);
playIntent.putExtra("channelInstance", channel);
activity.startService(playIntent);
下面是我试图从中获取数据的服务类:

public int onStartCommand(Intent intent, int flags, int startId) {
    String activeAudio = intent.getStringExtra("activeAudioUrl");
    MethodChannel methodChannel = intent.getParcelableExtra("channelInstance");

    ...
}

不能通过调用startService()将非数据对象传递到IPC边界上。实际上,您在这里所做的是调用ActivityManager,这是一个在不同进程中运行的系统服务,用于在您的进程中为您启动服务。相反,您可以将MethodChannel引用放在可以从服务和启动它的位置访问的位置,例如,通过使用依赖项注入。

您应该创建一个包含要传递的数据的类,并从
可序列化的
可打包的
扩展/实现该类,然后您可以将该类的对象作为
额外的
放入您的
意图
中,并在
服务
中使用它。 在这个类中,您创建数据,传递它们,然后检索它们。 要创建自定义包裹类,您可以看到以下链接:

根据我的观点,最好用包裹

因此,创建一个实现Parcelable的类(例如,命名这个类
DataToSend
),您可以使用构造函数传递数据,并使用getter检索数据

编辑=>现在
DataToSend
已经实现了
Parcelable
,您需要做的就是:

Bundle bundle = new Bundle();
DataToSend dataToSend = new DataToSend(activeAudio, channel);
bundle.putParcelable("data", dataToSend);
Intent playIntent = new Intent(activity.getApplicationContext(), 
MusicPlayerService.class);
playIntent.putExtra(bundle);
activity.startService(playIntent);
以及检索数据:

public int onStartCommand(Intent intent, int flags, int startId) {
    String activeAudio = intent.getStringExtra("activeAudioUrl");
    MethodChannel methodChannel = intent.getParcelableExtra("channelInstance");
    Bundle b = intent.getExtra();
    DataToSend data = (DataToSend) b.getParcelable("data");

    // Here you can retrieve your data(channel & activeAudio) from following
    // data object. (e.g. data.getAudio())
    ...
}

基本上,如果您想要以一种意图传递一个类,该类需要实现
Parcelable
接口。但是,我怀疑您是否有意传递
MethodChannel
的实例。您将泄漏与通道关联的数据。为什么要这样做?
MethodChannel
是否实现了
Parcelable
?另一方面,您可以绑定服务并使用
Binder
设置实例。没有MethodChannel不实现
Parcelable
如何绑定服务,请显示代码示例。我是java新手,我正在尝试为需要使用android的框架创建一个插件。也许这个方法可以解决您的问题。