你能解释一下 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
获取更新数据的引用
您的选择是(从我的脑海中):
-
使用标准的android
Service
,既可以启动也可以绑定。需要更新时启动此Service
,更新完成时发送通知并从Activity
绑定Service
以获取数据。
实现一些既不绑定到IntentService
也不绑定到Activity
的内存缓存。例如:实现DataManager
类并在Application
中实例化它。 IntentService
和Activity
都可以获得对Application
的引用,因此它们将能够获得对DataManager
对象的引用。 IntentService
会将数据写入其中,Activity
稍后会读取此数据
实施数据缓存 SQLite。这种方法与上面的#2 非常相似,但数据不是存储在内存中,而是写入 SQLite 数据库中。
上述三个选项中最简单的是#2。此外,如果您选择 #2,那么如果出现这种需求,迁移到 #3 将相对容易(这对于“数据密集型”应用程序来说是最好的)。
【讨论】:
Thx,我想我会尝试使用服务解决方案(以前使用过),我已经扭曲了进程字值,我说的是线程,sry。遗憾的是,我们无法真正从 IntentService 获得某种 task_finished 回调,如果它们被实现的话,这将是一个很棒的工具。 @Turbozanik,您可以使用事件总线来执行应用程序中组件之间的通信。我最喜欢的活动巴士是 Green Robot 的活动巴士。使用这些工具,您可以轻松地将事件从Service
传递到 Activity
、Fragment
、Application
等。
我正在使用 ResultReceiver,但我不喜欢 Green Robot 的。谢谢。以上是关于你能解释一下 IntentService 是如何工作的吗的主要内容,如果未能解决你的问题,请参考以下文章