Распознавание активности пользователей Android в фоновом режиме - PullRequest
0 голосов
/ 23 ноября 2018

Моя цель состоит в том, чтобы прослушать действия пользователя и при изменении сделать что-то в фоновом режиме, например, записать событие в базу данных.Когда приложение находится на переднем плане, события запускаются правильно.Когда приложение закрыто (но мой сервис работает), событие не запускается.Как я мог получить эти события?

Общая справочная служба:

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();
                }


        });
    }
    }

1 Ответ

0 голосов
/ 09 декабря 2018

стандартные фоновые сервисы больше не поддерживаются в Android Oreo из-за ограничений фонового исполнения.Вы можете прочитать больше об этом здесь: Документы для Android

Я рекомендую взглянуть на JobintentService , который можно использовать вместо стандартного сервиса, и, возможно, он подойдетчтобы вы использовали явный широковещательный приемник для вызова этого JobIntentService.

...