我们开发了一个将数据发送到其他应用程序的应用程序(生态系统应用程序)

大家好!

这是我关于项目开发的第二篇文章。 对于那些尚未阅读上一篇文章的人 :它是关于如何自动将数据从一个地方(谷歌表)导出到另一个地方(家)的信息。

今天,我将告诉您如何编写(和设计)该库,以便第三方应用程序可以接收由我的应用程序发送的数据。 我问每个有兴趣的猫。

第1部分。问题


简要介绍该项目。 有连接到智能手机的设备。 在我的应用中,神经网络在其中识别设备中的数据并给出结果。 还有其他一些应用程序希望获得这种结果。

结果可能有几种类型:来自设备的裸数据,来自设备的已处理数据,有关设备状态的信息,有关应用程序对数据的访问权的信息(例如,用户已撤销对设备数据的访问权)。 必须以某种方式将此结果转移到其他应用程序。

如果突然我用我的代码不正确地解释了某些内容- 这是我的图书馆的文件

第2部分。规划解决方案


有一个很棒的机制-广播。 简而言之,这是从一个应用程序到其他应用程序的消息。 您可以立即将其发送给所有人,也可以将其发送给特定的人。

要发送和接收此业务,您需要:

  1. 以某种方式从传递的对象制作JSON
  2. 提交广播
  3. 接受其他应用程序中的广播
  4. 从JSON恢复已传输的对象

通常,从对象制作JSON并不总是正确的。 您可以通过广播或可序列化发送名为“可拆分”的邮件。 可序列化是Java的标准配置,可打包是类似的配置,但针对移动设备进行了优化。

我的物体很小。 另外,通常有必要获取JSON:我本人编写了一个第三方应用程序,以便将原始数据发送到服务器。 因此,我选择了“从传递的对象制作JSON”。 也许那我会改变主意。

第3部分。锯解决方案


第1段和第4段。在JSON中,然后返回


这里的一切都很简单。 有一个Gson库非常适合我们的需求。

为了使事情变酷,请重写toString()方法。 好吧,执行fromString()可以使我们的对象返回。

class SecureData(val eeg1: Double?, val eeg2: Double?, date: Date) { override fun toString(): String { val gson = Gson() return gson.toJson(this) } companion object { fun fromString(model: String): SecureData { val gson = Gson() return gson.fromJson(model, SecureData::class.java) } } } 

点2.我们发送对象


这是这样的代码的示例:

 val intent = Intent() intent.action = BroadcastUtils.BROADCAST_GESTURE intent.putExtra(BroadcastUtils.EXTRA_GESTRE, it.toString()) sendBroadcast(intent) 

在这里,我们创建意图,设置其动作,放置对象并将其作为广播发送。
BroadcastUtils.BROADCAST_GESTURE-这是一件小事情,我们将通过它过滤另一个应用程序中的传入广播(无论是否应对其进行处理)。

要将消息发送到特定的应用程序,您需要另外指定以下内容:

  intent.component = ComponentName( PermissionsFetcher.REFACE_APP, "${PermissionsFetcher.REFACE_APP}.receivers.ActionsReceiver" ) 

PermissionsFetcher.REFACE_APP是我的应用程序的APPLICATION_ID,而$ {PermissionsFetcher.REFACE_APP} .receivers.ActionsReceiver是接收者的路径。

点3.我们收到物体


这就是我们注册接收者的方式。 如果使用应用程序上下文注册它,它将接收广播,直到关闭应用程序。 如果您使用激活上下文-直到它关闭。

  registerReceiver(GesturesReceiver(), IntentFilter(BroadcastUtils.BROADCAST_GESTURE)) 

这是GesturesReceiver:

 class GesturesReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { Timber.i("Received gesture") val action = BroadcastUtils.reparseGestureIntent(intent) MainApp.actionSubject.onNext(action) } } 

如您所见,在这里,我收到了这个意图,将其重定义为一个对象,然后使用RxJava将其发送到某个地方。

第4部分。结论


您阅读了有关设计应与其他应用程序交互的应用程序的文章。 希望这种经验对您有所帮助。

为了提高效果,您可以查看我的库的源代码以及使用它的示例,并在需要时加一个星号: github.com/reface-tech/CodeSpecialApp

Source: https://habr.com/ru/post/zh-CN467205/


All Articles