我正在开发一个包含计步器的 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);
}
}
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);