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.
你需要做这样的事情:
ResultReceiver在您的活动类中实现一个子类.实施的关键方法是onReceiveResult().此方法为您提供Bundle结果数据,可用于传递您在其中检索的任何信息Service.只需解压缩您需要的数据并使用它来更新您的活动.
在您的活动中,创建自定义的新实例,ResultReceiver并将其添加到Intent您用于启动服务的实例中.
在你Service的onStartCommand()方法中,检索ResultReceiver传入的Intent并将其存储在本地成员变量中.
一旦你Service完成其工作,有它调用send()的ResultReceiver传递要发送回活动的任何数据Bundle.
这是一个非常有效的模式,意味着您不会将数据存储在令人讨厌的静态变量中.
DSo*_*ldo 11
有很多方法可以在后台获取结果(AsyncTask,将一个Activity绑定到一个服务......),但如果你想保留你的IntentService代码,你可以简单地:
1-在IntentService工作结束时发送广播意图(包含其扩展数据中的状态)
2-在Activity中实现一个使用Intent数据的LocalBroadcastReceiver
这也是官方文档中推荐的方法(如果你想保留你的IntentService):
https://developer.android.com/training/run-background-service/report-status.html
| 归档时间: |
|
| 查看次数: |
33941 次 |
| 最近记录: |