具有位置更新的 Android 前台服务在 onHandle 完成后就会被终止



我想显示持久性通知我的位置牵引服务,但是一旦onHandleIndent完成,该服务就会被终止,有一个计时器任务可以定期获取位置,

我的问题是,如果 onStartCommand 不返回START_STICKY,它工作正常。 但在这种情况下,通知没有出现。

我希望我的服务通过持久性通知永久运行。

这是我的班级

public class TrackLocation extends IntentService {
    public static final String START_TRACKING = "START_TRACKING";
    public static final String STOP_TRACKING = "STOP_TRACKING";
    private static final long MINIMUM_DISTANCE_CHANGE_FOR_UPDATES = 1; 
    private static final long MINIMUM_TIME_BETWEEN_UPDATES = 10000;
    double totalDistance = 0;
    Location locationFirstOld;
    protected LocationManager locationManager;
    static double n = 0;
    Long s1, r1;
    double plat, plon, clat, clon, dis;
    Thread t1;
    EditText e1;
    boolean bool = true;
    private String booking_id;
    private FusedLocationProviderClient mFusedLocationClient;
    public static boolean  isTrackingEnabled;
    /**
     * Creates an IntentService.  Invoked by your subclass's constructor.
     *
     */
    public TrackLocation() {
        super("Distance tracking service");
    }

    @Override
    protected void onHandleIntent(@Nullable Intent intent) {
        String action = intent.getAction();
        if (action.equals(START_TRACKING)) {
            isTrackingEnabled = true;
             booking_id = intent.getStringExtra("booking_id");
            startTracking();
        } else {
            isTrackingEnabled = false;
        }
    }
    @Override
    public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
        super.onStartCommand(intent, startId, startId);
        return START_STICKY;
    }

    private void startTracking() {
        final Timer timer = new Timer();
        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                if (isTrackingEnabled) {
                    Log.d("tracking", "run: " + new Date().toString());
                    getLocation();
                } else {
                    timer.cancel();
                }
            }
        };
        timer.schedule(timerTask,0,5000);
        Intent notificationIntent = new Intent(this, PickaupActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 1,
                notificationIntent, 0);
        Notification notification = new Notification.Builder(this)
                .setContentTitle("On going trip")
                .setContentText("Active trips")
                .setSmallIcon(R.drawable.ic_notification_auto_request)
                .setContentIntent(pendingIntent)
                .setTicker("Trip started")
                .build();
        startForeground(1337, notification);
    }
    private void getLocation() {
        mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
        mFusedLocationClient.getLastLocation().addOnSuccessListener( new OnSuccessListener<Location>() {
            @Override
            public void onSuccess(Location location) {
                if (location != null) {
                    Log.d("", "onSuccess: " + location.getLatitude());
                    submitData(location);
                }
            }
        });
    }
    private void submitData(Location location) {
        if (locationFirstOld == null) {
            locationFirstOld = location;
            return;
        }
//        sendMyLocation(location);
//        double distance = getDistance(locationFirstOld.getLatitude(), locationFirstOld.getLongitude(), location.getLatitude(), location.getLongitude());
        double distance = locationFirstOld.distanceTo(location);
        Log.d("distance", "submitData: " + String.valueOf(distance));
        locationFirstOld = location;
        sendMessageToActivity(totalDistance);
        totalDistance += distance;

    }

    public double getDistance(double lat1, double lon1, double lat2, double lon2) {
        double latA = Math.toRadians(lat1);
        double lonA = Math.toRadians(lon1);
        double latB = Math.toRadians(lat2);
        double lonB = Math.toRadians(lon2);
        double cosAng = (Math.cos(latA) * Math.cos(latB) * Math.cos(lonB-lonA)) +
                (Math.sin(latA) * Math.sin(latB));
        double ang = Math.acos(cosAng);
        double dist = ang *6371;
        return dist;
    }
    private  void sendMessageToActivity(double distance) {
        Intent intent = new Intent("DISTANCE_UPDATE");
        // You can also include some extra data.
        intent.putExtra("distance", distance);
        LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
    }
    private void sendMyLocation(Location location) {
        Intent intent = new Intent();
        intent.putExtra("lat", location.getLatitude());
        intent.putExtra("lat", location.getLongitude());
        LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
    }
    }

IntentService 在完成它所做的任何事情时停止。

请改用服务,在系统、用户或应用停止服务类型之前,服务类型不会停止

一旦 onHandleIndent 完成,该服务就会被终止

这是IntentService的标准行为 — 如果没有更多排队的命令,IntentService调用onHandleIntent()返回时stopSelf()

请勿在此方案中使用 IntentService。使用自己的线程模型创建自己的服务,在不再需要该服务时调用stopSelf()

最新更新