你能解释一下 IntentService 是如何工作的吗

Posted

技术标签:

【中文标题】你能解释一下 IntentService 是如何工作的吗【英文标题】:Can you explain me how the IntentService works 【发布时间】:2017-03-19 06:35:43 【问题描述】:

我有一个执行 CRUD 操作的 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;
            
        
    

【问题讨论】:

您阅读文档了吗?在这里:developer.android.com/reference/android/app/IntentService.html @Christine 是的,我做到了,我的问题没有答案。 文档中有一段关于发送通知的内容,这是启动一个 Activity 的一种方式,该活动检索您的 IntentService 创建的结果,它还有一段关于回调的内容,这是服务如何报告给如果您的应用处于活动状态,则为 Activity。如果您的应用不在前台,则可以生成通知。 你的问题很不清楚。 “我该如何解决这个问题”,但我没有从您的“问题”中看到需要解决的问题。 【参考方案1】:

IntentService 默认情况下不会在单独的进程中启动。它是一个普通的Service,添加了将工作执行委托给单个后台线程的逻辑,并在处理完所有传入的Intents 后停止服务。

您想要执行以下操作:

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

您的选择是(从我的脑海中):

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

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

【讨论】:

Thx,我想我会尝试使用服务解决方案(以前使用过),我已经扭曲了进程字值,我说的是线程,sry。遗憾的是,我们无法真正从 IntentService 获得某种 task_finished 回调,如果它们被实现的话,这将是一个很棒的工具。 @Turbozanik,您可以使用事件总线来执行应用程序中组件之间的通信。我最喜欢的活动巴士是 Green Robot 的活动巴士。使用这些工具,您可以轻松地将事件从 Service 传递到 ActivityFragmentApplication 等。 我正在使用 ResultReceiver,但我不喜欢 Green Robot 的。谢谢。

以上是关于你能解释一下 IntentService 是如何工作的吗的主要内容,如果未能解决你的问题,请参考以下文章

HandlerThread 与 IntentService

你能解释一下这段代码的作用吗?

转载Android IntentService使用全面介绍及源码解析

你能解释一下STA和MTA吗?

你能解释一下 Python 中的装饰器是啥吗? [关闭]

你能解释一下这个 dart json 解析代码吗?