1

我在使用从一项服务提供到另一项服务时遇到intent.putExtra问题ResultReceiver。不使用putExtra我的意图处理程序会给我定期的结果,但是当它被包含时,除了它添加的值之外它找不到任何东西。

没有3 个条目中putExtramExtras->mMap->table[0]com.google.android.location.internal.EXTRA_RELEASE_VERSION和 [2] com.google.android.location.internal.EXTRA_ACTIVITY_RESULT。当我putExtra在我的代码中包含 时,我的唯一条目mExtras->mMap->table是 [2] 的RESULT_RECEIVER.

IntentService 处理程序

protected void onHandleIntent(Intent intent) {         
  if (ActivityRecognitionResult.hasResult(intent)) {
    ActivityRecognitionResult result = ActivityRecognitionResult.extractResult(intent);
    DetectedActivity activity = result.getMostProbableActivity();
    ResultReceiver receiver = intent.getParcelableExtra(ActivityRecognitionService.RESULT_RECEIVER);             
    Bundle bundle = new Bundle();
    bundle.putParcelable("activity", activity);
    receiver.send(CODE, bundle);*/
  }  
}

ActivityRecognitionService.ACTIVITY = activity;是我目前获取数据的方式。这是 Android 开发人员页面上提到的数据传输的可能性之一,但我觉得使用ResultReceiver或其他回调系统更简洁。

拥有意图的类,ActivityRecognitionService

(这也恰好是一个绑定到一个活动的服务,供参考)

请注意,创建和连接activityClient是在onCreate()

static final String RESULT_RECEIVER = "com.example.myApp.RESULT_RECEIVER";  

void onConnected(Bundle connectionHint) {
  Intent intent = new Intent(ActivityRecognitionService.this, ActivityRecognitionIntentService.class);
  intent.putExtra(ActivityRecognitionService.RESULT_RECEIVER, resultReceiver);
  PendingIntent callbackIntent = PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
  activityClient.requestActivityUpdates(DETECTION_INTERVAL, callbackIntent);
}

我没有收到任何错误,只是在包含hasResult(intent)时找不到任何结果putExtra

4

2 回答 2

0

我也一直在为此苦苦挣扎。我相信这是因为传递给 requestActivityUpdates() 的 pendingIntent 设置了 FLAG_UPDATE_CURRENT (据我了解,它会覆盖意图中的额外内容——在这种情况下,它会返回你传递的内容)。

我通过在 startService Intent 中将 DetectedActivity(因为它实现 parcelable)传递回我的调用服务并在 onStartCommand 中处理它来解决这个问题。

ActivityRecognition IntentService:

@Override
protected void onHandleIntent(Intent intent) {
        if (ActivityRecognitionResult.hasResult(intent)) {

         ActivityRecognitionResult result = ActivityRecognitionResult.extractResult(intent);

         DetectedActivity detected = result.getMostProbableActivity();

         Intent intent= new Intent(this, CallingService.class);
         intent.putExtra(CallingService.EXTRA_ACTIVITY, detected);

         startService(intent);
     }
}

呼叫服务:

public int onStartCommand(Intent intent, int flags, int startId) {  

    if(intent.hasExtra(CallingService.EXTRA_ACTIVITY)){

        DetectedActivity result = intent.getParcelableExtra(CallingService.EXTRA_ACTIVITY);
            // REST OF PROCESSING
    }

    return START_STICKY;
}

希望这会有所帮助,或者其他人可以提供替代方案。

于 2013-05-29T15:49:36.133 回答
0

我也被困在这个问题上,但最终找到了合适的解决方案。

最后,我从 ActivityRecognitionService 中创建了一个新的 BroadcastIntent,并在我的清单中注册了一个 BroadcastReceiver。

    if (ActivityRecognitionResult.hasResult(intent)) 
    {
        ActivityRecognitionResult result = ActivityRecognitionResult.extractResult(intent);
        String myActivity = getFriendlyName(result.getMostProbableActivity().getType());

        if(Globals.SHOW_LOG)
        {
            Log.d(TAG, "ActivityRecognitionResult: " + myActivity);
            Log.d(TAG, result.toString());
        }
        // YOUR CODE GOES HERE!
        // Store the current activity in SharedPreferences or whatever

        // Broadcast the event to the receiver
        Intent broadcastIntent = new Intent(this, ReceiverActivityRecognition.class);
        broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT);
        broadcastIntent.putExtra(Globals.ARG_RECEIVER_EXTRA, myActivity);
        sendBroadcast(broadcastIntent);
    }

在清单中,您需要注册 BroadcastReceiver:

    <receiver android:name=".ReceiverActivityRecognition"/>

希望这对某人有帮助!

于 2013-10-09T04:31:33.513 回答