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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。