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

2014-11-24 00:38:41 · 作者: · 浏览: 2
etHandler(MyHandler handler) { myHandler = handler; } /** * 增加get()方法,供Activity调用 * @return 下载进度 */ public int getProgress() { return progress; } @Override public void onCreate() { super.onCreate(); Log.d(TAG, "onCreate() executed"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d(TAG, "onStartCommand() executed"); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); Log.d(TAG, "onDestroy() executed"); } /** * 返回一个Binder对象 */ @Override public IBinder onBind(Intent intent) { return mBinder; } public class MyBinder extends Binder{ /** * 获取当前Service的实例 * @return */ public UseHandlerService getService(){ return UseHandlerService.this; } public void setCallBackHandler(MyHandler handler){ myHandler = handler; } public void startDownLoad(){ Log.d("","startDownLoad() inBinder-->"); new Thread(new Runnable() { public void run() { while(progress < MAX_PROGRESS){ progress += 5; Log.d("","startDownLoad() run-->"); //进度发生变化通知调用方 if(myHandler != null){ myHandler.sendEmptyMessage(progress); } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); } } } 弱引用的实现,是出于防止Service不销毁,一直导致目标Activity也不能会回收的考虑。



(2)AIDL实现,同样还是进度条的UI更新。

public class AndroidAidlActivity extends Activity {
    /** Called when the activity is first created. */
	public static final int MAX_PROGRESS = 100; 
	/**
	 * 进度条的进度值
	 */
	private int progress = 0;
	public ProgressBar progressBar;
	private Button bindButton;

	private MyAIDLService mService;
	
    @Override
    public 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);
		bindButton.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				bindService();
				Log.d("","startDownLoad() --> click");
			}
		});
		this.findViewById(R.id.next).setVisibility(View.GONE);
    }
    
    private ICallBack.Stub mCallback = new ICallBack.Stub() {
    	 
         @Override
         public void showResult(final int result) {
             Log.d("", "showresult -->" + result);
             progressBar.setProgress(result);
         }
    };
    
    private ServiceConnection connection = new ServiceConnection() {  
        @Override  
        public void onServiceDisconnected(ComponentName name) {  
        	mService = null;
        }  
        @Override  
        public void onServiceConnected(ComponentName name, IBinder service) { 
        	Log.d("","startDownLoad() --> onbind");
        	mService = MyAIDLService.Stub.asInterface(service);
        	try {
        	    mService.registerCallback(mCallback);
        	    mService.startDownload();
        	} catch (RemoteException e) {
        	    Log.e("", "", e);
        	}
            
        }  
    };  
	
    @Override
	protected void onResume() {
		super.onResume();
	}
    
    @Override
	protected void onPause() {
    	unBindService();
		super.onPause();
	}
    
    public void bindService(){
    	Intent bindIntent = new Intent(this, AidlService.class);  
        bindService(bindIntent, connection, BIND_AUTO_CREATE);  
    }
    
    public void unBindService(){
    	unbindService(connection);
    }
    
	@Override
	protected void onDestroy() {
		// Remove all Runnable and Message.
		super.onDestroy();
	}
	

}
public class AidlService extends Service {

	private RemoteCallbackList
  
    mCallbacks = new RemoteCallbackList
   
    (); MyAIDLService.Stub mBinder = new Stub() { @Override public void registerCallback(ICallBack cb) throws RemoteException {