如果您的服务将成为您应用程序的一部分,那么您将使其变得比需要的复杂得多。由于您有一个从 RESTful Web 服务获取数据的简单用例,因此您应该研究 ResultReceiver 和 IntentService。
当您想要执行某些操作时,此 Service + ResultReceiver 模式通过使用 startService() 启动或绑定到服务来工作。您可以指定要执行的操作,并通过 Intent 中的 extras 传入您的 ResultReceiver(活动)。
在服务中,您实现 onHandleIntent 以执行 Intent 中指定的操作。操作完成后,您使用传入的 ResultReceiver 将消息发送回 Activity,此时将调用 onReceiveResult。
例如,您想从 Web 服务中提取一些数据。
-您创建意图并调用 startService。
- 服务中的操作开始,它向活动发送一条消息,说明它已开始
-活动处理消息并显示进度。
-服务完成操作并将一些数据发送回您的活动。
-您的活动处理数据并放入列表视图
-该服务会向您发送一条消息,说它已完成,它会杀死自己。
-活动收到完成消息并隐藏进度对话框。
例如:
活动:
public class HomeActivity extends Activity implements MyResultReceiver.Receiver {
public MyResultReceiver mReceiver;
public void onCreate(Bundle savedInstanceState) {
mReceiver = new MyResultReceiver(new Handler());
mReceiver.setReceiver(this);
...
final Intent intent = new Intent(Intent.ACTION_SYNC, null, this, QueryService.class);
intent.putExtra("receiver", mReceiver);
intent.putExtra("command", "query");
startService(intent);
}
public void onPause() {
mReceiver.setReceiver(null); // clear receiver so no leaks.
}
public void onReceiveResult(int resultCode, Bundle resultData) {
switch (resultCode) {
case RUNNING:
//show progress
break;
case FINISHED:
List results = resultData.getParcelableList("results");
// do something interesting
// hide progress
break;
case ERROR:
// handle the error;
break;
}
}
服务:
public class QueryService extends IntentService {
protected void onHandleIntent(Intent intent) {
final ResultReceiver receiver = intent.getParcelableExtra("receiver");
String command = intent.getStringExtra("command");
Bundle b = new Bundle();
if(command.equals("query") {
receiver.send(STATUS_RUNNING, Bundle.EMPTY);
try {
// get some data or something
b.putParcelableArrayList("results", results);
receiver.send(STATUS_FINISHED, b)
} catch(Exception e) {
b.putString(Intent.EXTRA_TEXT, e.toString());
receiver.send(STATUS_ERROR, b);
}
}
this.stopSelf();
}
}
结果接收者:
public MyResultReceiver extends ResultReceiver {
private Receiver mReceiver;
public MyResultReceiver(Handler handler) {
super(handler);
}
public void setReceiver(Receiver receiver) {
mReceiver = receiver;
}
public interface Receiver {
public void onReceiveResult(int resultCode, Bundle resultData);
}
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
if (mReceiver != null) {
mReceiver.onReceiveResult(resultCode, resultData);
}
}
}