使用显式和隐式意图启动android服务

用户名

根据标准的Android文档,启动服务(即已启动的服务)的首选方式是使用如下明确的意图:

// Using explicit intent:
Intent serviceIntent = new Intent(getApplicationContext(), MyService.class);
// or:
Intent serviceIntent = new Intent(this, MyService.class);
startService(serviceIntent);

您还可以使用带有清单中指定的操作字符串的隐式意图来启动/停止服务,如下所示:

// Using implicit intent:
static final String serviceAction = "com.example.my.app.services.MYSERVICE";
Intent serviceIntent = new Intent(serviceAction);
startService(serviceIntent);

// AndroidManifest.xml:
<service android:name="com.example.my.app.services.MyService"
   android:exported="false" android:process=":services" >
   <intent-filter>
      <!-- Start/Stop service -->
      <action android:name="com.example.my.app.services.MYSERVICE" />
   </intent-filter>
</service>

当仅在本地使用服务时(不允许第三方应用程序启动或绑定到该服务),文档说明清单服务标签中不应包含意图过滤器而应将导出的标签设置为false。

注意:活动和服务在单独的进程(:application和:services进程)中运行。活动和服务之间的通信是通过实现AIDL接口来完成的(之所以如此,是因为只有AIDL远程接口才允许我在需要同时处理IPC的服务中进行多线程处理,不仅是活动之间,而且主要是在运行于该服务中的服务之间):服务流程)。

我的问题是:

问题1:当我在应用程序中使用的活动和服务在两个不同的进程中运行时,是否需要在显式意图上使用隐式意图来启动和停止服务?

问题2:当:application进程消失(已销毁,不再在内存中)并且:services进程在后台运行时,如何将新的:application进程重新连接到已经运行的:services进程?我不知何故需要再次引用:services进程,以便可以停止该进程中正在运行的服务。使用AIDL afaik无法做到这一点。

问题是,Android会并且会在资源不足时轻易地破坏:application进程,只要:services进程继续运行,对我来说这很好。(是的,我知道通过将服务设置为前台服务等来影响流程。我也可以阅读手册;),但这不是我的问题。

当活动和服务处于单独的流程中并且使用AIDL时,以及当:application进程需要在被Android杀死后的:service进程中再次“查找”:service进程时,我找不到与我的问题有关的任何信息或答案。用户再次进入应用程序(在他/她离开应用程序之后)。

欢迎任何专家级的建议。

桑托什

A1:即使您的活动和服务在不同的进程中运行,它们仍然属于同一应用程序。您仍然可以使用显式意图,我在这里看不到使用隐式意图的任何特定优势(让我知道是否找到了:))

A2:让我在这里列出一些事实

  • “已启动”服务(而不是“绑定”服务)的生命周期与已启动该服务的活动的生命周期无关。无论两者是否都在同一进程中运行,都是如此。
  • 在任何时间点只有一个Service实例仍然有效。当您的活动调用startService()时,如果服务实例尚未运行,则将创建该服务实例(在这种情况下,您的服务也会收到onCreate()回调)。但是,如果Service已经在运行,则Framework只需在已经运行的进程上调用onStartCommand()回调(在这种情况下,就没有onCreate()回调)。同样,无论活动和服务运行在同一进程还是不同进程上,这一切都是正确的。

现在回答您的问题,如果您的服务仍在运行(由于先前的活动调用了startService()),那么bindService()/ startService()将确保连接到现有服务。

希望这对您有所帮助。如果您还有其他特定问题,请告诉我。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

显式和隐式意图

来自分类Dev

如何以隐式意图启动浏览器服务?

来自分类Dev

为什么使用隐式意图启动服务并不安全?

来自分类Dev

为什么使用隐式意图启动服务并不安全?

来自分类Dev

Android隐式意图验证

来自分类Dev

Android隐式意图验证

来自分类Dev

Sinch SDK是否在其服务中使用隐式意图?

来自分类Dev

如何检查意图是显式还是隐式的?

来自分类Dev

隐式和显式方法隐藏

来自分类Dev

隐式和显式方法隐藏

来自分类Dev

Android:使用隐式意图读取txt文件

来自分类Dev

如何使用显式意图传递URI?

来自分类Dev

如何使用显式意图传递URI?

来自分类Dev

类和子类之间的隐式和显式转换

来自分类Dev

Python模块导入-显式和隐式相对导入

来自分类Dev

C ++隐式和显式继承构造函数调用

来自分类Dev

Perl6:隐式和显式导入

来自分类Dev

显式和隐式段落的奇怪性

来自分类Dev

隐式和显式强制转换的优缺点

来自分类Dev

隐式和显式语义分析之间的差异

来自分类Dev

Python模块导入-显式和隐式相对导入

来自分类Dev

隐式和显式强制转换的优缺点

来自分类Dev

MSSql-隐式和显式身份插入

来自分类Dev

红宝石。显式和隐式块

来自分类Dev

隐式和显式语义分析之间的差异

来自分类Dev

Ruby显式和隐式返回混淆

来自分类Dev

无法使用隐式广播和后台服务测试Android应用

来自分类Dev

Python使用隐式参数代替显式参数

来自分类Dev

如何从隐式主题显式使用样式?