当前位置: 首页 > 知识库问答 >
问题:

当应用程序最小化时,如何保持服务运行

胡昊
2023-03-14

我正在开发一个追踪用户位置的应用程序。我已经实现了一个定制服务来管理位置请求部分,它在每个活动中都能正常工作。该服务甚至出现在“运行服务”设置面板中。

当我最小化应用程序或锁定屏幕时,问题就开始了。

我想要的效果是,即使应用程序被最小化或屏幕被锁定,也能继续接收位置更新,但当用户从最近的应用程序中滑动应用程序时,停止与应用程序相关的一切(确切地说,谷歌地图或Waze的行为方式-当应用程序显示通知时最小化-有可能直接从通知关闭应用程序)。

我已经尝试了很多建议的解决方案,唯一一个曾经接近的解决方案是启动前景服务(),但即使应用程序被取消,这也不会停止服务。

我正在谷歌Pixel(8.1)和5.0和8.0版本的模拟器上运行测试。

Min SDK版本:21。目标SDK版本:26。

到目前为止,这是我的代码

AndroidManifest。xml

<service android:name=".logic.service.LocationService"/>

主要活动。JAVA

if (checkNeedLocationPermission(this)) {
        startService(new Intent(getBaseContext(), LocationService.class));
    }

定位服务。JAVA

public class LocationService extends Service {

private FusedLocationProviderClient fusedLocationProviderClient;
private LocationRequest locationRequest;
private LocationCallback locationCallback;

@Override
public IBinder onBind(final Intent intent) {
    return null;
}

@Override
public int onStartCommand(final Intent intent, final int flags, final int startId) {
    startFusedLocationProviderClient();
    return START_STICKY;
}

@Override
public void onDestroy() {
}

/**
 * Configures and starts Google Api Client for location services.
 */
private void startFusedLocationProviderClient() {
    fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);

    getCurrentLocation();
}

/**
 * Gets the current location of the device.
 */
@SuppressLint("MissingPermission")
private void getCurrentLocation() {
    createLocationRequestAndCallback();

    fusedLocationProviderClient.requestLocationUpdates(locationRequest, locationCallback, null);
}

/**
 * Creates the location request with the specified settings.
 */
private void createLocationRequestAndCallback() {
    locationRequest = new LocationRequest();
    locationRequest.setInterval(LOCATION_REQUEST_INTERVAL);
    locationRequest.setFastestInterval(LOCATION_REQUEST_FASTEST_INTERVAL);
    locationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);

    locationCallback = new LocationCallback() {
        @Override
        public void onLocationResult(final LocationResult locationResult) {
            for (Location location : locationResult.getLocations()) {
                Log.d("lat", String.valueOf(location.getLatitude()));
            }
        }
    };
}

在上面的课程中,LocationService。java,Log。d(“lat”,String.valueOf(location.getLatitude()) 在应用程序最小化或屏幕锁定时停止记录。

任何帮助或建议都将不胜感激!


共有1个答案

盖和洽
2023-03-14

对于Android Oreo,你不能这么做,因为他们引入了后台服务限制。参考文件

但是对于低于26的API级别,您可以通过设置

 <service
            android:name=".YourLocationService"
            android:exported="false"
            android:process=":YourLocationService"
            android:stopWithTask="false" />

@Override
    public void onTaskRemoved(Intent rootIntent) {

        Intent restartService = new Intent(getApplicationContext(), this.getClass());
        PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(), 1, restartService, PendingIntent.FLAG_ONE_SHOT);
        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        alarmManager.set(AlarmManager.ELAPSED_REALTIME, 5000, pendingIntent);


    }
 类似资料:
  • 我想要在后台运行,即使应用程序被关闭。我的意思是长按Home键->查看所有正在运行的应用程序->把我的应用程序划到一边->应用程序被杀死或者长按Back键->应用程序被杀死 我的代码如下所示。在我的主要活动中: 在我的服务中: 我看到当app打开时服务正在运行。当我通过主页按钮最小化应用程序时,它还在运行。当我通过后退按钮关闭应用程序时,它还在运行。但如果我像上面提到的那样杀了它,它就会停下来。我

  • 当应用程序完全关闭时,Whatsapp如何保持与套接字的连接。 它要求APNS推送首先唤醒应用程序,然后重新建立连接。但是WhatsApp怎么样?似乎是Appstore的合规问题?但是AppStore允许许多应用程序在后台运行,但它是否允许Pubnub或有连接的应用程序在后台保持活力?

  • 问题内容: 我试图确保脚本仍在开发服务器上运行。它整理统计数据并提供Web服务,因此应该可以持续使用,但是一天几次,它会由于未知原因而死掉。当我们注意到我们只是再次启动它时,但是后部很痛苦,有些用户没有权限(或专有技术)来启动它。 我内的程序员想花几个小时来解决问题的根源,但内心的忙碌的人认为必须有一种简便的方法来检测应用程序是否未运行,然后重新启动它。 我知道我 可以 通过grep cron-s

  • 问题内容: 我正在使用redis在nodejs应用程序中提供会话支持。我已经安装了redis服务器,当我运行redis- server时,它可以工作,但是当我关闭终端redis时,它停止工作,并且不起作用。关闭终端后如何保持Redis服务器运行? 问题答案: 将Redis作为守护程序启动的最简单方法是编辑配置文件并更改以下行: 启动配置文件时,请确保在redis-server命令行上提供该配置文件

  • 问题内容: 首先,我在python脚本中编写了以下代码: 我将其保存在一个名为 然后在命令窗口中编写以下命令: 运行此命令后,出现以下错误: 我本来希望得到这个: 有人可以告诉我如何解决这个问题吗? 问题答案: 使用PowerShell时,我遇到了相同的问题,该修复程序对我有效: 而不是使用,请尝试

  • 问题内容: 我有一个用Go语言编写的运行时间较长的服务器。Main会触发执行程序逻辑的多个goroutine。在那之后主要没有什么用。一旦主程序退出,程序将退出。我现在使用的使程序运行的方法只是对fmt.Scanln()的简单调用。我想知道其他人如何阻止main退出。以下是一个基本示例。在这里可以使用哪些想法或最佳做法? 我考虑过创建一个通道并通过接收该通道来延迟main的退出,但是我认为如果我的