Service和Activity通讯的3种常用方式示例(一)

2014-11-24 00:38:41 · 作者: · 浏览: 4

一般的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