我有一个执行抄送操作的IntentService。当我的应用程序开始更新数据时,我启动了IntentService,当数据已更新时,我需要启动一个显示数据的Activity

但是,正如我现在看到的,IntentService在一个单独的过程中启动我的代码,该过程在创建我的活动之后完成,因此我的活动为空。我可以解决这个问题吗?还是标准Service是唯一方法?

    @Override
    protected void onHandleIntent(Intent intent) {
        Log.e("action",intent.getStringExtra(Utils.INTENT_SERVICE_INVOKE));
        ResultReceiver resultReceiver = intent.getParcelableExtra(Utils.RECEIVER);
        switch (intent.getStringExtra(Utils.INTENT_SERVICE_INVOKE)){
            case Utils.LOAD_All_DATA:{
                loadActivities();
                loadPersons();
                loadPictureData();
                Log.e("order","forth");
                resultReceiver.send(Utils.TASK_FINISHED,new Bundle());
//                Intent broadcastIntent = new Intent();
//                broadcastIntent.setAction(Utils.LOAD_All_DATA);
//                sendBroadcast(broadcastIntent);
                break;
            }
            case Utils.READ_ACTIONS_DATA:{
                readActionData();
                break;
            }
            case Utils.READ_PERSONS_DATA:{
                readPersonsData();
                break;
            }
            case Utils.READ_ACTION_BY_ID:{
                readActionDataById(intent);
                break;
            }
        }
    }

最佳答案

IntentService默认情况下不会在单独的进程中启动。这是一个常规的Service,带有附加的逻辑,该逻辑将工作的执行委派给单个后台线程,并在所有传入的Intents处理完毕后停止该服务。

您要执行以下操作:


从Web服务器执行数据更新
更新完成后通知
Activity获取对更新数据的参考


您的选择是(从我的头开始):


使用可以启动和绑定的标准android Service。在需要更新时启动此Service,在更新完成时发送通知,并从Service绑定Activity以获取数据。
实现一些既不绑定到IntentService也不绑定到Activity的内存中缓存。例如:实现DataManager类并在Application中实例化它。 IntentServiceActivity都可以引用Application,因此它们都可以引用DataManager对象。 IntentService将数据写入其中,而Activity稍后将读取该数据
实现数据缓存SQLite。这种方法与上面的#2非常相似,但是数据没有存储在内存中,而是写入了SQLite数据库。


上面三个选项中最简单的是#2。此外,如果您选择#2,则在出现这种需求时迁移到#3相对容易(这对于“数据密集型”应用程序来说是最佳选择)。

10-07 19:27
查看更多