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

时间:2019-05-03 03:49:50

标签: java android flutter

我有一个使用import io.flutter.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");

    ...
}

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您应该创建一个包含要传递的数据的类,并从SerializableParcelable扩展/实现该数据,然后可以将该类的对象作为Extra放入您的Intent,并在您的Service中使用它。 在此类中,您将创建数据,将其传递,然后将其检索。 要创建自定义的Parcelable类,您可以查看以下链接:

1.stackoverflow

2.medium

根据this link,最好使用Parcelable。

因此,创建一个实现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())
    ...
}

答案 2 :(得分:-2)

有两种使用Bundle传递对象的方式,您可以通过实现ParcelableSerializable来实现。

下面是几个可以帮助您的链接,

Parcelable

Serializable