【问题标题】:IntentService will be killed after I stop my application在我停止我的应用程序后,IntentService 将被杀死
【发布时间】:2012-06-28 09:04:23
【问题描述】:

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

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

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

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

所以,我希望在我从 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>

但是,我的发现是,

  • 退出我的应用程序,按住返回软键,直到看到主屏幕。服务仍在运行。
  • 杀死我的应用程序,方法是转到管理应用程序 -> 应用程序 -> 强制停止。服务已停止。

看来ServiceThread 的行为是一样的。那么,为什么我应该使用Service 而不是Thread?有什么我错过的吗?我以为我的Service 会继续运行,即使我杀死了我的应用程序?

【问题讨论】:

    标签: android


    【解决方案1】:

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

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

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

    【讨论】:

    • 但是我的测试是,当我退出我的应用程序(按几次返回软键直到我到达主屏幕)时,线程仍在运行。是不是因为,我很幸运操作系统没有杀死我的线程?
    • 是的,您的线程将运行一段时间,直到 Android 决定终止该进程。它不会立即这样做,它只会在感觉需要时才会这样做。您无法控制进程何时被终止。
    • 好的。谢谢。我将测试运行它几个小时,看看它是如何工作的。对于服务,Android“保证”不是杀了它吗?因为我在其中运行了一个无限循环(用于测试)。
    • 不,正如我之前所说,如果 Android 认为不需要它,或者其他应用程序需要内存,它也会杀死你的 Service。但是,它会先杀死没有正在运行的服务的进程,然后再杀死有正在运行的服务的进程。
    【解决方案2】:

    实际上,您可以实施不同种类的服务。使用Service 而不是IntentService。您需要查看START_STICKYSTART_NOT_STICKYSTART_REDELIVER_INTENT,即使您的活动终止,您也可以让您的服务在后台运行。 Android services

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        在您的 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;
        }
        

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-10-23
            • 1970-01-01
            相关资源
            最近更新 更多