Android底层结构-SDKService线程知多少备课讲稿.doc

上传人:1595****071 文档编号:51383418 上传时间:2022-10-18 格式:DOC 页数:60 大小:387.50KB
返回 下载 相关 举报
Android底层结构-SDKService线程知多少备课讲稿.doc_第1页
第1页 / 共60页
Android底层结构-SDKService线程知多少备课讲稿.doc_第2页
第2页 / 共60页
点击查看更多>>
资源描述

《Android底层结构-SDKService线程知多少备课讲稿.doc》由会员分享,可在线阅读,更多相关《Android底层结构-SDKService线程知多少备课讲稿.doc(60页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、Good is good, but better carries it.精益求精,善益求善。Android底层结构-SDKService线程知多少-Android底层结构:SDKService线程知多少l总是由进程(Process)的主线程(Mainthread)执行SDK-Service(如下图的myService)对象。lAndroid底层BinderSystem在binding-time会从该进程的Threadpool里启动一个线程来执行SDK-Service的Binder接口对象(如myBinder)。l执行myActivity对象的线程与myBinder对象的线程会同步(Synchr

2、onize),让myActivity开发者觉得IPC远程呼叫、跨进程的两个线程,就如同单一线程一般。本文就LocalSDK-Service与RemoteSDK-Service两种来说明之。一、如果属于LocalService。-则myActivity与myService两者都是由mainthread所执行。亦即,两者是同一线程所执行。此情形下,两个类别里的函数都不宜太费时(例如不宜超过5秒钟);但必要时可诞生子线程去执行费时的函数。/ac01.java(myActivity)packagecom.misoo.kx02b;importandroid.app.Activity;importandr

3、oid.content.Intent;importandroid.graphics.Color;importandroid.os.Bundle;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;importandroid.widget.LinearLayout;importandroid.widget.TextView;publicclassac01extendsActivityimplementsOnClickListener/privatefinalintW

4、C=LinearLayout.LayoutParams.WRAP_CONTENT;privateTextViewtx;privateButtonbtn;OverridepublicvoidonCreate(BundlesavedInstanceState)super.onCreate(savedInstanceState);setContentView(R.layout.main);LinearLayoutlayout=newLinearLayout(this);layout.setOrientation(LinearLayout.VERTICAL);LinearLayout.LayoutPa

5、ramsparam=newLinearLayout.LayoutParams(150,40);param.topMargin=5;tx=newTextView(this);tx.setTextSize(16);tx.setTextColor(Color.BLUE);tx.setBackgroundResource(R.drawable.x_yellow);layout.addView(tx,param);btn=newButton(this);btn.setText(Exit);btn.setBackgroundResource(R.drawable.earth);btn.setOnClick

6、Listener(this);layout.addView(btn,param);this.setContentView(layout);/-Stringtna=Thread.currentThread().getName();Thread.currentThread().setName(tna+-myActivity);/-myService.setUpdateListener(newUpdateUIListener();Intentsvc=newIntent(this,myService.class);startService(svc);OverrideprotectedvoidonDes

7、troy()super.onDestroy();Intentsvc=newIntent(this,myService.class);stopService(svc);classUpdateUIListenerimplementsIListenerpublicvoidupdate(Strings)tx.setText(s);publicvoidonClick(Viewv)this.finish();IListener.javapackagecom.misoo.kx02b;publicinterfaceIListenerpublicvoidupdate(Strings);/myService.ja

8、vapackagecom.misoo.kx02b;importjava.util.Timer;importjava.util.TimerTask;importandroid.app.Service;importandroid.content.Intent;importandroid.os.Handler;importandroid.os.IBinder;importandroid.os.Message;publicclassmyServiceextendsServiceprivatestaticIListenerplis;privatestaticintk=0;privateTimertime

9、r=newTimer();privateStringtna;publicHandlerhandler=newHandler()publicvoidhandleMessage(Messagemsg)plis.update(tna);OverridepublicvoidonCreate()super.onCreate();tna=Thread.currentThread().getName();TimerTasktask=newTimerTask()Overridepublicvoidrun()handler.sendEmptyMessage(0);timer.schedule(task,1000

10、,4000);OverridepublicIBinderonBind(Intentintent)returnnull;publicstaticvoidsetUpdateListener(IListenerlistener)plis=listener;此程序输出:此结果说明了,myActivity与myService两者都是由mainthread所执行。二就一个SDKService而言,都是由mainthread执行myService的onCreate()、onBind()、onStart()等函数。然而,是由独立的线程来执行myBinder:onTransact()函数。因为BinderSys

11、tem会从该进程的Threadpool里启动一个线程来执行SDK-Service的Binder接口对象(如myBinder)。二、如果属于RemoteService。-则myActivity与myService各在不同进程里执行,两者都是由各进程的mainthread所执行。亦即,两者是由不同的线程所执行。此情形下,两个类别里的函数也不宜太费时(例如不宜超过5秒钟);但必要时可诞生子线程去执行较费时的函数。-所以由mainthread(myService所在的进程的mainthread)执行myService:onCreate()、myBinder:myBinder()和myService:o

12、nBind()。-在Binding-time时,BinderSystem会建立myActivity与myBinder(即myService的Interface)之间的连结(Connection)。-在IPCcalling-time时,myActivity的线程与myBinder的线程会同步(Synchronize),让myActivity开发者觉得IPC远程呼叫、跨进程的两个线程,就如同单一线程一般。-在送出IPCcall时,执行myBinder对象的线程会执行myBinder:onTransact()函数。兹写个程序来说明之,此程序执行时,出现下述画面:按下上一个Button,显示出main

13、thread的执行路径:按下第二个Button,显示出mainthread执行onBind()函数:按下第三个Button,显示出BinderSystem启用独立的thread执行onTransact()函数:兹列出程序代码如下:/AndroidManifest.xml/ac01.javapackagecom.misoo.kx02c;importandroid.app.Activity;importandroid.content.ComponentName;importandroid.content.Context;importandroid.content.Intent;importandr

14、oid.content.ServiceConnection;importandroid.graphics.Color;importandroid.os.Bundle;importandroid.os.IBinder;importandroid.os.Parcel;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;importandroid.widget.LinearLayout;importandroid.widget.TextView;publicclassa

15、c01extendsActivityimplementsOnClickListenerprivatefinalintWC=LinearLayout.LayoutParams.WRAP_CONTENT;privatefinalintFP=LinearLayout.LayoutParams.FILL_PARENT;privateButtonbtn,btn2,btn3,btn4;publicTextViewtv;privateIBinderib=null;publicvoidonCreate(Bundleicicle)super.onCreate(icicle);LinearLayoutlayout

16、=newLinearLayout(this);layout.setOrientation(LinearLayout.VERTICAL);btn=newButton(this);btn.setId(101);btn.setText(startservice);btn.setBackgroundResource(R.drawable.heart);btn.setOnClickListener(this);LinearLayout.LayoutParamsparam=newLinearLayout.LayoutParams(120,50);param.topMargin=10;layout.addV

17、iew(btn,param);btn2=newButton(this);btn2.setId(102);btn2.setText(bindservice);btn2.setBackgroundResource(R.drawable.heart);btn2.setOnClickListener(this);layout.addView(btn2,param);btn3=newButton(this);btn3.setId(103);btn3.setText(IPCcall);btn3.setBackgroundResource(R.drawable.heart);btn3.setOnClickL

18、istener(this);layout.addView(btn3,param);btn4=newButton(this);btn4.setId(104);btn4.setText(exit);btn4.setBackgroundResource(R.drawable.heart);btn4.setOnClickListener(this);layout.addView(btn4,param);tv=newTextView(this);tv.setTextColor(Color.WHITE);tv.setText();LinearLayout.LayoutParamsparam2=newLin

19、earLayout.LayoutParams(FP,WC);param2.topMargin=10;layout.addView(tv,param2);setContentView(layout);/-Stringtna=Thread.currentThread().getName();Thread.currentThread().setName(tna+-ac01);/-privateServiceConnectionmConnection=newServiceConnection()publicvoidonServiceConnected(ComponentNameclassName,IB

20、inderibinder)ib=ibinder;publicvoidonServiceDisconnected(ComponentNameclassName);publicvoidonClick(Viewv)switch(v.getId()case101:startService(newIntent(com.misoo.kx02c.REMOTE_SERVICE);break;case102:bindService(newIntent(com.misoo.kx02c.REMOTE_SERVICE),mConnection,Context.BIND_AUTO_CREATE);break;case1

21、03:Parcelpc=Parcel.obtain();Parcelpc_reply=Parcel.obtain();tryib.transact(1,pc,pc_reply,0);tv.setText(pc_reply.readString();catch(Exceptione)e.printStackTrace();break;case104:finish();break;/myActivity.javapackagecom.misoo.kx02c;importandroid.app.Activity;importandroid.graphics.Color;importandroid.o

22、s.Bundle;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;importandroid.widget.LinearLayout;importandroid.widget.TextView;publicclassmyActivityextendsActivityimplementsOnClickListenerprivatefinalintWC=LinearLayout.LayoutParams.WRAP_CONTENT;privatefinalintFP

23、=LinearLayout.LayoutParams.FILL_PARENT;privateButtonbtn;publicTextViewtv;publicvoidonCreate(Bundleicicle)super.onCreate(icicle);LinearLayoutlayout=newLinearLayout(this);layout.setOrientation(LinearLayout.VERTICAL);btn=newButton(this);btn.setId(101);btn.setText(exit);btn.setBackgroundResource(R.drawa

24、ble.water);btn.setOnClickListener(this);LinearLayout.LayoutParamsparam=newLinearLayout.LayoutParams(120,50);param.topMargin=10;layout.addView(btn,param);tv=newTextView(this);tv.setTextColor(Color.WHITE);tv.setText();LinearLayout.LayoutParamsparam2=newLinearLayout.LayoutParams(FP,WC);param2.topMargin

25、=10;layout.addView(tv,param2);setContentView(layout);/-tv.setText(Thread.currentThread().getName()+-myActivity);/-publicvoidonClick(Viewv)switch(v.getId()case101:finish();break;/myService,javapackagecom.misoo.kx02c;importandroid.app.Service;importandroid.content.Intent;importandroid.os.Binder;import

26、android.os.IBinder;importandroid.os.Parcel;publicclassmyServiceextendsServiceprivateIBindermBinder=null;OverridepublicvoidonCreate()Thread.currentThread().setName(Thread.currentThread().getName()+-onCreate);mBinder=newmyBinder();OverridepublicvoidonStart(Intentintent,intstartId)Thread.currentThread(

27、).setName(Thread.currentThread().getName()+-onStart);Intenti=newIntent(getApplicationContext(),myActivity.class);i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);getApplicationContext().startActivity(i);OverridepublicIBinderonBind(Intentintent)Thread.currentThread().setName(Thread.currentThread().getName()

28、+-onBind);Intentin=newIntent(this.getApplicationContext(),myActivity.class);in.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(in);returnmBinder;publicclassmyBinderextendsBinderpublicmyBinder()Thread.currentThread().setName(Thread.currentThread().getName()+-myBinder);OverridepublicbooleanonTra

29、nsact(intcode,Parceldata,Parcelreply,intflags)throwsandroid.os.RemoteExceptionreply.writeString(Thread.currentThread().getName();returntrue;返回:Android底层结构系列文章三*Activity线程与Service线程的同步-在Binding-time时,BinderSystem会建立myActivity与myBinder(即myService的Interface)之间的连结(Connection)。-在IPCcalling-time时,myActivi

30、ty的线程与myBinder的线程会同步(Synchronize),让myActivity开发者觉得IPC远程呼叫、跨进程的两个线程,就如同单一线程一般。兹写个程序来说明之,此程序执行时,出现下述画面:按下之后,执行myActivity的主线程会等待myBinder线程,所以必须等待数秒钟之后,myActivity的主线程才会继续输出:count:1value:5字符串:按下之后,myActivity的主线程继续输出:count:1value:305字符串:以上说明了:lmyActivity的主线程会等待myBinder线程。lConnection#1和Connection#2连结到同一个my

31、Binder对象。l透过两条不同的Connection,可存取到一个myBinder物件里的values值。兹列出程序代码如下:/ac01packagecom.misoo.kx02c;importandroid.app.Activity;importandroid.content.ComponentName;importandroid.content.Context;importandroid.content.Intent;importandroid.content.ServiceConnection;importandroid.graphics.Color;importandroid.os.

32、Bundle;importandroid.os.IBinder;importandroid.os.Parcel;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;importandroid.widget.LinearLayout;importandroid.widget.TextView;publicclassac01extendsActivityimplementsOnClickListenerprivatefinalintWC=LinearLayout.La

33、youtParams.WRAP_CONTENT;privatefinalintFP=LinearLayout.LayoutParams.FILL_PARENT;privateButtonbtn,btn2,btn3;publicTextViewtv;privateIBinderib=null;privateIBinderib2=null;publicvoidonCreate(Bundleicicle)super.onCreate(icicle);LinearLayoutlayout=newLinearLayout(this);layout.setOrientation(LinearLayout.

34、VERTICAL);btn=newButton(this);btn.setId(101);btn.setText(IPCcallconn#1);btn.setBackgroundResource(R.drawable.heart);btn.setOnClickListener(this);LinearLayout.LayoutParamsparam=newLinearLayout.LayoutParams(120,50);param.topMargin=10;layout.addView(btn,param);btn2=newButton(this);btn2.setId(102);btn2.

35、setText(IPCcallconn#2);btn2.setBackgroundResource(R.drawable.heart);btn2.setOnClickListener(this);layout.addView(btn2,param);btn3=newButton(this);btn3.setId(103);btn3.setText(exit);btn3.setBackgroundResource(R.drawable.heart);btn3.setOnClickListener(this);layout.addView(btn3,param);tv=newTextView(th

36、is);tv.setTextColor(Color.WHITE);tv.setText();LinearLayout.LayoutParamsparam2=newLinearLayout.LayoutParams(FP,WC);param2.topMargin=10;layout.addView(tv,param2);setContentView(layout);/-bindService(newIntent(com.misoo.kx02c.REMOTE_SERVICE),mConnection,Context.BIND_AUTO_CREATE);/-bindService(newIntent

37、(com.misoo.kx02c.REMOTE_SERVICE),mConnection2,Context.BIND_AUTO_CREATE);/-privateServiceConnectionmConnection=newServiceConnection()publicvoidonServiceConnected(ComponentNameclassName,IBinderibinder)ib=ibinder;publicvoidonServiceDisconnected(ComponentNameclassName);privateServiceConnectionmConnectio

38、n2=newServiceConnection()publicvoidonServiceConnected(ComponentNameclassName,IBinderibinder)ib2=ibinder;publicvoidonServiceDisconnected(ComponentNameclassName);publicvoidonClick(Viewv)switch(v.getId()case101:Parcelp=Parcel.obtain();Parcelp_reply=Parcel.obtain();tryib.transact(0,p,p_reply,0);tv.setText(p_reply.readString();catch(Exceptione)e.printStackTrace();break;case102:Parcelpc=Parcel.obtain();Parcelpc_reply=Parcel.obtain();tryib2.transact(1,pc,pc_reply,0);tv.setT

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com