更新到1.7.6版本后,通知栏仍概率性自动出现FileDownloader is running提示,点击该通知提示没有响应。该提示是在用户使用手机并未下载资源的时候自动出现,手机未重启放置一晚第二天看这个通知又自动消失了。目前暂未获取到有效log。
确实有这个问题,同样遇到,并困扰已久
+1
第一次安装的时候,个别手机偶发出现FileDownloader is running
每次出现的时候是 App 退到后台的时候吗?
只需要在手机锁屏的时候,利用AS安装启动app,必现
好的,多谢反馈。
建议看下大家是否真的有分离进程使用的需求,如果需求不多的话,改成单例(FileDownloadManager),而不是Service,可能这样更简单直接一点
确实多进程对进度的更新同步带来了负担,也正是考虑到下载本身在大部分情况下没有必要再单独进程工作的事实。OkDownload 在一开始设计的时候就没有考虑多进程。
不过 @kyze8439690 你的表述有些不准确,分离进程和使用 Service 不是一回事。FileDownloader 本身也有可以配置在主进程还是单独的进程运行。
是这样的,我们内部也在把FileDownloader改造成基于一个单例,而不是一个Service,以便解决常驻通知的问题。改造过程中,发现如果去除sperate process之后,代码会好改很多。而且我们也确实没有独立进程的需求,所以索性去除了。当然也可能是我对这个项目不够透彻😄
一个单例和一个 service 这个没理解他们的对应关系是什么。不过建议你们直接尝试 OkDownload 而不是自己在 FileDownloader 的基础上改。
+1
@goufei096 @kyze8439690 @liuleshuai 请问各位是在什么时机调用的
FileDownloader.bindService() 方法?
是在 Application 启动的时候就调用了吗?
Application.onCreate
OK,那定位到问题了,我想办法处理一下。
@kyze8439690 在解决该问题之前,建议不要在 Application.onCreate 里面调用 FileDownloader.bindService() 方法。事实上,你可以选择在第一个 Activity 的 onCreate 方法调用或者不需要主动调用。这样可以立即避免你们受到此问题的困扰。我计划在 1.7.7 优化这个问题。
因为我们app在启动的时候,需要检查一些文件的下载状态,需要和Service通信,所以希望尽可能早地把下载服务跑起来
@kyze8439690 除了当手机熄屏时通过 AS 或者 adb 启动应用会出现这个问题,你还有什么其他使用场景也出现这个问题吗?
目前没有发现必现的方式,但是用户反馈线上还有出现的,一般用户不太可能锁屏开APP
@goufei096 @kyze8439690 @liuleshuai 请各位使用 1.7.7-SNAPSHOT 试试问题有没有得到解决。
Android Q beta6 锁屏启动依然会有通知栏,三星s9 Android 9.0 锁屏启动依然会有通知栏
Android Q beta6 锁屏启动依然会有通知栏,三星s9 Android 9.0 锁屏启动依然会有通知栏
使用的 1.7.7-SNAPSHOT 版本吗?
还有启动的时候,有开始下载任务吗?
SNAPSHOT版本,启动时无下载任务,Application.onCreate时bindService,然后不停获取status检查下载状态
@kyze8439690 找到原因了,针对在非独立进程使用 FileDownloader 的情况忘记修正了,稍后我再发布一个 SNAPSHOT 版本。
在 @kyze8439690 所提供的必现路径中(即在手机熄屏时启动 APP)。Android 8 和 Android 9 及以上表现不一样了。在具体解释之前,先说明下这个 Notification 的背景:
FileDownloader 在设计之初,考虑了多进程,且默认下载是在单独的进程中进行,其实本意是利用多进程将下载和主业务剥离。所以具体的下载放到了 FileDownloadService 这个 Service 中。导致要想下载的话,必须先启动 Service 。本来一切都很好,但是从 Android 8 起,对后台 Service 进行了严格限制,后端启动 Service 的话会直接崩溃,具体可以看 #1078 。
为了适配 Android 8 ,在启动 Service 的时候就会判断当前应用是否在后台,这样的话会启动一个前台 Service ,所以就有了那个通知栏,具体可以看 这里 。
然后又发现了这个 issue 的问题,目前我只能根据 @kyze8439690 给出的路径去解决问题。思路是看手机熄屏状态下启动时读到的 process importance 是什么。在 Android 8 ,对应的值为 IMPORTANCE_TOP_SLEEPING_PRE_28 ;在 Android 9 ,对应的值为 IMPORTANCE_TOP_SLEEPING。在实际判断 APP 是否在后台,其实是通过判断 APP 是否在前端,即判断 process importance 是否为 IMPORTANCE_FOREGROUND,因为这种情况下直接启动一个 Service 是确保没有问题的。基于此,我在修改此 Issue 的问题时,把 IMPORTANCE_TOP_SLEEPING_PRE_28 和 IMPORTANCE_TOP_SLEEPING 也加上了。接下来的事情是,在 Android 8 ,可以解决问题,即当 process importance 为 IMPORTANCE_TOP_SLEEPING_PRE_28 时,是可以创建一个 Service ,但是 Android 9 就不行了,当 process importance 为 IMPORTANCE_TOP_SLEEPING 时,创建非前台 Service 直接崩掉了:
IllegalStateException: Not allowed to start service Intent 。Android 9 里面对后台 Service 的限制更加严格了。
综上,Service 的引入导致了这一系列问题,而现在看来,FileDownloader 作为一个 library ,不应该强依赖这种很受系统管控的东西。所以在 OkDownload 里面,就去掉了这个设计,是否要在 Service 中启动下载完全交由使用者决定。所以目前 FileDownloader 无法完美地解决这个问题,希望大家使用 OkDownload 作为替代。预计 9 月 1 号发布一个新的版本后全力维护 OkDownload ,会把 OkDownload 中无缝替换 FileDownloader 的模块做得更加完善从而方便大家轻松切换到 OkDownload 。
Anyway, thank you very much for your selfless dedication.
如果我们内部改的那个去除Service的FileDownloader测试没有问题,我也发个pull request出来
Most helpful comment
Anyway, thank you very much for your selfless dedication.