Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果服务正在运行,如何在晚上8点停止服务?_Java_Android_Service_Retrofit - Fatal编程技术网

Java 如果服务正在运行,如何在晚上8点停止服务?

Java 如果服务正在运行,如何在晚上8点停止服务?,java,android,service,retrofit,Java,Android,Service,Retrofit,我有一个服务,它可以捕获用户的位置,并使用改造更新数据库。我想在每天晚上8点自动停止服务,如果它正在运行,也更新数据库,用户在晚上8点打孔了 我希望服务手动启动,但如果不是手动停止,则希望服务自动停止 这是我的服务课 public class LiveLocationService extends Service { private static final String TAG = LiveLocationService.class.getSimpleName(); Retro

我有一个服务,它可以捕获用户的位置,并使用改造更新数据库。我想在每天晚上8点自动停止服务,如果它正在运行,也更新数据库,用户在晚上8点打孔了

我希望服务手动启动,但如果不是手动停止,则希望服务自动停止

这是我的服务课

public class LiveLocationService extends Service {
    private static final String TAG = LiveLocationService.class.getSimpleName();
    Retrofit retrofitClient;
    CompositeDisposable compositeDisposable = new CompositeDisposable();
    MyService myService;
    String empCode, year, month, date;
    FusedLocationProviderClient client;
    LocationCallback locationCallback;

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        retrofitClient = RetrofitClient.getInstance();
        myService = retrofitClient.create(MyService.class);

        empCode = intent.getStringExtra("empCode");
        year = intent.getStringExtra("year");
        month = intent.getStringExtra("month");
        date = intent.getStringExtra("date");
        return super.onStartCommand(intent, flags, startId);
    }

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

    @RequiresApi(api = Build.VERSION_CODES.O)
    @Override
    public void onCreate() {
        super.onCreate();
        if (isOnline()) {
            buildNotification();
            requestLocationUpdates();
        } else {
            Log.e("MSER", "Please connect to the internet.");
        }
    }

    private void buildNotification() {
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
            String NOTIFICATION_CHANNEL_ID = "com.deepankmehta.managementservices";
            String channelName = "My Background Service";
            NotificationChannel chan = null;
            chan = new NotificationChannel(NOTIFICATION_CHANNEL_ID, channelName, NotificationManager.IMPORTANCE_HIGH);
            chan.setLightColor(Color.BLUE);
            chan.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
            NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            assert manager != null;
            manager.createNotificationChannel(chan);

            PendingIntent intent = PendingIntent.getActivity(this, 0, new Intent(this, MainActivity.class), PendingIntent.FLAG_UPDATE_CURRENT);

            NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID);
            Notification notification = notificationBuilder.setOngoing(true)
                    .setSmallIcon(R.drawable.mser)
                    .setContentTitle("xxxx")
                    .setContentText("xxxx is tracking your location.")
                    .setPriority(NotificationManager.IMPORTANCE_HIGH)
                    .setCategory(Notification.CATEGORY_SERVICE)
                    .setContentIntent(intent)
                    .build();
            startForeground(2, notification);
        } else {
            PendingIntent broadcastIntent = PendingIntent.getActivity(
                    this, 0, new Intent(this, MainActivity.class), PendingIntent.FLAG_UPDATE_CURRENT);
            // Create the persistent notification
            NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
                    .setContentTitle(getString(R.string.app_name))
                    .setContentText("xxxx is tracking your location.")
                    .setOngoing(true)
                    .setContentIntent(broadcastIntent)
                    .setSmallIcon(R.drawable.mser);
            startForeground(1, builder.build());
        }

    }

    private void requestLocationUpdates() {
        if (isOnline()) {
            LocationRequest request = new LocationRequest();
            request.setInterval(10000);
            request.setFastestInterval(5000);
            request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
            client = LocationServices.getFusedLocationProviderClient(this);
            int permission = ContextCompat.checkSelfPermission(this,
                    Manifest.permission.ACCESS_FINE_LOCATION);
            if (permission == PackageManager.PERMISSION_GRANTED) {
                locationCallback = new LocationCallback() {
                    @Override
                    public void onLocationResult(LocationResult locationResult) {
                        Location location = locationResult.getLastLocation();
                        if (location != null) {
                            Log.d(TAG, "location update " + location);
                            double lat = location.getLatitude();
                            double lon = location.getLongitude();
                            final String time = new SimpleDateFormat("HH:mm", Locale.getDefault()).format(new Date());
                            compositeDisposable.add(myService.userLocation(empCode, year, month, date, time, lat, lon)
                                    .subscribeOn(Schedulers.io())
                                    .observeOn(AndroidSchedulers.mainThread())
                                    .subscribe(new Consumer< String >() {
                                        @Override
                                        public void accept(String s) throws Exception {
                                            Log.e("data", s);
                                            if (s.equals("\"done\"")) {
                                                Log.e("status", "location punched");
                                            }
                                        }
                                    }));
                        } else {
                            Log.d("MSER", "location update, no location found. ");
                        }
                    }
                };
                client.requestLocationUpdates(request, locationCallback, null);
            } else {
                Log.e("MSER", "Please enable location.");
            }
        } else {
            Log.e("MSER", "Please connect to the internet.");
        }
    }


    @Override
    public void onDestroy() {
        super.onDestroy();
        client.removeLocationUpdates(locationCallback);
        stopForeground(true);
        stopSelf();
    }

    protected boolean isOnline() {
        ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo netInfo = cm.getActiveNetworkInfo();
        if (netInfo != null && netInfo.isConnectedOrConnecting()) {
            return true;
        } else {
            return false;
        }
    }
}
您可以使用来安排此类任务, 在特定时间注册
alaramanger
,检查服务是否正在运行,如果正在运行,则停止服务

下面是在特定时间注册AlamManager的示例

AlarmManager alarmManager = (AlarmManager) getActivityContext()
                .getSystemService(Context.ALARM_SERVICE);

Intent intent = new Intent(getActivityContext(), AutoStopReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(getActivityContext(),
                0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,
                stopServieTime, pendingIntent);
这是接收器类

public class AutoStopReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
          //TODO Stop service from here
    }
在AndroidMenifest.xml中注册接收器

<receiver android:name=".AutoStopReceiver" />


感谢您的回复。由于我是android开发新手,请您帮助我并建议在何处编写此代码。我必须在创建方法的主页活动中编写alarmManager代码?您必须在启动服务之前编写alarmManager代码,如在receiver中的startTrackerService()方法和stopservice代码,有关更多信息,请阅读AlarmManager的工作原理
<receiver android:name=".AutoStopReceiver" />