我有一个应用程序,它有一个用作常规GUI的Activity和一个Service。我的活动有两个按钮。一个按钮停止进程,一个按钮终止进程。我分别使用这些方法来启动和停止我的过程:
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);
}
}
}
此服务不受actvivty或app的约束。我在Manifest中配置了服务:
<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()
中设置的代码行,但是当我通过ps
运行adb
时,它会说它还在运行。
我希望能够完全破坏服务。我不确定服务是如何运作的,所以请不要犹豫,采取补救措施。我不确定它是否与我在服务中所做的事情有关。谢谢!
修改:
当我启动服务时,我使用onStartCommand()
并在那里运行一些代码。我还从START_STICKY
返回onStartCommand()
。我还尝试返回START_NOT_STICKY
,我致电startService(intent)
后服务仍在运行。
答案 0 :(得分:6)
如果您想要强制终止服务流程,可以使用以下代码:
Process.killProcess(Process.myPid());
答案 1 :(得分:5)
调用stopService后服务停止。停止后,它们处于非活动状态,但已缓存。
通过Android文档,它们变为empty process:
不包含任何活动应用程序组件的进程。保持这种进程活着的唯一原因是缓存目的,以便在下次组件需要运行时改善启动时间。系统通常会杀死这些进程,以便在进程缓存和底层内核缓存之间平衡整个系统资源。
服务将保留在缓存中,直到您的应用程序再次调用它,否则系统缓存将无法保留空间。 RS命令不知道活动和缓存dprocess之间的区别,并且总是显示所有可用的进程。如果删除:remote
(注意不会创建单独的进程)
答案 2 :(得分:-1)
我认为您可以在清单中设置android:exported="false"
,以便其他应用无法访问服务,从而启动服务。我可能需要查看代码的完整实现,以完全确定它的原因。我做了同样的事情并且工作得很好。