16

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

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

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

  • 退出了我的应用程序,按住返回软键,直到我看到主屏幕。线程仍在运行。
  • 我通过转到Manage apps -> App -> Force stop来杀死我的应用程序。线程已停止。

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


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>

然而,我的发现是,

  • 退出了我的应用程序,按住返回软键,直到我看到主屏幕。服务仍在运行。
  • 我通过转到Manage apps -> App -> Force stop来杀死我的应用程序。服务已停止。

似乎 和 的行为ServiceThread相同的。那么,为什么我应该使用Service而不是Thread?有什么我错过的吗?我以为我的Service假设会继续运行,即使我杀死了我的应用程序?

4

5 回答 5

12

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

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

但是,如果您有一个服务正在运行,那么 Android 会注意到您有一个正在运行的服务并且不会那么轻易地终止它。但是,如果它不是“正在使用”,Android 仍然有可能会终止您的服务进程。

于 2012-06-28T09:29:01.633 回答
4

实际上,您可以实现不同种类的服务。使用 aService而不是IntentService. 您需要查看START_STICKY,即使您的活动终止,您也可以让您的服务在后台运行START_NOT_STICKY安卓服务START_REDELIVER_INTENT

于 2014-02-14T07:20:46.217 回答
1

您正在使用startService(). 将Service一直运行,直到它的代码完成,或者直到 Android 决定它应该被杀死。查找绑定服务。你Activity.onDestroy()应该打电话给你unbindService()

于 2012-06-28T09:25:41.117 回答
1

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

然后,如果被杀死,您的服务将在一段时间后以相同的 Intent 由系统自动重新启动。

请务必像这样在 onStartCommand() 上调用超级实现:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    super.onStartCommand(intent,flags,startId);
    return START_REDELIVER_INTENT;
}
于 2015-06-26T18:32:45.123 回答
1

您可以在的构造函数中调用setIntentRedelivery(true)IntentService

于 2017-07-15T10:03:38.747 回答