0

I am having an issue getting my ActivityRecognition Service to remain running. I currently have a service (GService) that runs continuously in the background. I want to start the ActivityRecognition service within GService, and have the ActivityRecognition service broadcast the activity result back to GService. I am able to start the service and receive feedback that it is running, and I also get one result from the intent handler (no actual data), but never again.

Here is the section of code from my continuous service setting up the intent, pending intent:

@Override
public void onConnected(Bundle bundle) {
    Log.d(TAG, "onConnected - isConnected ...............: " + mGoogleApiClient.isConnected());
    startLocationUpdates();
    //start process to receive activity updates
    Intent intent = new Intent(this, DetectedActivitiesIntentService.class);
    PendingIntent mActivityRecognitionPendingIntent = PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    ActivityRecognition.ActivityRecognitionApi.requestActivityUpdates(mGoogleApiClient, ActivityConstants.DETECTION_INTERVAL_MILLISECONDS_MOVING,
            mActivityRecognitionPendingIntent).setResultCallback(this);
    startService(intent);   // this should start the DetectedActivitiesIntentService

This is the Broadcast receiver within GService:

public class ActivityDetectionBroadcastReceiver extends BroadcastReceiver {
    protected static final String TAG_AR = "ADRR";

    @Override
    public void onReceive(Context context, Intent intent){
        //ArrayList<DetectedActivity> updatedActivities =
            //  intent.getParcelableArrayListExtra(ActivityConstants.ACTIVITY_EXTRA);
        //updateDetectedActivitiesList(updatedActivities);
        String action = intent.getAction();
        if(action.equals("com.gt.useractivity"))
        {
            Log.d(TAG_AR, "received broadcast from Activity service");
            // below line should grab the resulting string activity from the intent and log it.
            Log.d(TAG_AR, "activity is : " + intent.getExtras().getString(ActivityConstants.ACTIVITY_EXTRA));
        }
    }
}

Here is the ActivityRecognition Service code:

public class DetectedActivitiesIntentService extends IntentService {
protected static final String TAG = "ADIS";

/**
 * This constructor is required, and calls the super IntentService(String)
 * constructor with the name for a worker thread.
 */
public DetectedActivitiesIntentService() {
    // Use the TAG to name the worker thread.
    super(TAG);
    Log.d(TAG, "Activity service started....");
}

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

/**
 * Handles incoming intents.
 * @param intent The Intent is provided (inside a PendingIntent) when requestActivityUpdates()
 *               is called.
 */
@Override
protected void onHandleIntent(Intent intent) {
    if(ActivityRecognitionResult.hasResult(intent))
    {
        ActivityRecognitionResult result = ActivityRecognitionResult.extractResult(intent);
        Intent localIntent = new Intent(ActivityConstants.BROADCAST_ACTION);
        // Get the list of the probable activities associated with the current state of the
        // device. Each activity is associated with a confidence level, which is an int between
        // 0 and 100.

        ArrayList<DetectedActivity> detectedActivities = (ArrayList) result.getProbableActivities();

        // Log each activity.
        Log.i(TAG, "activities detected");
        for (DetectedActivity da: detectedActivities) {
            Log.i(TAG, ActivityConstants.getActivityString(da.getType()) + " " + da.getConfidence() + "%");
        }

        String activity = result.getMostProbableActivity().toString();  // get the activity and convert to string

        // Broadcast the list of detected activities.
        //localIntent.putExtra(ActivityConstants.ACTIVITY_EXTRA, detectedActivities);
        //localIntent.setAction("com.gt.useractivity");
        localIntent.putExtra(ActivityConstants.ACTIVITY_EXTRA, activity);   // set the activity string to be transmitted
        LocalBroadcastManager.getInstance(this).sendBroadcast(localIntent);
    }
    else{
        Log.d(TAG, "Intent had no activity data....");
    }
}

}

This Activity recognition sample is based from the Google Github sample.

All the examples I have found when using the PendingIntent is being called from a main activity, not from a service. I'm obviously doing something incorrect, but I can't figure it out. Any advice would be appreciated. I should also note that I have 2 broadcast receivers within my GService. I don't know if this would cause an issue or not.

markus506
  • 1
  • 2

1 Answers1

0

It looks like I have solved the problem. I have a second intent within my GService used for broadcasting. From what I can tell from this thread (Pending intent works correctly for first notification but not for the rest) if there are multiple intents being used, they have to be unique. Thus, I added one line of code when declaring my intent intent.setAction(Long.toString(System.currentTimeMillis())); which is enough to differentiate it from the other intent to the system. Once I did that, I began to receive the Activity broadcasts from the intent service, as well as still receiving the location requests from within the GService routine.

Community
  • 1
  • 1
markus506
  • 1
  • 2