我需要一个在后台运行的服务,并计算两个位置之间的每分钟距离。我使用Thread来每分钟执行一个方法,然后我明白当应用程序关闭时,服务也会停止,因为应用程序和服务使用相同的线程。 如何在后台创建一个每1分钟调用一次的简单方法,即使应用程序已关闭?
答案 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)
您必须为此使用线程并在启动服务时设置标志。并检查该标志是否停止服务。