首页 > 解决方案 > 无法调用 onHandleIntent 之外的方法或访问方法

问题描述

所以这让我很难过,当谷歌的 API Activity Recognition 检测到某些参数时,我只是试图启动我的服务。所以我已经扩展IntentService并实施了GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener

Logcat 确认该服务有效(具有令人惊讶的准确预测)如果有人感兴趣,这就是我激活该服务的方式:

    @Override
protected void onHandleIntent(@Nullable Intent intent) {

    if (ActivityRecognitionResult.hasResult(intent)){
        ActivityRecognitionResult recognitionResult = ActivityRecognitionResult.extractResult(intent);
        parseResults(recognitionResult.getProbableActivities());
        //My method to read the results from the list, logcat confirms it is working correctly

}

    @Override
public void onConnected(@Nullable Bundle bundle) {
    useActivityUpdates = true;
    Intent intent = new Intent(context, CA.class);
    PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    ActivityRecognition.ActivityRecognitionApi.requestActivityUpdates(googleApiClient, 100, pendingIntent);
    Log.i("CA", "Connected");
}

正如您在onHandleIntent我正在调用 parseResults 函数中看到的那样。

    public long elapsedTimeGoogleAPI;
private void parseResults( List<DetectedActivity> detectedActivities){
    PredictedActivity newActivity = new PredictedActivity();
    newActivity.bicycle = 0;
    newActivity.onFoot = 0;
    newActivity.unknown = 0;
    newActivity.vehicle = 0;
    newActivity.walking = 0;
    newActivity.running = 0;
    newActivity.still = 0;
    Log.i("CAActivityDetect", "NewActivity");

    newActivity.elapsedTime = System.currentTimeMillis() - elapsedTimeGoogleAPI;
    for (DetectedActivity dt : detectedActivities){
        switch (dt.getType()){
            case DetectedActivity.IN_VEHICLE:
                newActivity.vehicle = dt.getConfidence();
                Log.i("CAActivityDetect", "v: " + dt.getConfidence());

                break;
            case DetectedActivity.ON_BICYCLE:
                newActivity.bicycle = dt.getConfidence();
                Log.i("CAActivityDetect", "b: " + dt.getConfidence());

                break;
            case DetectedActivity.WALKING:
                newActivity.walking = dt.getConfidence();
                Log.i("CAActivityDetect", "w: " + dt.getConfidence());

                break;
            case DetectedActivity.ON_FOOT:
                newActivity.onFoot = dt.getConfidence();
                Log.i("CAActivityDetect", "of: " + dt.getConfidence());

                break;
            case DetectedActivity.RUNNING:
                newActivity.running = dt.getConfidence();
                Log.i("CAActivityDetect", "r: " + dt.getConfidence());

                break;
            case DetectedActivity.UNKNOWN:
                newActivity.unknown = dt.getConfidence();
                Log.i("CAActivityDetect", "u: " + dt.getConfidence());

                break;
            case DetectedActivity.STILL:
                newActivity.still = dt.getConfidence();
                Log.i("CAActivityDetect", "s: " + dt.getConfidence());

                break;
        }
    }
    if (predictedActivities == null){
        predictedActivities = new ArrayList<>();
        Log.i("CAActivityDetect", "predictedActivities == null New ArrayList");

    }
    predictedActivities.add(newActivity);
}

因此,在构建和激活 API 的类中的另一种方法中,我初始化了我的PredictedActivity列表,并在此处放置了一个日志以供参考……我还有另一个 Runnable 循环读取此列表中的最新项目。

这些是 logcat 结果:

130|shell@tilapia:/ $ logcat | grep "CAActivityDetect"
I/CAActivityDetect(19902): New ArrayList
I/CAActivityDetect(19902): Attempt connect
I/CAActivityDetect(19902): Connected
I/CAActivityDetect(19902): NewActivity
I/CAActivityDetect(19902): s: 100
I/CAActivityDetect(19902): predictedActivities == null New ArrayList
I/CAActivityDetect(19902): NewActivity
I/CAActivityDetect(19902): s: 100
I/CAActivityDetect(19902): predictedActivities == null New ArrayList
I/CAActivityDetect(19902): NewActivity
I/CAActivityDetect(19902): s: 100
I/CAActivityDetect(19902): predictedActivities == null New ArrayList
I/CAActivityDetect(19902): NewActivity
I/CAActivityDetect(19902): s: 100
I/CAActivityDetect(19902): predictedActivities == null New ArrayList

所以这让我相信,尽管所有这些代码都生活在一个类的同一个实例中,但不知何故, IntentService 无法以某种方式编辑该类使用的信息......parseResults仅由 IntentService 方法使用并且工作正常,但是当我尝试添加到主程序使用的列表时,它每次创建一个新的 ArrayList 就好像它无法访问它上次使用的相同变量或类的其余部分使用的一样。我感觉我要疯了哈哈!

标签: javaandroidandroid-intent

解决方案


推荐阅读