Android中的跨進程回調

來源:互聯網
上載者:User

[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();      }  }   

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.