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

时间:2013-12-16 14:15:01

标签: android service background-process

我有一个应用程序,它有一个用作常规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)后服务仍在运行。

3 个答案:

答案 0 :(得分:6)

如果您想要强制终止服务流程,可以使用以下代码:

Process.killProcess(Process.myPid());

答案 1 :(得分:5)

调用stopService后服务停止。停止后,它们处于非活动状态,但已缓存。

通过Android文档,它们变为empty process

  

不包含任何活动应用程序组件的进程。保持这种进程活着的唯一原因是缓存目的,以便在下次组件需要运行时改善启动时间。系统通常会杀死这些进程,以便在进程缓存和底层内核缓存之间平衡整个系统资源。

服务将保留在缓存中,直到您的应用程序再次调用它,否则系统缓存将无法保留空间。 RS命令不知道活动和缓存dprocess之间的区别,并且总是显示所有可用的进程。如果删除:remote(注意不会创建单独的进程)

,将保持此行为

答案 2 :(得分:-1)

我认为您可以在清单中设置android:exported="false",以便其他应用无法访问服务,从而启动服务。我可能需要查看代码的完整实现,以完全确定它的原因。我做了同样的事情并且工作得很好。