当前位置: 首页 > 知识库问答 >
问题:

从另一个活动服务中启动ActivityRecognitionService

柳鸿信
2023-03-14

我在使ActivityRecognitation服务保持运行时遇到问题。我目前有一个在后台连续运行的服务(GService)。我希望在GService中启动ActivityRecognitation服务,并让ActivityRecognitation服务将活动结果广播回GService。我能够启动服务并接收它正在运行的反馈,我还从意图处理程序获得一个结果(没有实际数据),但再也不会得到了。

以下是我的持续服务中设置意图、待定意图的代码部分:

@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
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));
        }
    }
}
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....");
    }
}

此活动识别示例基于Google Github示例。

我在使用PendingIntent时发现的所有html" target="_blank">示例都是从主活动调用的,而不是从服务调用的。我显然在做不正确的事情,但我想不通。如有任何建议,不胜感激。我还应该注意,我的GService中有两个广播接收器。我不知道这是否会引起问题。

共有1个答案

司徒志强
2023-03-14

看来我已经解决了问题。我在用于广播的GService中还有第二个意图。从这个线程中我可以看出(Pending intent对第一个通知是正确的,但对其余的通知则不是),如果有多个intent被使用,它们必须是唯一的。因此,我在声明我的意图intent.setaction(long.tostring(system.currenttimemillis()))时添加了一行代码;,这足以将它与系统的其他意图区分开来。一旦我这样做了,我就开始接收来自intent服务的活动广播,并且仍然接收来自GService例程的位置请求。

 类似资料:
  • 问题内容: 我遇到的问题是MainActivity中的onCreate()方法似乎无法启动另一个活动。 我的代码在工作,因此当我单击按钮时,“ AboutActivity”将启动。但是,我要这样做,以便MainActivity中的onCreate()完成后立即启动“ AboutActivity”。 尝试从onCreate()启动“ AboutActivity”时运行该程序时,该程序陷入了空白屏幕。

  • 我试图通过按cardview开始另一项活动,cardview有一个朋友查找id。但是当我写回家时。java它给了我setOnClickListener中的问题。在homeActivity中,它告诉我无法解析“homeActivity”中的方法“homeActivity”。因为

  • 在我的程序中,我有一个当应用程序打开时启动的活动。如果我再打开几个活动,我怎么能回到主活动?在意图过滤器中,活动的名称是“android.intent.action.MAIN”,它不允许我在上面调用start Active()。我该怎么办?

  • 我有一个活动,可以在收藏夹列表中添加书签。每个宠儿都有一个按钮。当我点击那个按钮时,我必须进入那个特定的活动。但它显示了一个错误。应用程序不会崩溃,但书签活动不会从单击开始。 以下是“收藏夹”活动的代码: 错误是onClick方法,具体如下: 它给我一个ClassNotFoundExc0019。 似乎有了这段代码,我就可以启动这个包中的活动了。但问题是,我想开始的活动在另一个包中。logcat说它

  • 问题内容: 从Activity中包含的RecyclerView的适配器中,我试图在按下RecyclerView的元素时启动一个片段,这是我现在的代码: 我测试了它是否启动了我创建的一些“测试活动”,所以我知道除了片段启动之外的所有功能都可以正常工作。 错误在这里: 我正在启动作为活动的Fragment,所以当我运行应用程序时,它崩溃了,并告诉我在清单中将MainFragment声明为活动。 如何从

  • 在SO上也有类似的问题,但没有一个对我有效。 我想在Activity1中获取被点击的图像并在Activity2中显示它。 我获取被点击图像的图像id如下所示: 并通过意图传递给另一个活动。 任何帮助都很感激。