如何在Fragment
/Activity
和Service
之间进行通信有多种技术。
其中之一是使用ResultReceiver并将其发送到IntentServiceIntent
额外。
您创建自定义接收器ServiceResultReceiver
延伸ResultReceiver
。
public class ServiceResultReceiver extends ResultReceiver {
private Receiver mReceiver;
public ServiceResultReceiver(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);
}
}
}
使您的Fragment
实现ServiceResultReceiver.Receiver
接口。创建接收器 并将其初始化为Fragment
。您比传递接收机服务和服务只是从意图获得接收机,并呼吁receiver.send()
发送任何回到接收机。
public class MyFragment extends ListFragment implements ServiceResultReceiver.Receiver {
private ServiceResultReceiver mReceiver;
....
@Override
public void onCreate(Bundle savedInstanceState) {
...
mReceiver = new ServiceResultReceiver(new Handler());
mReceiver.setReceiver(this);
}
public void startMyService() {
final Intent intent = new Intent(getActivity(), MyService.class);
intent.putExtra("receiver", mReceiver);
getActivity().startService(intent);
}
@Override
public void onReceiveResult(int resultCode, Bundle resultData) {
// service finished
}
}
public class MyService extends IntentService {
...
@Override
protected void onHandleIntent(Intent intent) {
// download data and update database
....
final ResultReceiver receiver = intent.getParcelableExtra("receiver");
if (receiver != null) {
receiver.send(0, null);
}
}
}
非常感谢你们,我会在今天晚些时候看看你们的解决方案,但他们都看起来很有前途 – 2012-07-25 08:10:06
我还没有写,但似乎你的第二个不足以满足我的情况。但是'BrodcastReceiver'看起来正是我正在寻找的东西。非常感谢你! – 2012-07-25 17:40:59
LocalBroadcastManager对于这个特定的工作甚至更好:http://stackoverflow.com/questions/8802157/how-to-use-localbroadcastmanager。作品像一个魅力:) – 2012-07-25 18:37:21