当活动介于onDestroy - onCreate状态

时间:2015-10-31 19:46:48

标签: android android-intent android-activity service broadcastreceiver

这有点难以解释,所以我先给你一些背景。

上下文

我正在开发一个Android应用程序,基本上它的作用是从服务器给你一个文件列表(pdf文件),你可以下载这些文件,同步文件的类别,这基本上允许你如果您不想在某个类别上进行任何新更新,请自动下载该类别中的任何新文件或更新文件,或者取消同步文件。

应用程序架构

我有一个Service,负责维护每个更新的类别,如果你想同步一个新的类别,那么你就向服务发送一条消息。如果Service需要通知Activity,因为某个文件正在下载,更新,已完成下载或其他一些事件,Service将触发BroadcastReceiver然后Activity将捕获BroadcastReceiver并将更新视图。该服务在其自己的进程中运行,因此Service始终处于活动状态,即应用程序被杀死时的事件。

下面是一张照片来解释我的拱门:

enter image description here

问题

当用户选择取消同步类别时,与该类别关联的所有文件都将从磁盘,数据库和内存中删除。用户通过切换开关来执行此操作,当您设置切换时,Snackbar将显示告诉用户"类别X已取消同步。"和动作"撤消"。诅咒,在执行Snackbar解雇回调之前,该类别并非真正不同步,这是因为用户按下了动作"撤消"。执行回调时,会向Service发送一条消息,告知其不同步类别,Service将执行正确的操作以删除与该类别相关的所有内容,然后执行该操作。 ll触发BroadcastReceiver以通知Activity,从而查看操作已完成,现在可以更新视图(FileDownloadReceiver,FileDownloadingReceiver,FileErrorReceiver,FileErasedRecever等)。

但是如果我在显示小吃栏的同时旋转屏幕,那么Snackbar解雇回调会将消息发送给服务,Activity将取消注册BroadcastReceivers方法中的onDestroy,然后Service会发送BroadcastReceiver以通知文件已成功删除,但onCreate Activity 1}}尚未执行,因此从BroadcastReceivers触发的Service将会丢失,Activity中的文件将以不正确的状态结束,因为Activity从未抓住BroadcastReceiver中的Service

到目前为止我尝试了什么

很明显,使用Handler并将sendBroadcast置于Runnable内可以解决问题。但它造成了另一个更大的问题。如果我这样做,例如:

...
deleteAllFilesFromCategory(aCategory);
anErasedFile.setState(File.NOT_SYNCHRONIZED);
mHandler.post(new Runnable() {
    @Override
    public void run() {
        FileReceiver.sendFileErasedBroadcast(mContext, anErasedFile);   
    }
});
...
anErasedFile.setState(File.STATE_UNDEFINED);
...

我发现当BroadcastReceiver发送时,它会处理错误的状态,因为它正在另一个线程中运行。

我知道如果我不依赖于通过File广播发送的Intent对象,问题可能会得到修复,但应用程序已经增长了很多那现在不可能。我避免了很多业务逻辑,我简化了很多实际情况,但简而言之,这是主要问题。如果你想要一些细节,你可以自由地问我这些。

问题

如果在BroadcastReceiver的{​​{1}},Service状态之间,我如何从ActivityonDestroy发送onCreate没有使用Activity

0 个答案:

没有答案