【问题标题】:How to pass a class instance to a service using putExtra如何使用 putExtra 将类实例传递给服务
【发布时间】:2019-05-03 03:49:50
【问题描述】:

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

    ...
}

【问题讨论】:

  • 基本上如果你想在一个intent中传递一个类,这个类需要实现Parcelable接口。但是,我怀疑您是否想传递 MethodChannel 的实例。您将泄漏与频道相关的数据。你为什么要这么做?
  • MethodChannel 是否实现了Parcelable?另一方面,您可以绑定服务并使用Binder.. 设置实例
  • no MethodChannel 没有实现Parcelable
  • 如何绑定服务,能否给个代码示例。我是 java 新手,我正在尝试为需要与 android 一起使用的框架创建一个插件。
  • 也许this方法可以解决你的问题。

标签: java android flutter


【解决方案1】:

您应该创建一个包含要传递的数据的类,并从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】:

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

    【讨论】:

      猜你喜欢
      • 2023-03-26
      • 2022-06-24
      • 1970-01-01
      • 1970-01-01
      • 2011-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多