停止我的应用程序后,IntentService将被终止

Che*_*eng 15 android

我指的是android设计注意事项:AsyncTask vs Service(IntentService?)

根据讨论,AsyncTask不适合,因为它与您的Activity紧密"绑定"

所以,我启动一个Thread(我假设AsyncTask和Thread属于同一类别),在其中有一个无限运行循环并进行了以下测试.

  • 退出我的应用程序,按住后退软键,直到我看到主屏幕.线程仍在运行.
  • 我通过管理应用程序 - >应用程序 - >强制停止杀死我的应用程序.线程停止.

所以,我希望以后我是从改变ThreadService,我Service会继续我即使活着退出杀死我的应用程序.


Intent intent = new Intent(this, SyncWithCloudService.class);
startService(intent);
Run Code Online (Sandbox Code Playgroud)
public class SyncWithCloudService extends IntentService {
    public SyncWithCloudService() {
        super("SyncWithCloudService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        int i = 0;
        while (true) {
            Log.i("CHEOK", "Service i is " + (i++));
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
                Log.i("CHEOK", "", ex);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
    // Doesn't matter whether I use "android:process" or not.
    <service 
        android:name="com.xxx.xml.SyncWithCloudService" 
        android:process=".my_process" >
    </service>
Run Code Online (Sandbox Code Playgroud)

但是,我的发现是,

  • 退出我的应用程序,按住后退软键,直到我看到主屏幕.服务仍在运行.
  • 我通过管理应用程序 - >应用程序 - >强制停止杀死我的应用程序.服务已停止.

似乎行为ServiceThread是一样的.那么,为什么我要用Service而不是Thread?有什么我错过了吗?Service即使在我杀了我的应用程序之后,我还以为我会继续运行?

Dav*_*ser 12

不.当您终止应用程序时,服务将停止运行.当你杀死你的应用程序时,它的所有组件都被杀死(活动,服务等).

通常,线程和服务的行为是类似的.但是,如果从Activity启动一个Thread然后关闭活动(即:退出你的应用程序),最终Android会注意到你的进程中没有活动组件(因为Android不能将你的Thread识别为活动组件)它会杀死你的进程,从而杀死线程.

但是,如果您正在运行服务,那么Android会注意到您正在运行服务而不是那么容易杀死它.但是,如果Android没有"正在使用",Android仍可能会终止您的服务流程.

  • 不,正如我之前所说,如果认为不需要,或者其他应用程序需要内存,Android也会终止你的服务.但是,它会杀死没有运行服务的进程,然后才会终止具有正在运行的服务的进程. (3认同)
  • 但我的测试是,当我退出我的应用程序时(按下软键几次直到我到达主屏幕),线程仍在运行.是因为,我很幸运,操作系统不会杀死我的线程? (2认同)
  • 是的,您的线程将运行一段时间,直到Android决定终止该进程.它不是马上就能做到的,它只会在它感觉到的时候才会这样做.您无法控制何时终止该进程. (2认同)