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

时间:2012-06-28 09:04:23

标签: android

我指的是android design considerations: AsyncTask vs Service (IntentService?)

根据讨论, AsyncTask不适合,因为它与您的活动紧密“绑定”

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

  • 退出我的应用程序,按住后退软键,直到我看到主屏幕。线程仍在运行。
  • 终止我的应用,转到 管理应用 - >应用 - >强制停止 。线程已停止。

所以,我希望在我从Thread更改为Service之后,即使我退出 kill Service也会保持活力strong>我的应用。


Intent intent = new Intent(this, SyncWithCloudService.class);
startService(intent);

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);
            }
        }
    }
}

    // Doesn't matter whether I use "android:process" or not.
    <service 
        android:name="com.xxx.xml.SyncWithCloudService" 
        android:process=".my_process" >
    </service>

然而,我的发现是,

  • 退出我的应用程序,按住后退软键,直到我看到主屏幕。服务仍在运行。
  • 终止我的应用,转到 管理应用 - &gt;应用 - &gt;强制停止 。服务已停止。

似乎ServiceThread的行为是相同的。那么,为什么我应该使用Service代替Thread?有什么我错过了吗?我以为我的Service假设在我杀了我的应用程序之后继续运行?

5 个答案:

答案 0 :(得分:11)

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

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

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

答案 1 :(得分:4)

实际上,您可以实施不同类型的服务。使用Service代替IntentService。在那里,您需要查看START_STICKYSTART_NOT_STICKYSTART_REDELIVER_INTENT,即使您的活动已经停止,您也可以在后台运行您的服务。 Android services

答案 2 :(得分:1)

您正在使用startService()Service将一直运行,直到代码完成,或者直到Android决定它应该被杀死。查看bound services。在Activity.onDestroy(),您应该致电unbindService()

答案 3 :(得分:1)

在您的IntentService中,您可以覆盖onStartCommand(),返回START_REDELIVER_INTENT

然后,如果被杀死,系统会在一段时间后使用相同的Intent自动重启您的服务。

请务必在onStartCommand()上调用super实现,如下所示:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    super.onStartCommand(intent,flags,startId);
    return START_REDELIVER_INTENT;
}

答案 4 :(得分:1)

您可以在IntentService

的构造函数中调用setIntentRedelivery(true)