Моя цель состоит в том, чтобы прослушать действия пользователя и при изменении сделать что-то в фоновом режиме, например, записать событие в базу данных.Когда приложение находится на переднем плане, события запускаются правильно.Когда приложение закрыто (но мой сервис работает), событие не запускается.Как я мог получить эти события?
Общая справочная служба:
public class AppService extends Service {
ActivitySensor activitySensor;
@Override
public void onCreate() {
super.onCreate();
}
public int onStartCommand(Intent intent, int flags, int startId) {
activitySensor = new ActivitySensor(getApplicationContext());
activitySensor.start();
return START_STICKY;
}
@Override
public void onDestroy() {
Log.d("Service", "onDestroy");
activitySensor.stop();
super.onDestroy();
}
ActivitySensor:
public class ActivitySensor {
private static final long DETECTION_INTERVAL_IN_MILLISECONDS = 3000;
private ActivityRecognitionClient mActivityRecognitionClient;
private Intent mIntentService;
private PendingIntent mPendingIntent;
private Context context;
public ActivitySensor(Context _context){
this.context = _context;
mIntentService = new Intent(context, DetectedActivitiesIntentService.class);
mPendingIntent = PendingIntent.getService(context, 1, mIntentService, PendingIntent.FLAG_UPDATE_CURRENT);
mActivityRecognitionClient = new ActivityRecognitionClient(context);
}
public void start(){
Task<Void> task = mActivityRecognitionClient.requestActivityUpdates(
DETECTION_INTERVAL_IN_MILLISECONDS,
mPendingIntent);
task.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void result) {
Toast.makeText(context,
"Successfully requested activity updates",
Toast.LENGTH_SHORT)
.show();
}
});
task.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(context,
"Requesting activity updates failed to start",
Toast.LENGTH_SHORT)
.show();
}
});
}
public void stop() {
Task<Void> task = mActivityRecognitionClient.removeActivityUpdates(
mPendingIntent);
task.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void result) {
Toast.makeText(context,
"Removed activity updates successfully!",
Toast.LENGTH_SHORT)
.show();
}
});
task.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(context, "Failed to remove activity updates!",
Toast.LENGTH_SHORT).show();
}
});
}
}
DetectedActivitiesIntentService:
public class DetectedActivitiesIntentService extends IntentService {
protected static final String TAG = DetectedActivitiesIntentService.class.getSimpleName();
String[] valueNames = {"activity", "confidence"} ;
AppDatabase db;
public DetectedActivitiesIntentService() {
// Use the TAG to name the worker thread.
super(TAG);
}
@Override
public void onCreate() {
super.onCreate();
this.db = ((BaseApp)getApplication()).getDatabase();
}
@Override
protected void onHandleIntent(Intent intent) {
//never fired
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(DetectedActivitiesIntentService.this.getApplicationContext(), "Activity detected: "+ actS + " "+ values[1], Toast.LENGTH_SHORT).show();
}
});
}
}