// 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>
当服务只在本地使用时(不允许第三方应用程序启动或绑定到它时),文档中建议在清单文件的服务标签中不包括intent-filter,并将exported标签设置为false。
注意:活动和服务在独立的进程(:application和:services进程)中运行。活动和服务之间的通信是通过实现AIDL接口来完成的(这是因为只有AIDL远程接口允许我在需要同时处理IPC的服务内进行多线程,主要是在:services进程中运行的服务之间,而不仅仅是活动之间)。
我的问题是:
Q1:当我在应用程序中使用的活动和服务在两个不同的进程中运行时,我需要使用隐式意图还是显式意图来启动和停止服务?
Q2:当:application进程消失(被销毁,在内存中不存在)且:services进程在后台运行时,如何从新的:application进程再次连接到已经运行的:services进程?我需要以某种方式再次获得对:services进程的引用,以便可以停止该进程内运行的正在运行的服务。据我所知,这不能使用AIDL完成。
问题在于Android可以轻松地销毁:application进程当资源不足时,这对我来说没问题,只要:services进程继续运行即可。(是的,我知道可以通过设置服务作为前台服务等方式来影响进程。我也能看懂手册;)但这不是我的问题)。
当活动和服务在分离的进程中并且使用AIDL时,并且:application进程需要在Android杀死它或用户再次进入应用程序后“找到”:services进程时,我找不到任何与我的问题相关的信息或答案。
欢迎任何专业级别的建议。