处理服务上的onActivityResult

时间:2012-11-28 15:10:16

标签: android service speech

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

在我的情况下,我想开始SpeechRegnition,发言,并获得服务上的结果,背景上的一切(主要服务从小工具开始),

谢谢。

4 个答案:

答案 0 :(得分:7)

感谢最近的一次贬低,无论是谁。我在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);
}

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

@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;
}

答案 1 :(得分:1)

我最近偶然发现了同样的问题,如何将onActivityResult()结果连接到从上述服务开始的Activity的服务。鉴于Activity泄漏是一种不好的做法,我不想将Activity存储在静态变量中。所以我在Activity处理onActivityResult()中添加了一个静态监听器,它实现了一个适当的接口,并将这个监听器实例化为Service类的私有成员。

简化形式的代码如下所示:

public class MyActivity extends FragmentActivity {

    public Interface ResultListener {
       onPositiveResult();
       onNegativeResult();
    }

    private static ResultListener mResultListener;

    public static setListener(ResultListener resultListener) {
        mResultListener = resultListener;
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == Activity.RESULT_OK && mResultListener != null) {
            mResultListener.onPositiveResult(); 
        } else if (resultCode == Activity.RESULT_CANCELED && mResultListener != null) {
            mResultListener.onNegativeResult(); 
        }
        mResultListener = null;
    }
}

public class MyService {

    private MyActivity.ResultListener mListener = new MyActivity.ResultListener() {
        onPositiveResult() { 
            // do something on RESULT_OK
       }
       onNegativeResult() {
            // do something on RESULT_CANCELED 
       }
    }

    private void startActivityForResultFromHere() {
        MyActivity.setListener(mListener);
        Intent intent = new Intent();
        intent.setClass(this, MyActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
    } 
}

正如您所看到的,由于设备轮换问题,我无法避免静态引用,但我认为此解决方案更合适;虽然详细。

答案 2 :(得分:1)

从服务中打开透明活动并在服务中使用BroadcastReceiver。请按照详细步骤进行操作。

1。 从服务

打开透明活动
Intent i = new Intent(mContext, FloatingServiceSupportActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.putExtra("action", "SpeechRegnition");
mContext.startActivity(i);

//对于透明活动,请在AndroidManifest.xml中使用此代码

<activity
android:name=".FloatingServiceSupportActivity"
android:theme="@style/Theme.Transparent" />

2。 在服务中创建BroadcastReceiver

BroadcastReceiver brOnActivityResult = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO:
    }
};

3。 在onCreate of Service中注册此广播

IntentFilter brintent = new IntentFilter();
brintent.addAction("brActionFloatingServiceOnActivityResult");
mContext.registerReceiver(brOnActivityResult, brintent);

4。 在onDestroy of Service中取消注册此广播

mContext.unregisterReceiver(brOnActivityResult);

5。 使用startActivityForResult在Activity中工作并从Activity的(FloatingServiceSupportActivity)onActivityResult发送广播

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

Intent i = new Intent();
i.setAction("brActionFloatingServiceOnActivityResult");
i.putExtra("action", "initTextToSpeech");
mActivity.sendBroadcast(i);

mActivity.finish();
}

答案 3 :(得分:0)

OnActivityForResult范围内没有Service这样的内容。

您可以阅读Android开发人员指南here