Android:如何完全杀死作为后台进程单独运行的服务?

我有一个应用程序,有一个活动,这是作为常规的graphics用户界面和服务。 我的活动有两个button。 一个button来停止进程,一个button来终止进程。 我分别使用这些方法来启动和停止我的过程:

Intent i = null; Button start; Button stop; public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); i = new Intent(this, Service.class); start = (Button) findViewbyId(R.id.start_button); stop = (Button) findViewById(R.id.stop_button); start.setOnClickListener(new OnClickListener(){ public void onClick(){ startService(i); } } stop.setOnClickListener(new OnClickListener(){ public void onClick(){ stopService(i); } } } 

此服务不受约束的行为或应用程序。 我在Manifest中configuration了服务,如下所示:

 <service android:name="com.example.mypackage.Service" android:process=":remote"> <intent-filter> <action android:name="com.example.mypackage.Service" /> </intent-filter> </service> 

当我启动服务时,它运行在它自己独立的任何其他地方。 意思是,当我启动服务和onDestroy()应用程序时,服务仍在运行。 我可以看到它仍然运行,因为通过adb ,我运行ps命令,它说。

问题是当我打电话stopService(intent) 。 当我从活动端调用stopService(intent) ,它会运行在服务的onDestroy()中设置的代码行,但是当我通过adb运行ps时,它表示它仍在运行。

我希望能够完全摧毁这项服务。 我不确定服务是如何工作的,所以请不要犹豫,去补救。 我不确定这是否与我在服务中做什么有关。 谢谢!

编辑:当我启动服务,我使用onStartCommand()并在那里运行一些代码。 我也从onStartCommand()返回START_STICKY 。 我也尝试返回START_NOT_STICKY和服务仍然运行后,我打电话startService(intent)

如果你想强制终止服务进程,你可以使用下面的代码:

 Process.killProcess(Process.myPid()); 

在调用stopService之后,服务将停止。 停止之后,它们不活动,但被caching。

通过android文档,它们变成了一个空的过程 :

不包含任何活动的应用程序组件的进程。 保持这种进程的唯一原因是为了caching目的,以便在下一次组件需要运行时提高启动时间。 系统经常杀死这些进程,以平衡进程caching和底层内核caching之间的整体系统资源。

服务将保持在caching中,直到它将再次被您的应用程序调用或系统caching将无法保留的空间。 RS命令不知道active和cache dprocess之间的区别,allways显示所有令人惊讶的进程。 如果删除:remote这个行为将会维持(请注意,不会创build单独的进程)

我想你可以在清单中设置android:exported="false" ,这样其他应用程序就不能访问服务,从而启动服务。 我可能需要查看代码的完整实现以完全确定其原因。 我做了同样的事情,它工作得很好。