Android中的跨进程回调
16lz
2021-01-26
在Android应用程序开发中,可能会遇到跨进程回调问题,比如,调用一个服务,但服务是异步的,服务完成后,需要给客户一个通知,这时就需要用到跨进程回调了。跨进程回调本质上用到了Binder机制,其过程如下:
3.Client定义如下:
在以上代码中ITestListener为跨进程回调接口 作者:jcgu 发表于2013-3-1 16:30:52 原文链接 阅读:48 评论:0 查看评论
1.定义aidl
ITest.aidl
package com.example.chirpdemo;import com.example.chirpdemo.ITestListener;interface ITest {int getValue();void setValue(int value);void listen(ITestListener listener);}
ITestListener.aidl
package com.example.chirpdemo;interface ITestListener {void onFinished(int result);}
2.Service定义如下:
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定义如下:
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"); } @Override public void onStop() { super.onStop(); Log.i("aaaaaaaa", "onStop"); } @Override protected void onDestroy() { if (startedService) { unbindService(myServiceConnection); } Log.i(TAG, "onDestroy"); super.onDestroy(); }}
在以上代码中ITestListener为跨进程回调接口 作者:jcgu 发表于2013-3-1 16:30:52 原文链接 阅读:48 评论:0 查看评论
更多相关文章
- [ZZ][Android]使用bindService启动服务
- 【转】android progressbar 自定义样式
- Android自定义弹窗效果
- android 解析json数据(一)
- android studio 导入自定义编码格式
- Android(安卓)Service相关
- Android使用HttpURLConnection请求网络资源
- Gradle中的常量
- Android跨进程通信之ContentProvider