如何将IntentService的结果返回到Activity中?

gcl*_*cl1 41 android android-intent

我正在使用IntentService通过JSON处理与服务器的网络通信.JSON /服务器部分工作正常,但我无法将结果返回到需要的地方.以下代码显示了我如何从onClick()内部启动intent服务,然后让服务更新一个全局变量以将结果传递回主活动.

public class GXActivity extends Activity {

    private static final String TAG = "GXActivity";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // === called when the activity is first created

        Log.i(TAG, "GXActivity Created");

        super.onCreate(savedInstanceState);
        setContentView(R.layout.start);

        View.OnClickListener handler = new View.OnClickListener() {
            public void onClick(View v) {

                // === set up an application context to hold a global variable
                // === called user, to contain results from the intent service
                GXApp appState = ((GXApp) getApplicationContext());
                User user = new User(-1); // initialize user id to -1
                appState.setUser(user);

                // === next start an intent service to get JSON from the server;
                // === this service updates the user global variable with
                // === results from the JSON transaction
                Intent intent = new Intent(this, GXIntentService.class);
                startService(intent);

                // === check app context for results from intent service
                appState = ((GXApp) getApplicationContext());
                if (appState.getUser().getId() != -1)...

            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,在onCreate()完成之后,才会调用解析JSON的intent服务,因此我正在寻找结果的代码看不到未初始化的结果.

我应该做些什么,以便在检查结果之前调用intent服务?如果我将click侦听器从onCreate()函数中拉出来会有用吗?是否有另一个/更好的结构代码?非常感谢.

tom*_*nor 82

您应该在活动中创建自己的ResultReceiver子类.ResultReceiver实现Parcelable所以可以从你的传递Activity到你Service的额外的Intent.

你需要做这样的事情:

  1. ResultReceiver在您的活动类中实现一个子类.实施的关键方法是onReceiveResult().此方法为您提供Bundle结果数据,可用于传递您在其中检索的任何信息Service.只需解压缩您需要的数据并使用它来更新您的活动.

  2. 在您的活动中,创建自定义的新实例,ResultReceiver并将其添加到Intent您用于启动服务的实例中.

  3. 在你ServiceonStartCommand()方法中,检索ResultReceiver传入的Intent并将其存储在本地成员变量中.

  4. 一旦你Service完成其工作,有它调用send()的ResultReceiver传递要发送回活动的任何数据Bundle.

这是一个非常有效的模式,意味着您不会将数据存储在令人讨厌的静态变量中.

  • 当结果在`ResultReceiver'上调用`send()`时,当Activity不再存活时会发生什么? (3认同)
  • 我有类似的要求,并进入这个线程.关于活动被销毁和重新创建的问题是否有任何答案? (2认同)

DSo*_*ldo 11

有很多方法可以在后台获取结果(AsyncTask,将一个Activity绑定到一个服务......),但如果你想保留你的IntentService代码,你可以简单地:

1-在IntentService工作结束时发送广播意图(包含其扩展数据中的状态)

2-在Activity中实现一个使用Intent数据的LocalBroadcastReceiver

这也是官方文档中推荐的方法(如果你想保留你的IntentService):

https://developer.android.com/training/run-background-service/report-status.html


Yus*_*f X 7

如果你需要做的只是从服务器获取JSON而不锁定UI线程,那么使用AsyncTask可能更简单.

  • 异步任务生命周期绑定到它正在运行的线程,所以如果我旋转屏幕它将重新启动! (2认同)