Android - 后台服务在其调用者活动被销毁时停止

时间:2016-05-18 06:28:55

标签: android android-service

我有一个始终在运行的后台服务,从我的MainActivity开始。问题是,当MainActivity被销毁时,我的服务重新启动。这种情况是服务停止的唯一情况,因此"始终运行"事情进展顺利。

我想知道为什么会这样,以及我可以做些什么来阻止它。

我的服务不受我的活动约束,因为我不需要它。

服务:

public class LocationService extends Service implements GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener, LocationListener {

    ...
    public LocationService() {

    }

    @Override
    public void onCreate() {

        // Some initialization logic here
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        return START_STICKY;
    }

    ...
}

MainActivity:

public class MainActivity extends BaseActivity {

    ...
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Start location service in background
        Intent intent = new Intent(this, LocationService.class);
        startService(intent);
    }
}

提前致谢! :d

1 个答案:

答案 0 :(得分:2)

我猜是因为我没有足够的数据。当您的MainActivity被销毁时,托管您的应用程序的操作系统进程中没有活动活动,只有您的Service。 Android认识到该进程没有托管任何实时活动,因此它会终止进程以释放资源。由于您的Service返回START_STICKY,Android会安排您的Service重新启动。 Service在新的操作系统进程中重新实例化。

您可以在单独的操作系统过程中运行Service来测试此理论。只需添加

android:process=":remote"

<service>的清单条目。这可能会对您的应用程序产生其他影响,因此请务必理解。

在任何情况下,Android都会随机杀死只托管服务的操作系统进程,即使他们返回START_STICKY。没有办法阻止这种情况,特别是在资源有限的低端设备上。这是Android的清洁方式; - )