Android IPC机制ACtivity绑定Service通信代码实例
Binder通信过程类似于TCP/IP服务连接过程binder四大架构Server(服务器),Client(客户端),ServiceManager(DNS)以及Binder驱动(路由器)
其中Server,Client,ServiceManager运行于用户空间,驱动运行于内核空间。这四个角色的关系和互联网类似:Server是服务器,Client是客户终端,SMgr是域名服务器(DNS),驱动是路由器。
book.java
packagecom.example.android_binder_testservice; importandroid.os.Parcel; importandroid.os.Parcelable; publicclassBookimplementsParcelable{ privateStringbookName; privateStringauthor; privateintpublishDate; publicBook(){ } publicBook(StringbookName,Stringauthor,intpublishDate){ super(); this.bookName=bookName; this.author=author; this.publishDate=publishDate; } publicStringgetBookName(){ returnbookName; } publicvoidsetBookName(StringbookName){ this.bookName=bookName; } publicStringgetAuthor(){ returnauthor; } publicvoidsetAuthor(Stringauthor){ this.author=author; } publicintgetPublishDate(){ returnpublishDate; } publicvoidsetPublishDate(intpublishDate){ this.publishDate=publishDate; } @Override publicintdescribeContents(){ return0; } @Override publicvoidwriteToParcel(Parcelout,intflags){ out.writeString(bookName); out.writeString(author); out.writeInt(publishDate); } publicstaticfinalParcelable.CreatorCREATOR=newCreator (){ @Override publicBook[]newArray(intsize){ returnnewBook[size]; } @Override publicBookcreateFromParcel(android.os.Parcelsource){ returnnewBook(source); } }; publicBook(Parcelin){ bookName=in.readString(); author=in.readString(); publishDate=in.readInt(); } }
上面是一个实现了parcelable的实体类,就是将book序列化,在putExtra到Service时会被写入内存加快程序速度
mainActivity.java
packagecom.example.android_binder_testservice; importandroid.os.Bundle; importandroid.util.Log; importandroid.app.Activity; importandroid.content.Intent; importandroid.view.Menu; importandroid.view.View; importandroid.widget.Button; publicclassMainActivityextendsActivity{ ButtonstartServiceButton;//启动服务按钮 ButtonshutDownServiceButton;//关闭服务按钮 ButtonstartBindServiceButton;//启动绑定服务按钮 @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getWidget(); regiestListener(); } publicvoidgetWidget(){ startServiceButton=(Button)findViewById(R.id.startService); startBindServiceButton=(Button)findViewById(R.id.bindService); shutDownServiceButton=(Button)findViewById(R.id.stopService); } publicvoidregiestListener(){ startServiceButton.setOnClickListener(startService); shutDownServiceButton.setOnClickListener(shutdownService); startBindServiceButton.setOnClickListener(startBinderService); } /**启动服务的事件监听*/ publicButton.OnClickListenerstartService=newButton.OnClickListener(){ publicvoidonClick(Viewview){ /**单击按钮时启动服务*/ Intentintent=newIntent(MainActivity.this, CountService.class); startService(intent); Log.v("MainStadyServics","startService"); } }; /**关闭服务*/ publicButton.OnClickListenershutdownService=newButton.OnClickListener(){ publicvoidonClick(Viewview){ /**单击按钮时启动服务*/ Intentintent=newIntent(MainActivity.this, CountService.class); /**退出Activity是,停止服务*/ stopService(intent); Log.v("MainStadyServics","shutDownserveice"); } }; /**打开绑定服务的Activity*/ publicButton.OnClickListenerstartBinderService=newButton.OnClickListener(){ publicvoidonClick(Viewview){ /**单击按钮时启动服务*/ Intentintent=newIntent(MainActivity.this,UseBrider.class); startActivity(intent); Log.v("MainStadyServics","startBinderService"); } }; }
mainActivity中当使用startService()启动Service时会调用Service的onStartCommand()
当使用bindService()则会调用onBind()方法,可能会觉了看的又看怎么没看到bindService()这个方法呢
重点在
Intentintent=newIntent(MainActivity.this,UseBrider.class);
startActivity(intent);
继续上代码
UseBrider.java
/**通过bindService和unBindSerivce的方式启动和结束服务*/ publicclassUseBriderextendsFragmentActivity{ /**参数设置*/ CountServicecountService; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(newUseBriderFace(this)); Intentintent=newIntent(UseBrider.this,CountService.class); intent.putExtra("book",newBook("name","an",1999)); /**进入Activity开始服务 *conn */ bindService(intent,conn,Context.BIND_AUTO_CREATE); } privateServiceConnectionconn=newServiceConnection(){ /* *这个方法会获取到CountService的onBind方法中返回的Binder对象 *然后就可以对服务进行某种操作了 */ publicvoidonServiceConnected(ComponentNamename,IBinderservice){ //TODOAuto-generatedmethodstub countService=((CountService.ServiceBinder)service).getService(); countService.callBack(); } /**无法获取到服务对象时的操作*/ publicvoidonServiceDisconnected(ComponentNamename){ //TODOAuto-generatedmethodstub countService=null; } }; protectedvoidonDestroy(){ super.onDestroy(); this.unbindService(conn); Log.v("MainStadyServics","out"); } }
UseBriderFace.java
publicclassUseBriderFaceextendsView{ /**创建参数*/ publicUseBriderFace(Contextcontext){ super(context); } publicvoidonDraw(Canvascanvas){ canvas.drawColor(Color.WHITE);//画白色背景 /**绘制文字*/ PainttextPaint=newPaint(); textPaint.setColor(Color.RED); textPaint.setTextSize(30); canvas.drawText("使用绑定服务",10,30,textPaint); textPaint.setColor(Color.GREEN); textPaint.setTextSize(18); canvas.drawText("使用绑定服务后,这个Activity关闭后",20,60,textPaint); canvas.drawText("绑定的服务也会关闭",5,80,textPaint); } }
UseBriderFace.java类其实就是用java定义的布局可以用xml文件代替
countService.java
packagecom.example.android_binder_testservice; /**引入包*/ importandroid.app.Service;//服务的类 importandroid.os.IBinder; importandroid.os.Parcel; importandroid.os.RemoteException; importandroid.os.Binder; importandroid.content.Intent; importandroid.util.Log; /**计数的服务*/ publicclassCountServiceextendsService{ privateStringTAG=CountService.class.getSimpleName(); /**创建参数*/ booleanthreadDisable; intcount; Bookbook; /* *当通过bindService()启动CountService时会调用这个方法并返回一个ServiceBinder对象 *这个Binder对象封装着一个CountService实例, *客户端就可以通过ServiceBinder对服务端进行一些操作 */ publicIBinderonBind(Intentintent){ Log.i(TAG,"onBind"); book=intent.getParcelableExtra("book"); returnnewServiceBinder(); } @Override publicintonStartCommand(Intentintent,intflags,intstartId){ Log.i(TAG,"onStartCommand"); returnsuper.onStartCommand(intent,flags,startId); } @Override publicbooleanonUnbind(Intentintent){ Log.i(TAG,"onUnbind"); returnsuper.onUnbind(intent); } @Override publicvoidonRebind(Intentintent){ Log.i(TAG,"onRebind"); super.onRebind(intent); } publicvoidonCreate(){ super.onCreate(); /**创建一个线程,每秒计数器加一,并在控制台进行Log输出*/ newThread(newRunnable(){ publicvoidrun(){ while(!threadDisable){ try{ Thread.sleep(1000); }catch(InterruptedExceptione){ } count++; Log.v("CountService","Countis"+count); } } }).start(); Log.i(TAG,"onCreate"); } publicvoidonDestroy(){ super.onDestroy(); /**服务停止时,终止计数进程*/ this.threadDisable=true; Log.i(TAG,"onDestroy"); } publicintgetConunt(){ returncount; } publicvoidcallBack(){ Log.i(TAG,"hello,iamamethodofCountService"); } classServiceBinderextendsBinder{ publicCountServicegetService(){ returnCountService.this; } } }
代码解释有了,想不出来了
源码下载地址:http://git.oschina.net/zwh_9527/Binder
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。