[java] 在Android應用程式開發中,可能會遇到跨進程回調問題,比如,調用一個服務,但服務是非同步,服務完成後,需要給客戶一個通知,這時就需要用到跨進程回調了。跨進程回調本質上用到了Binder機制,其過程如下:1.定義aidlITest.aidl[plain] package com.example.chirpdemo; import com.example.chirpdemo.ITestListener; interface ITest { int getValue(); void setValue(int value); void listen(ITestListener listener); } ITestListener.aidl[plain] www.2cto.compackage com.example.chirpdemo; interface ITestListener { void onFinished(int result); } 2.Service定義如下:[java] package com.example.chirpdemo; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.os.RemoteException; import android.util.Log; public class MyService extends Service { final private static String TAG = "MyService"; public class ServiceImpl extends ITest.Stub { private int mValue; private ITestListener mListener; public ServiceImpl() { mValue = 0; } @Override public int getValue() throws RemoteException { return mValue; } @Override public void setValue(int value) throws RemoteException { mValue = value; if (null != mListener) { mListener.onFinished(-1); } } @Override public void listen(ITestListener listener) throws RemoteException { mListener = listener; } } @Override public void onCreate() { Log.d(TAG, "onCreate"); super.onCreate(); } @Override public void onDestroy() { Log.d(TAG, "onDestroy"); super.onDestroy(); } @Override public void onStart(Intent intent, int startId) { Log.d(TAG, "onStart"); super.onStart(intent, startId); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d(TAG, "onStartCommand"); return super.onStartCommand(intent, flags, startId); } @Override public boolean onUnbind(Intent intent) { Log.d(TAG, "onUnbind"); return super.onUnbind(intent); } @Override public void onRebind(Intent intent) { Log.d(TAG, "onRebind"); super.onRebind(intent); } @Override public IBinder onBind(Intent arg0) { return new ServiceImpl(); } } 3.Client定義如下:[java] package com.example.easytabdemo; import android.app.Activity; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.graphics.PixelFormat; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import com.example.chirpdemo.ITest; import com.example.chirpdemo.ITestListener; import com.example.easytabdemo.SlideTabHost.TabSpec; public class MainActivity extends Activity { final private static String TAG = "MainActivity"; final Intent myIntent = new Intent("com.pyk.les.IlongExistService"); private boolean startedService = false; private ITest leservice = null; ServiceConnection myServiceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { leservice = ITest.Stub.asInterface(service); try { leservice.listen(new ITestListener.Stub() { @Override public void onFinished(int result) throws RemoteException { } }); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void onServiceDisconnected(ComponentName name) { leservice = null; Log.i("aaaaaaaaaaaa", "onDisconnected:" + Thread.currentThread()); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); startedService = bindService(new Intent("com.my.IService"), myServiceConnection, BIND_AUTO_CREATE); Log.i("aaaaaaaaaaaa", "bindService:" + Thread.currentThread()); Button bt = (Button)this.findViewById(R.id.bt1); bt.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { if ( startedService ) { if ( null != leservice ) { try { leservice.setValue(leservice.getValue() + 1); } catch (RemoteException e) { e.printStackTrace(); } } } } }); view.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { if ( startedService ) { if ( null != leservice ) { try { mEditText.setText(leservice.getValue() + ""); } catch (RemoteException e) { e.printStackTrace(); } } } } }); } @Override public void onStart() { super.onStart(); Log.i("aaaaaaaa", "onStart"); } @Override public void onPause() { super.onPause(); Log.i("aaaaaaaa", "onPause"); } @Override public void onResume() { super.onResume(); Log.i("aaaaaaaa", "onResume"); } www.2cto.com @Override public void onStop() { super.onStop(); Log.i("aaaaaaaa", "onStop"); } @Override protected void onDestroy() { if (startedService) { unbindService(myServiceConnection); } Log.i(TAG, "onDestroy"); super.onDestroy(); } }