一般的Android业务开发中,Service的使用十分常见。稍微复杂点的业务逻辑,都需要Serivice在执行某些耗时操作后通知Activity。总结常见的三种方法。
分别是:(1)binder持有Activity的Handler对象,或者持有一个Activity的callbackInterface.
(2)AIDL实现,完美支持IPC。
(3)startService+broadcastReceiver实现。
另外还有几种不推荐的方式,都有很高的局限性。比如Service执行后的结果持久化,通过startActivity在目标Activity中的OnNewIntent()处理(需要Activity是单例的)。
(1)Binder持有Activity的Handler,这里推荐Handler弱引用Activity实现。
关键代码如下:
public class WeakReferenceHandlerActivity extends Activity {
private MyHandler mHandler;
public static int FLAG = 10;
public ProgressBar progressBar;
private Button bindButton;
private Button nextButton;
private UseHandlerService.MyBinder myBinder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.handler_layout);
progressBar = (ProgressBar)this.findViewById(R.id.progress);
bindButton = (Button)this.findViewById(R.id.bind);
nextButton = (Button)this.findViewById(R.id.next);
mHandler = new MyHandler(this);
bindButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
bindService();
Log.d("","startDownLoad() --> click");
}
});
nextButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(WeakReferenceHandlerActivity.this,AndroidAidlActivity.class));
}
});
}
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.d("","startDownLoad() --> onbind");
myBinder = (UseHandlerService.MyBinder) service;
myBinder.setCallBackHandler(mHandler);
myBinder.startDownLoad();
}
};
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onPause() {
unBindService();
super.onPause();
}
public void bindService(){
Intent bindIntent = new Intent(this, UseHandlerService.class);
bindService(bindIntent, connection, BIND_AUTO_CREATE);
}
public void unBindService(){
unbindService(connection);
}
@Override
protected void onDestroy() {
// Remove all Runnable and Message.
mHandler.removeCallbacksAndMessages(null);
super.onDestroy();
}
public MyHandler getHandler(){
return mHandler;
}
public class MyHandler extends Handler {
// WeakReference to the outer class's instance.
private WeakReference
mOuter;
public MyHandler(WeakReferenceHandlerActivity activity) {
mOuter = new WeakReference
(activity); } @Override public void handleMessage(Message msg) { WeakReferenceHandlerActivity outer = mOuter.get(); if (outer != null) { // Do something with outer as your wish. if(!outer.isFinishing()){ int progress = msg.what; progressBar.setProgress(progress); } } } } }
public class UseHandlerService extends Service{
/**
* 进度条的最大值
*/
public static final int MAX_PROGRESS = 100;
/**
* 进度条的进度值
*/
private int progress = 0;
/**
* 更新进度的回调接口
*/
private MyHandler myHandler;
private MyBinder mBinder = new MyBinder();
private String TAG = "UseHandlerService";
/**
* 注册回调接口的方法,供外部调用
* @param onProgressListener
*/
public void s