应用程序关闭时服务停止

时间:2016-04-21 10:41:47

标签: android service

我需要一个在后台运行的服务,并计算两个位置之间的每分钟距离。我使用Thread来每分钟执行一个方法,然后我明白当应用程序关闭时,服务也会停止,因为应用程序和服务使用相同的线程。 如何在后台创建一个每1分钟调用一次的简单方法,即使应用程序已关闭?

2 个答案:

答案 0 :(得分:11)

可以通过修改清单在单独的流程中运行Service

<service
    android:name="com.example.myapplication.MyBackgroundService"
    android:exported="false"
    android:process=":myBackgroundServiceProcess" >
</service>

但这可能不会带来任何好处。大多数时候it may even be a bad idea

当然最重要的是,如果Service被关闭,它就会重新启动。

Service的{​​{1}}可以返回onStartCommand()标记:

START_STICKY

解释了这个(和其他)选项in the documentation。基本上@Override public int onStartCommand(Intent intent, int flags, int startId) { // Other code goes here... return START_STICKY; } 意味着“嘿Android!如果由于内存不足而真的必须关闭我宝贵的服务,那么请尝试再次启动它。”

START_STICKY意味着“Nahh ......不要打扰。如果我确实需要运行我的服务,我会再次调用startService()。”

这个(开始粘性)大部分时间都可能很好。您的服务将从头开始。如果这适合您的用例,您可以尝试。

然后有“前台服务”不太可能被Android关闭,因为它们被视为更像是可见的应用程序。事实上,它们会在通知抽屉中显示一个图标和(如果你这样做)一个状态文本。因此,用户可以看到它们,例如, SportsTracker,Beddit等应用程序。

这涉及修改START_NOT_STICKY的{​​{1}}:

Service

onStartCommand()照常启动,您可以通过以下方式退出前台模式:

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

    // Tapping the notification will open the specified Activity.
    Intent activityIntent = new Intent(this, MainActivity.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0,
            activityIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    // This always shows up in the notifications area when this Service is running.
    // TODO: String localization 
    Notification not = new Notification.Builder(this).
            setContentTitle(getText(R.string.app_name)).
            setContentInfo("Doing stuff in the background...").setSmallIcon(R.mipmap.ic_launcher).
            setContentIntent(pendingIntent).build();
    startForeground(1, not);

    // Other code goes here...

    return super.onStartCommand(intent, flags, startId);
}

布尔参数定义是否也应该关闭通知。

答案 1 :(得分:0)

您必须为此使用线程并在启动服务时设置标志。并检查该标志是否停止服务。