服务中的Android位置更新

ttvkxqim  于 2023-05-27  发布在  Android
关注(0)|答案(2)|浏览(82)

我想做这样的事情:

  • 当我的应用程序启动时,我想启动一个服务,它应该检查我的位置
  • 当应用程序转到后台我想停止服务

我有两个主要问题:
1.如何检测我的应用程序是否进入后台?我哈弗几个活动,我尝试在我的MainActivity中覆盖onPause,但当我启动其他活动时也会调用onPause。
1.这个问题更重要:我的位置检查服务应该是什么样的?我尝试了几种方法,但没有成功。
我的服务看起来像这样,它不工作。我应该改变什么才能让它工作?

package com.pivoscore.service;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;

public class LocationService extends Service {

    private LocationListener locationListener;

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

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

    @Override
    public void onCreate() {
        super.onCreate();
        final LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
        this.locationListener = new MyLocationListener();
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 100, 0, this.locationListener);
    }

    private static class MyLocationListener implements LocationListener {

        @Override
        public void onLocationChanged(final Location location) {
        }

        @Override
        public void onProviderDisabled(final String provider) {
        }

        @Override
        public void onProviderEnabled(final String provider) {
        }

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

    }

}
oalqel3c

oalqel3c1#

1.应用程序不是Android中的可视组件。它分为活动,每个活动在可见时运行,否则暂停和销毁。因此,不存在整个应用程序进入后台的概念,活动根据其单独的可见性被暂停和恢复,并且在这件事上完全独立于其他活动。
1.您的服务应在位置管理器的onCreate()中注册,并在onDestroy()中取消注册。在onBind()中,它将返回一个Messenger对象。在onLocationChanged()中,它应该通过共享的Messenger发送消息。不需要使用START_STICKY,因为您不希望服务一直运行。

  1. Activity(可以是App中的任何Activity)只需调用其onStart()中的bindService(),服务将启动(如果尚未启动),Activity将从服务中获取Messenger。此外,Activity应该从其onStop()调用unbindService()。服务将在没有绑定任何内容时自动停止。
    1.如果你需要在应用程序(任务)级别执行第3点中的内容,实现Application类,并使用它的onCreate()onTerminate()。应用程序类不像活动那样暂停或停止。
j7dteeu8

j7dteeu82#

试试这个代码..通过使用此选项,您可以查看您的应用程序是在前台还是后台。希望这对你有帮助。

try {
    foreground = new ForegroundCheckTask().execute(ctx).get();
}

======================================

class ForegroundCheckTask extends AsyncTask<Context, Void, Boolean> {

@Override
protected Boolean doInBackground(Context... params) {
    final Context context = params[0].getApplicationContext();
    return isAppOnForeground(context);
}

private boolean isAppOnForeground(Context context) {
    ActivityManager activityManager = (ActivityManager) context
            .getSystemService(Context.ACTIVITY_SERVICE);
    List<RunningAppProcessInfo> appProcesses = activityManager
            .getRunningAppProcesses();
    if (appProcesses == null) {
        return false;
    }
    final String packageName = context.getPackageName();

    String activePackageName = activityManager.getRunningTasks(1).get(0).topActivity.getPackageName();
    if (activePackageName.equals(packageName)) {
        return true;
    }
    else{
        return false;
    }

}

}

相关问题