即使在最近的抽屉中杀死应用程序后,也可以使用服务获取连续的位置

Posted

技术标签:

【中文标题】即使在最近的抽屉中杀死应用程序后,也可以使用服务获取连续的位置【英文标题】:Get continuous location using service even after app killed from recent drawer 【发布时间】:2018-02-09 05:26:12 【问题描述】:

我从主要活动开始服务,例如;-

Intent intent = new Intent(this, MyLocationService.class);
startService(intent);

MyLocationService 类看起来像:-

public class MyLocationService extends Service implements
        LocationListener,
        GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener 
    private static final String TAG = MyLocationService.class.getSimpleName();
    public static Location mCurrentLocation;
    LocationRequest mLocationRequest;
    GoogleApiClient mGoogleApiClient;
    @Override
    public void onCreate() 
        Log.e(TAG, "onCreate: ");
        initiateGooglePlayService();
    
    public void initiateGooglePlayService() 
        Log.e(TAG, "initiateGooglePlayService: ");
        if (isGooglePlayServicesAvailable()) 
            mLocationRequest = new LocationRequest();
            mLocationRequest.setInterval(5000);
            mLocationRequest.setFastestInterval(5000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
            mLocationRequest.setSmallestDisplacement(10.0f);
            mGoogleApiClient = new GoogleApiClient.Builder(this)
                    .addApi(LocationServices.API)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .build();
            mGoogleApiClient.connect();
        
    
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) 
        Log.e(TAG, "onStartCommand: ");
        return super.onStartCommand(intent, flags, startId);
    
    @Nullable
    @Override
    public IBinder onBind(Intent intent) 
        Log.e(TAG, "onBind: ");
        return null;
    
    private boolean isGooglePlayServicesAvailable() 
        Log.e(TAG, "isGooglePlayServicesAvailable: ");
        int status = GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(getApplicationContext());
        return ConnectionResult.SUCCESS == status;
    
    @Override
    public void onConnected(Bundle bundle) 
        Log.e(TAG, "onConnected: ");
        startLocationUpdates();
    
    @Override
    public void onConnectionSuspended(int i) 
        Log.e(TAG, "onConnectionSuspended: ");
    
    protected void startLocationUpdates() 
        Log.e(TAG, "startLocationUpdates: ");
        try 
            PendingResult<Status> pendingResult;
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) 

                return;
            
            pendingResult = LocationServices.FusedLocationApi.requestLocationUpdates(
                    mGoogleApiClient, mLocationRequest, this);
         catch (IllegalStateException ignored) 
        
    
    @Override
    public void onLocationChanged(Location location) 
        Log.e(TAG, "onLocationChanged: " + location.getLongitude());
        if (mGoogleApiClient.isConnected()) 
            mCurrentLocation = location;
            Intent intent = new Intent("GPSLocationUpdates");
            intent.putExtra("location", location);
         LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
            Toast.makeText(this, "location", Toast.LENGTH_LONG).show();
        
    
    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) 
        Log.e(TAG, "onConnectionFailed: ");
    

我从不在任何地方停止服务。

但我仍然无法控制 onLocationChange()

我的动机是,我需要连续定位来做一些后台操作。它有时在棒棒糖中起作用。但它在 Marshmallow 和 nougat 甚至 kitkat 中也不起作用。我搜索但无法得到正确的想法。请让我知道,我哪里出错了。接受任何建议。

我正在使用以下依赖项作为位置;-

 compile 'com.google.android.gms:play-services-location:9.6.1'

【问题讨论】:

我不能代表所有人,但如果我从最近关闭一个应用程序,我希望它关闭并停止运行其代码的所有 @NickA 你是对的,但我正在开发商业应用程序,所以需要在后台进行一些操作。 你是否将设备从一个地方移动到另一个地方,因为你已经给出了 10 英尺的距离。正如你在代码中提到的,你的设备必须移动超过 10 英尺 是的,跑 100 米,看看会发生什么 @KailasBhakade 尝试删除 `mLLocationRequest.setSmallestDisplacement(10.0f);` 行。 【参考方案1】:

您可以使用HyperTrack SDK 在后台获取位置更新。深入了解 SDKhere 在不同条件下的可靠性。

首先SetupSDK

设置 SDK 后,您只需设置回调即可接收位置更新。

HyperTrack.setCallback(new HyperTrackEventCallback() 
@Override
public void onEvent ( @NonNull final HyperTrackEvent event)
    switch (event.getEventType()) 
        case HyperTrackEvent.EventType.LOCATION_CHANGED_EVENT:
            Log.d(TAG, "onEvent: Location Changed");
            HyperTrackLocation hyperTrackLocation = event.getLocation();
            LatLng latLng = hyperTrackLocation.getLatLng();
            updateCurrentLocationMarker(event.getLocation());
            break;
    


(免责声明:我在 HyperTrack 工作。)

【讨论】:

由于 Oreo 对后台服务进行了限制,所以 SDK 需要保留一个粘性通知才能将服务作为前台运行。【参考方案2】:
/**Check out my Github post i did the same for Taxi clone**/

Link ---> https://github.com/yash786agg/GPS/

Note: Remember to remove or comment the below mentioned code if you want the latitude 
and latitude even when the application is in background.

    if(networkUtilObj != null)
    
        networkUtilObj.disconnectGoogleApiClient();
    

【讨论】:

它是否可以工作,即使应用程序也从最近被杀死。因为我正在寻找这个。如果应用程序在后台,那么我的代码可以工作。 是的,我会工作,但请记住不要调用“networkUtilObj.disconnectGoogleApiClient();”示例代码包含同一行的任何地方 @KailasBhakade 如果应用程序从最近的应用程序抽屉中被杀死,则无法执行您正在寻找的任何事情。直到您有一个可以通过从广播接收器启动应用程序来唤醒您的应用程序的用例。 @chandil03 好的,谢谢。

以上是关于即使在最近的抽屉中杀死应用程序后,也可以使用服务获取连续的位置的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 云消息服务 - 即使应用程序被杀死也能接收通知

即使我获得了 API 密钥,也无法使用谷歌地图

即使在应用程序被杀死后如何继续进行 iOS 位置跟踪?

即使应用程序从最近的应用程序中清除,也继续服务

即使在杀死并重新启动应用程序后,如何在本机 iOS 中下载音频文件?

在服务器上杀死 Excel.EXE [重复]