我在使用intent.putExtra
从一个服务向另一个服务提供ResultReceiver
时遇到问题。在不使用putExtra
的情况下,我的意图处理程序会给我定期的结果,但是当它被包含在内时,除了它添加的值之外,它找不到任何东西。
没有putExtra
,mExtras->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}}中找到任何结果。
答案 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"/>
希望这有助于某人!