putExtra覆盖extractResult的值

时间:2013-05-24 01:58:33

标签: java android android-intent

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

没有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时,它无法在{{1}}中找到任何结果。

2 个答案:

答案 0 :(得分:0)

我也一直在努力。我相信它是因为传递给requestActivityUpdates()的pendingIntent设置了FLAG_UPDATE_CURRENT(从我的理解中覆盖了intent中的额外内容 - 在这种情况下返回你传递的内容)。

我通过将DetectedActivity(因为它实现了parcelable)传递回startService Intent中的调用服务并在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;
}

希望这有帮助,或者其他人可以选择替代方案。

答案 1 :(得分: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"/>

希望这有助于某人!