首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当应用程序移到后台时,位置更新服务无法工作

当应用程序移到后台时,位置更新服务无法工作
EN

Stack Overflow用户
提问于 2021-08-20 17:46:29
回答 1查看 44关注 0票数 0

我使用下面的应用程序代码每秒从GPS接收位置更新,并将输出打印到日志中。这对我来说很好,只要应用程序在前台,但是当它被移到后台时更新就会停止,直到它被带回前台。

我在清单上有这些权限

代码语言:javascript
运行
复制
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.android.hardware.location.gps"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />

这是服务类

代码语言:javascript
运行
复制
public class GoogleService extends Service implements LocationListener {

boolean isGPSEnable = false;
boolean isNetworkEnable = false;
double latitude, longitude;
LocationManager locationManager;
Location location;
private Handler mHandler = new Handler();
private Timer mTimer = null;
long notify_interval = 1000;
public static String str_receiver = "servicetutorial.service.receiver";
Intent intent;


public GoogleService() {

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

@Override
public void onCreate() {
    super.onCreate();

    mTimer = new Timer();
    mTimer.schedule(new TimerTaskToGetLocation(), 5, notify_interval);
    intent = new Intent(str_receiver);
    fn_getlocation();
}

@Override
public void onLocationChanged(Location location) {

}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {

}

@Override
public void onProviderEnabled(String provider) {

}

@Override
public void onProviderDisabled(String provider) {

}

private void fn_getlocation() {
    locationManager = (LocationManager) getApplicationContext().getSystemService(LOCATION_SERVICE);
    isGPSEnable = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    isNetworkEnable = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

    if (!isGPSEnable && !isNetworkEnable) {

    } else {

        if (isNetworkEnable) {
            location = null;
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                // TODO: Consider calling
                //    ActivityCompat#requestPermissions
                // here to request the missing permissions, and then overriding
                //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                //                                          int[] grantResults)
                // to handle the case where the user grants the permission. See the documentation
                // for ActivityCompat#requestPermissions for more details.
                return;
            }
            locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 0, this);
            if (locationManager != null) {
                location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                if (location != null) {

                    Log.e("latitude", location.getLatitude() + "");
                    Log.e("longitude", location.getLongitude() + "");

                    latitude = location.getLatitude();
                    longitude = location.getLongitude();
                    fn_update(location);
                }
            }

        }


        if (isGPSEnable) {
            location = null;
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                // TODO: Consider calling
                //    ActivityCompat#requestPermissions
                // here to request the missing permissions, and then overriding
                //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                //                                          int[] grantResults)
                // to handle the case where the user grants the permission. See the documentation
                // for ActivityCompat#requestPermissions for more details.
                return;
            }
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, this);
            if (locationManager != null) {
                location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                if (location != null) {
                    Log.e("latitude", location.getLatitude() + "");
                    Log.e("longitude", location.getLongitude() + "");
                    latitude = location.getLatitude();
                    longitude = location.getLongitude();
                    fn_update(location);
                }
            }
        }


    }

}

private class TimerTaskToGetLocation extends TimerTask {
    @Override
    public void run() {

        mHandler.post(new Runnable() {
            @Override
            public void run() {
                fn_getlocation();
            }
        });

    }
}

private void fn_update(Location location) {

    intent.putExtra("latitude", location.getLatitude() + "");
    intent.putExtra("longitude", location.getLongitude() + "");
    sendBroadcast(intent);
 }
}

TimerTaskToGetLocation works correctly.This在前台为Logcat。

代码语言:javascript
运行
复制
 2021-08-21 02:29:42.400 8904-8904/com.websarva.wings.android.notification4 E/get_longitude:135.22084902
 2021-08-21 02:29:43.416 8904-8904/com.websarva.wings.android.notification4 E/get_latitude:34.8317199
 2021-08-21 02:29:43.416 8904-8904/com.websarva.wings.android.notification4 E/get_longitude:135.2209639
 2021-08-21 02:29:43.431 8904-8904/com.websarva.wings.android.notification4 E/get_latitude:34.83170759
 2021-08-21 02:29:43.431 8904-8904/com.websarva.wings.android.notification4 E/get_longitude:135.22084902

这是后台的Logcat。

代码语言:javascript
运行
复制
2021-08-21 02:30:28.748 8904-8904/com.websarva.wings.android.notification4 E/get_latitude:34.83170759
2021-08-21 02:30:28.749 8904-8904/com.websarva.wings.android.notification4 E/get_longitude:135.22084902
2021-08-21 02:30:28.766 8904-8904/com.websarva.wings.android.notification4 E/get_latitude:34.83170759
2021-08-21 02:30:28.766 8904-8904/com.websarva.wings.android.notification4 E/get_longitude:135.22084902

为此还需要做些什么?

EN

回答 1

Stack Overflow用户

发布于 2021-08-20 19:58:46

考虑将服务作为前台启动,并显示此类服务的通知或使用WorkManager。谷歌的官方推荐如下:

“如果你的应用程序以应用程序接口级别26或更高级别为目标,则当应用程序本身不在前台时,系统会对运行后台服务施加限制。例如,在大多数情况下,你不应从后台访问位置信息。而应使用WorkManager计划任务。”https://developer.android.com/guide/components/services

你可以在像https://androidwave.com/foreground-service-android-example/这样的页面上找到例子,我已经检查过这种方法,它适用于你的情况。

关于WorkManager,您也可以使用https://developer.android.com/topic/libraries/architecture/workmanager

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68866236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档