如何让stepCounter在后台工作

问题描述 投票:0回答:1

我正在开发一个包含计步器的 Android 应用程序。目前,步数计数器功能仅在应用程序位于前台时才处于活动状态,但我想将其更改为在后台工作,并且应用时它不会显示在屏幕上

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

        // Restaurare previewsTotalSteps din SharedPreferences
        SharedPreferences prefs = requireContext().getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
        previewsTotalSteps = prefs.getInt("previewsTotalSteps", 0);

        if (stepSensor == null) {
            Toast.makeText(getContext(), "No sensor detected on your device", Toast.LENGTH_SHORT).show();
        } else {
            sensorManager.registerListener(this, stepSensor, sensorManager.SENSOR_DELAY_FASTEST);
        }


    }
    @Override
    public void onSensorChanged(SensorEvent event) {
        if (event.sensor.getType() == Sensor.TYPE_STEP_COUNTER) {
            totalSteps = (int) event.values[0];
            currentSteps = totalSteps - previewsTotalSteps;

            // Obțineți ora și minutul curent
            Calendar calendar = Calendar.getInstance();
            int currentMinute = calendar.get(Calendar.MINUTE);

            // Verificăm dacă s-a schimbat minutul față de ultimul înregistrat în baza de date Firebase
            if (currentMinute != lastMinute) {
                // Creăm un nou nod pentru noul minut și setăm numărul de pași la 0
                DatabaseReference stepCountRef = FirebaseDatabase.getInstance().getReference("StepCount").child(user.getUid()).child(String.valueOf(currentMinute));
                stepCountRef.child("steps").setValue(0); // Resetăm numărul total de pași la zero pentru noul minut
                previewsTotalSteps=totalSteps;
                lastMinute = currentMinute; // Actualizăm ultimul minut înregistrat
            }

            // Actualizăm numărul total de pași pentru minutul curent în baza de date Firebase
            DatabaseReference stepCountRef = FirebaseDatabase.getInstance().getReference("StepCount").child(user.getUid()).child(String.valueOf(currentMinute));
            stepCountRef.child("steps").setValue(currentSteps);
            steps.setText(String.valueOf(currentSteps));
            progressBarSteps.setProgress(currentSteps);
        }
    }

java android mobile
1个回答
0
投票
package com.healthfuel.myhealthfuel;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.IBinder;

import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;

import java.util.Calendar;

public class StepCounterService extends Service implements SensorEventListener {
    FirebaseAuth auth;
    FirebaseUser user;
    private SensorManager sensorManager;
    private Sensor stepSensor;
    private int totalSteps;
    private int currentSteps ;
    private int previewsTotalSteps;
    private int lastMinute = -1;


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

            // sensorManager.unregisterListener(this);

            // Salvare previewsTotalSteps în SharedPreferences
            SharedPreferences.Editor editor = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE).edit();
            editor.putInt("previewsTotalSteps", previewsTotalSteps);
            editor.apply();


        auth = FirebaseAuth.getInstance();
        user = auth.getCurrentUser();

        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        stepSensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);
        if (stepSensor == null) {
            stopSelf(); // Stop the service if no step sensor is available
        }

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // Register sensor listener
        sensorManager.registerListener(this, stepSensor, SensorManager.SENSOR_DELAY_NORMAL);
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        // Unregister sensor listener
        sensorManager.unregisterListener(this);
    }

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

    @Override
    public void onSensorChanged(SensorEvent event) {
        if (event.sensor.getType() == Sensor.TYPE_STEP_COUNTER) {
            totalSteps = (int) event.values[0];
            currentSteps = totalSteps - previewsTotalSteps;

            // Obțineți ora și minutul curent
            Calendar calendar = Calendar.getInstance();
            int currentMinute = calendar.get(Calendar.MINUTE);

            // Verificăm dacă s-a schimbat minutul față de ultimul înregistrat în baza de date Firebase
            if (currentMinute != lastMinute) {
                // Creăm un nou nod pentru noul minut și setăm numărul de pași la 0
                DatabaseReference stepCountRef = FirebaseDatabase.getInstance().getReference("StepCount").child(user.getUid()).child(String.valueOf(currentMinute));
                stepCountRef.child("steps").setValue(0); // Resetăm numărul total de pași la zero pentru noul minut
                previewsTotalSteps=totalSteps;
                lastMinute = currentMinute; // Actualizăm ultimul minut înregistrat
            }

            // Actualizăm numărul total de pași pentru minutul curent în baza de date Firebase
            DatabaseReference stepCountRef = FirebaseDatabase.getInstance().getReference("StepCount").child(user.getUid()).child(String.valueOf(currentMinute));
            stepCountRef.child("steps").setValue(currentSteps);


            //steps.setText(String.valueOf(currentSteps));
            //progressBarSteps.setProgress(currentSteps);
        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        // Handle accuracy change if needed
    }
}

