电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Android IPC機(jī)制ACtivity綁定Service通信代碼實(shí)例

瀏覽:26日期:2022-09-22 11:53:02

Binder通信過(guò)程類似于TCP/IP服務(wù)連接過(guò)程binder四大架構(gòu)Server(服務(wù)器),Client(客戶端),ServiceManager(DNS)以及Binder驅(qū)動(dòng)(路由器)

其中Server,Client,ServiceManager運(yùn)行于用戶空間,驅(qū)動(dòng)運(yùn)行于內(nèi)核空間。這四個(gè)角色的關(guān)系和互聯(lián)網(wǎng)類似:Server是服務(wù)器,Client是客戶終端,SMgr是域名服務(wù)器(DNS),驅(qū)動(dòng)是路由器。

book.java

package com.example.android_binder_testservice;import android.os.Parcel;import android.os.Parcelable;public class Book implements Parcelable { private String bookName; private String author; private int publishDate; public Book() { } public Book(String bookName, String author, int publishDate) { super(); this.bookName = bookName; this.author = author; this.publishDate = publishDate; } public String getBookName() { return bookName; } public void setBookName(String bookName) { this.bookName = bookName; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public int getPublishDate() { return publishDate; } public void setPublishDate(int publishDate) { this.publishDate = publishDate; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel out, int flags) { out.writeString(bookName); out.writeString(author); out.writeInt(publishDate); }public static final Parcelable.Creator<Book> CREATOR = new Creator<Book>() { @Override public Book[] newArray(int size) { return new Book[size]; } @Override public Book createFromParcel(android.os.Parcel source) { return new Book(source); } }; public Book(Parcel in) { bookName = in.readString(); author = in.readString(); publishDate = in.readInt(); }}

上面是一個(gè) 實(shí)現(xiàn)了parcelable的實(shí)體類,就是將book序列化,在putExtra到Service時(shí)會(huì)被寫入內(nèi)存加快程序速度

mainActivity.java

package com.example.android_binder_testservice;import android.os.Bundle;import android.util.Log;import android.app.Activity;import android.content.Intent;import android.view.Menu;import android.view.View;import android.widget.Button;public class MainActivity extends Activity { Button startServiceButton;// 啟動(dòng)服務(wù)按鈕 Button shutDownServiceButton;// 關(guān)閉服務(wù)按鈕 Button startBindServiceButton;// 啟動(dòng)綁定服務(wù)按鈕 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getWidget(); regiestListener(); } public void getWidget(){ startServiceButton = (Button) findViewById(R.id.startService); startBindServiceButton = (Button) findViewById(R.id.bindService); shutDownServiceButton = (Button) findViewById(R.id.stopService); } public void regiestListener() { startServiceButton.setOnClickListener(startService); shutDownServiceButton.setOnClickListener(shutdownService); startBindServiceButton.setOnClickListener(startBinderService); } /** 啟動(dòng)服務(wù)的事件監(jiān)聽(tīng) */ public Button.OnClickListener startService = new Button.OnClickListener() { public void onClick(View view) { /** 單擊按鈕時(shí)啟動(dòng)服務(wù) */ Intent intent = new Intent(MainActivity.this, CountService.class); startService(intent); Log.v('MainStadyServics', 'start Service'); } }; /** 關(guān)閉服務(wù) */ public Button.OnClickListener shutdownService = new Button.OnClickListener() { public void onClick(View view) { /** 單擊按鈕時(shí)啟動(dòng)服務(wù) */ Intent intent = new Intent(MainActivity.this, CountService.class); /** 退出Activity是,停止服務(wù) */ stopService(intent); Log.v('MainStadyServics', 'shutDown serveice'); } }; /** 打開綁定服務(wù)的Activity */ public Button.OnClickListener startBinderService = new Button.OnClickListener() { public void onClick(View view) { /** 單擊按鈕時(shí)啟動(dòng)服務(wù) */ Intent intent = new Intent(MainActivity.this, UseBrider.class); startActivity(intent); Log.v('MainStadyServics', 'start Binder Service'); } };}

mainActivity中當(dāng)使用startService()啟動(dòng)Service時(shí)會(huì)調(diào)用Service的onStartCommand()

當(dāng)使用bindService()則會(huì)調(diào)用onBind()方法,可能會(huì)覺(jué)了看的又看怎么沒(méi)看到bindService()這個(gè)方法呢

重點(diǎn)在

Intent intent = new Intent(MainActivity.this, UseBrider.class);startActivity(intent);

繼續(xù)上代碼

UseBrider.java

/** 通過(guò)bindService和unBindSerivce的方式啟動(dòng)和結(jié)束服務(wù) */public class UseBrider extends FragmentActivity { /** 參數(shù)設(shè)置 */ CountService countService; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new UseBriderFace(this)); Intent intent = new Intent(UseBrider.this, CountService.class); intent.putExtra('book', new Book('name', 'an', 1999));/** 進(jìn)入Activity開始服務(wù) * conn */ bindService(intent, conn, Context.BIND_AUTO_CREATE); } private ServiceConnection conn = new ServiceConnection() { /* * 這個(gè)方法會(huì)獲取到CountService的onBind方法中返回的Binder對(duì)象 * 然后就可以對(duì)服務(wù)進(jìn)行某種操作了 */ public void onServiceConnected(ComponentName name, IBinder service) { // TODO Auto-generated method stub countService = ((CountService.ServiceBinder) service).getService(); countService.callBack(); } /** 無(wú)法獲取到服務(wù)對(duì)象時(shí)的操作 */ public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub countService = null; } }; protected void onDestroy() { super.onDestroy(); this.unbindService(conn); Log.v('MainStadyServics', 'out'); }}

UseBriderFace.java

public class UseBriderFace extends View{ /**創(chuàng)建參數(shù)*/ public UseBriderFace(Context context){ super(context); } public void onDraw(Canvas canvas){ canvas.drawColor(Color.WHITE);//畫白色背景/**繪制文字*/ Paint textPaint = new Paint(); textPaint.setColor(Color.RED); textPaint.setTextSize(30); canvas.drawText('使用綁定服務(wù)', 10, 30, textPaint); textPaint.setColor(Color.GREEN); textPaint.setTextSize(18); canvas.drawText('使用綁定服務(wù)后,這個(gè)Activity關(guān)閉后', 20, 60, textPaint); canvas.drawText('綁定的服務(wù)也會(huì)關(guān)閉', 5, 80, textPaint); } }

UseBriderFace.java類其實(shí)就是用java定義的布局可以用xml文件代替

countService.java

package com.example.android_binder_testservice;/**引入包*/import android.app.Service;// 服務(wù)的類import android.os.IBinder;import android.os.Parcel;import android.os.RemoteException;import android.os.Binder;import android.content.Intent;import android.util.Log;/** 計(jì)數(shù)的服務(wù) */public class CountService extends Service { private String TAG = CountService.class.getSimpleName(); /** 創(chuàng)建參數(shù) */ boolean threadDisable; int count; Book book;/* * 當(dāng)通過(guò)bindService()啟動(dòng)CountService時(shí)會(huì)調(diào)用這個(gè)方法并返回一個(gè)ServiceBinder對(duì)象 * 這個(gè)Binder對(duì)象封裝著一個(gè)CountService實(shí)例, * 客戶端就可以通過(guò)ServiceBinder對(duì)服務(wù)端進(jìn)行一些操作 */ public IBinder onBind(Intent intent) { Log.i(TAG, 'onBind'); book = intent.getParcelableExtra('book'); return new ServiceBinder(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i(TAG, 'onStartCommand'); return super.onStartCommand(intent, flags, startId); } @Override public boolean onUnbind(Intent intent) { Log.i(TAG, 'onUnbind'); return super.onUnbind(intent); } @Override public void onRebind(Intent intent) { Log.i(TAG, 'onRebind'); super.onRebind(intent); } public void onCreate() { super.onCreate(); /** 創(chuàng)建一個(gè)線程,每秒計(jì)數(shù)器加一,并在控制臺(tái)進(jìn)行Log輸出 */ new Thread(new Runnable() { public void run() {while (!threadDisable) { try { Thread.sleep(1000); } catch (InterruptedException e) { } count++; Log.v('CountService', 'Count is' + count);} } }).start(); Log.i(TAG, 'onCreate'); } public void onDestroy() { super.onDestroy(); /** 服務(wù)停止時(shí),終止計(jì)數(shù)進(jìn)程 */ this.threadDisable = true; Log.i(TAG, 'onDestroy'); } public int getConunt() { return count; } public void callBack(){ Log.i(TAG, 'hello,i am a method of CountService'); } class ServiceBinder extends Binder { public CountService getService() { return CountService.this; } }}

代碼解釋有了,想不出來(lái)了

源碼下載地址:http://git.oschina.net/zwh_9527/Binder

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Android
相關(guān)文章:
主站蜘蛛池模板: 首页_中夏易经起名网| 膏方加工_丸剂贴牌_膏滋代加工_湖北康瑞生物科技有限公司 | 软文推广发布平台_新闻稿件自助发布_媒体邀约-澜媒宝 | 碳化硅,氮化硅,冰晶石,绢云母,氟化铝,白刚玉,棕刚玉,石墨,铝粉,铁粉,金属硅粉,金属铝粉,氧化铝粉,硅微粉,蓝晶石,红柱石,莫来石,粉煤灰,三聚磷酸钠,六偏磷酸钠,硫酸镁-皓泉新材料 | 周口风机|周风风机|河南省周口通用风机厂 | 硅胶管挤出机厂家_硅胶挤出机生产线_硅胶条挤出机_臣泽智能装备 贵州科比特-防雷公司厂家提供贵州防雷工程,防雷检测,防雷接地,防雷设备价格,防雷产品报价服务-贵州防雷检测公司 | 高楼航空障碍灯厂家哪家好_航空障碍灯厂家_广州北斗星障碍灯有限公司 | 黑龙江「京科脑康」医院-哈尔滨失眠医院_哈尔滨治疗抑郁症医院_哈尔滨精神心理医院 | ge超声波测厚仪-电动涂膜机-电动划格仪-上海洪富 | 百度关键词优化_网站优化_SEO价格 - 云无限好排名 | 儿童乐园|游乐场|淘气堡招商加盟|室内儿童游乐园配套设备|生产厂家|开心哈乐儿童乐园 | 土壤检测仪器_行星式球磨仪_土壤团粒分析仪厂家_山东莱恩德智能科技有限公司 | PCB接线端子_栅板式端子_线路板连接器_端子排生产厂家-置恒电气 喷码机,激光喷码打码机,鸡蛋打码机,手持打码机,自动喷码机,一物一码防伪溯源-恒欣瑞达有限公司 假肢-假肢价格-假肢厂家-河南假肢-郑州市力康假肢矫形器有限公司 | 斗式提升机,斗式提升机厂家-淄博宏建机械有限公司 | 蔬菜清洗机_环速洗菜机_异物去除清洗机_蔬菜清洗机_商用洗菜机 - 环速科技有限公司 | 德国BOSCH电磁阀-德国HERION电磁阀-JOUCOMATIC电磁阀|乾拓百科 | 根系分析仪,大米外观品质检测仪,考种仪,藻类鉴定计数仪,叶面积仪,菌落计数仪,抑菌圈测量仪,抗生素效价测定仪,植物表型仪,冠层分析仪-杭州万深检测仪器网 | 数控专用机床,专用机床,自动线,组合机床,动力头,自动化加工生产线,江苏海鑫机床有限公司 | 卫生人才网-中国专业的医疗卫生医学人才网招聘网站! | 数显恒温油浴-电砂浴-高温油浴振荡器-常州迈科诺仪器有限公司 | 生产自动包装秤_颗粒包装秤_肥料包装秤等包装机械-郑州鑫晟重工科技有限公司 | 加热制冷恒温循环器-加热制冷循环油浴-杭州庚雨仪器有限公司 | 智慧消防-消防物联网系统云平台| 北京环球北美考试院【官方网站】|北京托福培训班|北京托福培训 | 权威废金属|废塑料|废纸|废铜|废钢价格|再生资源回收行情报价中心-中废网 | 农业仪器网 - 中国自动化农业仪器信息交流平台 | 承插管件_不锈钢承插管件_锻钢高压管件-温州科正阀门管件有限公司 | 玻纤土工格栅_钢塑格栅_PP焊接_单双向塑料土工格栅_复合防裂布厂家_山东大庚工程材料科技有限公司 | 实验室pH计|电导率仪|溶解氧测定仪|离子浓度计|多参数水质分析仪|pH电极-上海般特仪器有限公司 | 低温柔性试验仪-土工布淤堵-沥青车辙试验仪-莱博特(天津)试验机有限公司 | 冷却塔减速机器_冷却塔皮带箱维修厂家_凉水塔风机电机更换-广东康明冷却塔厂家 | 编织人生 - 权威手工编织网站,编织爱好者学习毛衣编织的门户网站,织毛衣就上编织人生网-编织人生 | 绿叶|绿叶投资|健康产业_绿叶投资集团有限公司 | 体检车_移动CT车_CT检查车_CT车_深圳市艾克瑞电气有限公司移动CT体检车厂家-深圳市艾克瑞电气有限公司 | IIS7站长之家-站长工具-爱网站请使用IIS7站长综合查询工具,中国站长【WWW.IIS7.COM】 | 旋振筛|圆形摇摆筛|直线振动筛|滚筒筛|压榨机|河南天众机械设备有限公司 | 铝合金脚手架厂家-专注高空作业平台-深圳腾达安全科技 | 意大利Frascold/富士豪压缩机_富士豪半封闭压缩机_富士豪活塞压缩机_富士豪螺杆压缩机 | 升降机-高空作业车租赁-蜘蛛车-曲臂式伸缩臂剪叉式液压升降平台-脚手架-【普雷斯特公司厂家】 | 油冷式_微型_TDY电动滚筒_外装_外置式电动滚筒厂家-淄博秉泓机械有限公司 | 私人别墅家庭影院系统_家庭影院音响_家庭影院装修设计公司-邦牛影音 |