处理服务上的onActivityResult

use*_*514 10 service android speech

所以我有一个简单的问题,如果此活动是从同一服务启动(使用Intent),则可以在服务中处理方法onActivityResult()?

在我的案例中,我想开始SpeechRegnition,说话,并获得服务上的结果,背景上的一切(主要服务从小工具开始),

谢谢 .

Yar*_*lyk 8

感谢最近的一次贬低,无论是谁.我在2012年给出的上一个答案是完全无意义的,所以我决定写一个合适的答案.

您无法处理服务中的活动结果,但您可以将从onActivityResult()检索到的任何数据传递给服务.

如果您的服务已在运行,您可以使用处理事件的新Intent调用startService(),如下所示

@Override
public void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == CODE && resultCode == RESULT_OK) {
        notifyService(data);
    }
}

private void notifyService(final Intent data) {
    final Intent intent = new Intent(this, MyService.class);
    intent.setAction(MyService.ACTION_HANDLE_DATA);
    intent.putExtra(MyService.EXTRA_DATA, data);
    startService(intent);
}
Run Code Online (Sandbox Code Playgroud)

并处理服务中的操作.如果它已经运行,它将不会重新启动,否则将启动它

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    if (intent != null) {
        final String action = intent.getAction();
        if (action != null) {
            switch (action) {
                case ACTION_HANDLE_DATA:
                    handleData(intent.getParcelableExtra(EXTRA_DATA));
                    // Implement your handleData method. Remember not to confuse Intents, or even better make your own Parcelable
                    break;
            }
        }
    }
    return START_NOT_STICKY;
}
Run Code Online (Sandbox Code Playgroud)

  • 对活动进行静态引用是非常糟糕的做法.这意味着您的上下文正在泄漏,并且android不会gc设置静态引用的最后一个活动.您应该使用IntentService并使用本地广播管理器发布结果(您的活动将听取并接听).还要考虑使用EventBus类型机制.如果你要做的答案是建议的(我不同意),至少记得在onPause()或onDestroy()中将静态引用设置为null. (3认同)