处理onActivityResult上服务(Handle onActivityResult on a

2019-08-03 06:49发布

所以我有一个简单的问题,它可能处理方法onActivityResult()的服务如果此活动是由相同的服务指南(使用意图)?

在我的情况,我要开始SpeechRegnition,说话,并获取有关服务的结果,一切都在后台(主要服务从开始一个Widget)

谢谢 。

Answer 1:

感谢您最近downvoting,不管是谁。 以前的答案,我在2012年还给一共有nonsesnse所以我决定写一个正确的一个。

你不能处理活动结果的服务,但你可以()从onActivityResult检索到的任何数据传递给服务。

如果您的服务已在运行,你可以调用startService()有一个新的intent处理事件,像这样

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


Answer 2:

最近,我在同样的问题绊倒,如何把onActivityResult()成果为活动相关的服务从上述服务启动。 我不想活动存放在考虑到活动泄漏静态变量是一种不好的做法。 所以我在实现一个合适的接口和实例化这个监听器作为服务类的私有成员的活动处理onActivityResult()添加静态侦听器。

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

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

正如你可以看到我不能避免由于设备旋转问题静态引用,但我认为这个方案是比较合适的; 尽管冗长。



Answer 3:

从服务公开,透明活动和服务中使用广播接收器。 按照详细的步骤。

从服务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 brOnActivityResult = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO:
    }
};

3.服务的onCreate注册这个广播

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

4.注销该广播的服务的onDestroy

mContext.unregisterReceiver(brOnActivityResult);

5.使用startActivityForResult不要在活动工作和活动的(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();
}


文章来源: Handle onActivityResult on a Service