环境
格拉德尔
implementation 'com.dji:dji-sdk:4.6'
compileOnly 'com.dji:dji-sdk-provided:4.6'
应用程序类
安装程序(新建帮助程序)
public class DJISampleApplication extends Application {
@Override protected void attachBaseContext(Context paramContext) {
super.attachBaseContext(paramContext);
Helper.install(this);
}
...
}
主要活动
(启动SDK注册)
AsyncTask.execute(() -> DJISDKManager.getInstance()
.registerApp(getActivity(), new DJISDKManager.SDKManagerCallback() {
@Override public void onRegister(DJIError djiError) {
if (djiError == DJISDKError.REGISTRATION_SUCCESS) {
DJISDKManager.getInstance().startConnectionToProduct();
}
}
@Override public void onProductDisconnect() {}
@Override public void onProductConnect(BaseProduct baseProduct) {}
@Override public void onComponentChange(BaseProduct.ComponentKey componentKey, BaseComponent oldComponent, BaseComponent newComponent) {}
})
);
打电话后
'注册应用程序'
从djiskmanager实例来看,一切都按预期工作。如果退出应用程序、djiskmanager或其他与DJI相关的类,则不要考虑活动/片段生命周期。
我注意到的第一个(也是更明显的)问题是djiskmanager一直在轮询一个位置。系统栏位置图标永远不会消失,它告诉我DJI SDK安装程序仍在运行。我甚至不知道它为什么要轮询一个位置,但我想这与注册应用程序有关。
在androidstudio中使用Android Profiler工具进行更深入的研究,我可以确认与DJI相关的线程正在持续运行。这一直持续到Android操作系统(我主要在v8.1.0上使用像素XL进行测试)。下面是一个截图
swudp服务
它总是在运行。你也会注意到的
,大约每分钟发生一次。请记住,这一切都是在应用程序处于后台时发生的。如果你要强制关闭应用程序,所有这些都会消失,包括位置图标。
额外信息
我试过很多不同的测试,但主要测试的是DJI-sdk4.5.1和4.6。由于新的无人机支持,回到以前的SDK不是一个选择。请注意,在我的测试和这篇文章中,我将我的代码保持在非常小的范围内,这样我就可以精确地确定哪些代码触发了永不停止的后台线程。
djiskmanager提供了一些感兴趣的方法,但并没有如预期的那样工作。
DJISDKManager.getInstance().destroy();
一个destroy方法,在我测试的每个场景中都会导致应用程序崩溃。安装程序最初似乎仍然无法从SDK中找到所有的引用,但仍然无法找到它运行的所有类助手.class引发异常并使应用程序崩溃。
DJISDKManager.getInstance().stopConnectionToProduct();
stopConnectionToProduct不能满足我的需要。我很确定这不仅仅是为了停止接收产品更改的回调,但在我的测试中并没有真正改变任何行为。实际上,startConnectionToProduct似乎不再需要了。也许这两种方法都应该被弃用?
'注销应用程序'
对于SDK来说,没有公开的方式来正确控制这些DJI线程并尊重Android的生命周期。我注意到DJI提供的androidsdk示例的行为与此相同。我测试了4.5.1和4.6分支机构在其位于以下位置的回购:
https://github.com/dji-sdk/Mobile-SDK-Android
我需要什么
我对DJI-SDK开发还不熟悉,但已经开发Android应用程序很久了。我知道djisdk已经改变了很多关于你如何设置东西,控制不同的管理者,等等。我主要想确认我没有忽略一些东西。如果我真的没有忽视显而易见的问题,有人有办法吗?
我希望能够正确地将djiskmanager设置为具有生命周期意识的组件。我甚至用实现了LifecycleObserver的manager helper类做了一些测试,但是由于缺少任何方法来停止DJI的服务/线程/等等,所以使用它是毫无意义的。在这个LifecycleObserver类中,我甚至尝试过将回调设置为null onPause并重新创建一个新的回调/注册应用onResume。这不会改变行为。
感谢阅读:)