根据标准的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:让我在这里列出一些事实
现在回答您的问题,如果您的服务仍在运行(由于先前的活动调用了startService()),那么bindService()/ startService()将确保连接到现有服务。
希望这对您有所帮助。如果您还有其他特定问题,请告诉我。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句