所以我创建了一个服务,它在 MainActivity 中启动和销毁,但它似乎不会在后台运行。我也不知道如何编辑服务中的文本,因为这个服务不有一个 UI....关于如何在后台运行的服务修改 HomeFragment 功能有什么建议吗?

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

        Intent serviceIntent = new Intent(requireContext(), StepCounterService.class);
        requireContext().startService(serviceIntent);
        // Restaurare previewsTotalSteps din SharedPreferences
        SharedPreferences prefs = requireContext().getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
        previewsTotalSteps = prefs.getInt("previewsTotalSteps", 0);

        if (stepSensor == null) {
            Toast.makeText(getContext(), "No sensor detected on your device", Toast.LENGTH_SHORT).show();
        } else {
            sensorManager.registerListener(this, stepSensor, sensorManager.SENSOR_DELAY_FASTEST);
        }


    }


    @Override
    public void onPause() {
        super.onPause();
       // sensorManager.unregisterListener(this);

        // Salvare previewsTotalSteps în SharedPreferences
        SharedPreferences.Editor editor = requireContext().getSharedPreferences("MyPrefs", Context.MODE_PRIVATE).edit();
        editor.putInt("previewsTotalSteps", previewsTotalSteps);
        editor.apply();
    }


    @Override
    public void onDestroy() {
        super.onDestroy();
        sensorManager.unregisterListener(this);

    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        if (event.sensor.getType() == Sensor.TYPE_STEP_COUNTER) {
            totalSteps = (int) event.values[0];
            currentSteps = totalSteps - previewsTotalSteps;

            // Obțineți ora și minutul curent
            Calendar calendar = Calendar.getInstance();
            int currentMinute = calendar.get(Calendar.MINUTE);

            // Verificăm dacă s-a schimbat minutul față de ultimul înregistrat în baza de date Firebase
            if (currentMinute != lastMinute) {
                // Creăm un nou nod pentru noul minut și setăm numărul de pași la 0
                DatabaseReference stepCountRef = FirebaseDatabase.getInstance().getReference("StepCount").child(user.getUid()).child(String.valueOf(currentMinute));
                stepCountRef.child("steps").setValue(0); // Resetăm numărul total de pași la zero pentru noul minut
                previewsTotalSteps=totalSteps;
                lastMinute = currentMinute; // Actualizăm ultimul minut înregistrat
            }

            // Actualizăm numărul total de pași pentru minutul curent în baza de date Firebase
            DatabaseReference stepCountRef = FirebaseDatabase.getInstance().getReference("StepCount").child(user.getUid()).child(String.valueOf(currentMinute));
            stepCountRef.child("steps").setValue(currentSteps);
            steps.setText(String.valueOf(currentSteps));
            progressBarSteps.setProgress(currentSteps);
        }
    }


    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view =  inflater.inflate(R.layout.fragment_home, container, false);

        addWorkoutButton = view.findViewById(R.id.addWorkout);
        recyclerView = view.findViewById(R.id.workoutRecyclerView);
        textviewCalories = view.findViewById(R.id.textViewCalories); //pt nr de calorii
        progressBarSteps = view.findViewById(R.id.progressBarSteps);
        steps = view.findViewById(R.id.textViewSteps);

        auth = FirebaseAuth.getInstance();
        user = auth.getCurrentUser();



        sensorManager = (SensorManager) requireContext().getSystemService(Context.SENSOR_SERVICE);
        stepSensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);


        linearLayoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false);
        adapter = new WorkoutAdapter(getContext(), workoutTitles, workoutDays, workoutDurations, workoutCalories);
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(linearLayoutManager);
© www.soinside.com 2019 - 2024. All rights reserved.