你能解释一下 IntentService 是如何工作的吗
Can you explain me how the IntentService works
我有一个执行 CRUD 操作的 IntentService
。当我的应用程序开始更新数据时,我启动 IntentService
,当数据更新后,我需要启动显示数据的 Activity
。
但正如我现在看到的,IntentService
在一个单独的进程中启动我的代码,该进程在我的 activity 创建后结束,所以我的 activity 是空的。我可以解决这个问题吗?还是标准 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
后停止服务的逻辑。
您想执行以下操作:
- 从网络服务器执行数据更新
- 更新完成后通知
- 从
Activity
获取对更新数据的引用
你的选择是(从我的脑海中):
- 使用标准android
Service
,既可以启动也可以绑定。需要更新时启动此 Service
,更新完成时发送通知并从 Activity
绑定 Service
以获取数据。
- 实现一些既不绑定到
IntentService
也不绑定到 Activity
的内存缓存。例如:实现DataManager
class并在Application
中实例化。 IntentService
和 Activity
都可以获得对 Application
的引用,因此它们将能够获得对 DataManager
对象的引用。 IntentService
会将数据写入其中,Activity
稍后会读取此数据
- 实施数据缓存SQLite。这种方法与上面的#2 非常相似,但是数据不是存储在内存中,而是写入到 SQLite 数据库中。
上面三个选项中最简单的是#2。此外,如果您选择 #2,那么如果出现这种需要,迁移到 #3 会相对容易(这对于 "data heavy" 应用程序来说是最好的)。
我有一个执行 CRUD 操作的 IntentService
。当我的应用程序开始更新数据时,我启动 IntentService
,当数据更新后,我需要启动显示数据的 Activity
。
但正如我现在看到的,IntentService
在一个单独的进程中启动我的代码,该进程在我的 activity 创建后结束,所以我的 activity 是空的。我可以解决这个问题吗?还是标准 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
后停止服务的逻辑。
您想执行以下操作:
- 从网络服务器执行数据更新
- 更新完成后通知
- 从
Activity
获取对更新数据的引用
你的选择是(从我的脑海中):
- 使用标准android
Service
,既可以启动也可以绑定。需要更新时启动此Service
,更新完成时发送通知并从Activity
绑定Service
以获取数据。 - 实现一些既不绑定到
IntentService
也不绑定到Activity
的内存缓存。例如:实现DataManager
class并在Application
中实例化。IntentService
和Activity
都可以获得对Application
的引用,因此它们将能够获得对DataManager
对象的引用。IntentService
会将数据写入其中,Activity
稍后会读取此数据 - 实施数据缓存SQLite。这种方法与上面的#2 非常相似,但是数据不是存储在内存中,而是写入到 SQLite 数据库中。
上面三个选项中最简单的是#2。此外,如果您选择 #2,那么如果出现这种需要,迁移到 #3 会相对容易(这对于 "data heavy" 应用程序来说是最好的)。