




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Good is good, but better carries it.精益求精,善益求善。Android底層結(jié)構(gòu)-SDKService線程知多少-Android底層結(jié)構(gòu):SDKService線程知多少總是由進(jìn)程(Process)的主線程(Mainthread)執(zhí)行SDK-Service(如下圖的myService)對象。Android底層BinderSystem在binding-time會(huì)從該進(jìn)程的Threadpool里啟動(dòng)一個(gè)線程來執(zhí)行SDK-Service的Binder接口對象(如myBinder)。執(zhí)行myActivity對象的線程與myBinder對象的線程會(huì)同步(Synchroni
2、ze),讓myActivity開發(fā)者覺得IPC遠(yuǎn)程呼叫、跨進(jìn)程的兩個(gè)線程,就如同單一線程一般。本文就LocalSDK-Service與RemoteSDK-Service兩種來說明之。一、如果屬于LocalService。-則myActivity與myService兩者都是由mainthread所執(zhí)行。亦即,兩者是同一線程所執(zhí)行。此情形下,兩個(gè)類別里的函數(shù)都不宜太費(fèi)時(shí)(例如不宜超過5秒鐘);但必要時(shí)可誕生子線程去執(zhí)行費(fèi)時(shí)的函數(shù)。/ac01.java(myActivity)packagecom.misoo.kx02b;importandroid.app.Activity;importandroid
3、.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/privatefinalintWC=L
4、inearLayout.LayoutParams.WRAP_CONTENT;privateTextViewtx;privateButtonbtn;OverridepublicvoidonCreate(BundlesavedInstanceState)super.onCreate(savedInstanceState);setContentView(R.layout.main);LinearLayoutlayout=newLinearLayout(this);layout.setOrientation(LinearLayout.VERTICAL);LinearLayout.LayoutParam
5、sparam=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.setOnClickLis
6、tener(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);OverrideprotectedvoidonDestro
7、y()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.javap
8、ackagecom.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;privateTimertimer=n
9、ewTimer();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,40
10、00);OverridepublicIBinderonBind(Intentintent)returnnull;publicstaticvoidsetUpdateListener(IListenerlistener)plis=listener;此程序輸出:此結(jié)果說明了,myActivity與myService兩者都是由mainthread所執(zhí)行。二就一個(gè)SDKService而言,都是由mainthread執(zhí)行myService的onCreate()、onBind()、onStart()等函數(shù)。然而,是由獨(dú)立的線程來執(zhí)行myBinder:onTransact()函數(shù)。因?yàn)锽inderSystem
11、會(huì)從該進(jìn)程的Threadpool里啟動(dòng)一個(gè)線程來執(zhí)行SDK-Service的Binder接口對象(如myBinder)。二、如果屬于RemoteService。-則myActivity與myService各在不同進(jìn)程里執(zhí)行,兩者都是由各進(jìn)程的mainthread所執(zhí)行。亦即,兩者是由不同的線程所執(zhí)行。此情形下,兩個(gè)類別里的函數(shù)也不宜太費(fèi)時(shí)(例如不宜超過5秒鐘);但必要時(shí)可誕生子線程去執(zhí)行較費(fèi)時(shí)的函數(shù)。-所以由mainthread(myService所在的進(jìn)程的mainthread)執(zhí)行myService:onCreate()、myBinder:myBinder()和myService:onBi
12、nd()。-在Binding-time時(shí),BinderSystem會(huì)建立myActivity與myBinder(即myService的Interface)之間的連結(jié)(Connection)。-在IPCcalling-time時(shí),myActivity的線程與myBinder的線程會(huì)同步(Synchronize),讓myActivity開發(fā)者覺得IPC遠(yuǎn)程呼叫、跨進(jìn)程的兩個(gè)線程,就如同單一線程一般。-在送出IPCcall時(shí),執(zhí)行myBinder對象的線程會(huì)執(zhí)行myBinder:onTransact()函數(shù)。茲寫個(gè)程序來說明之,此程序執(zhí)行時(shí),出現(xiàn)下述畫面:按下上一個(gè)Button,顯示出mainthr
13、ead的執(zhí)行路徑:按下第二個(gè)Button,顯示出mainthread執(zhí)行onBind()函數(shù):按下第三個(gè)Button,顯示出BinderSystem啟用獨(dú)立的thread執(zhí)行onTransact()函數(shù):茲列出程序代碼如下:/AndroidManifest.xml/ac01.javapackagecom.misoo.kx02c;importandroid.app.Activity;importandroid.content.ComponentName;importandroid.content.Context;importandroid.content.Intent;importandroid
14、.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;publicclassac01
15、extendsActivityimplementsOnClickListenerprivatefinalintWC=LinearLayout.LayoutParams.WRAP_CONTENT;privatefinalintFP=LinearLayout.LayoutParams.FILL_PARENT;privateButtonbtn,btn2,btn3,btn4;publicTextViewtv;privateIBinderib=null;publicvoidonCreate(Bundleicicle)super.onCreate(icicle);LinearLayoutlayout=ne
16、wLinearLayout(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.addView
17、(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.setOnClickList
18、ener(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=newLinear
19、Layout.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,IBind
20、eribinder)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;case103:
21、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.os.B
22、undle;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;importandroid.widget.LinearLayout;importandroid.widget.TextView;publicclassmyActivityextendsActivityimplementsOnClickListenerprivatefinalintWC=LinearLayout.LayoutParams.WRAP_CONTENT;privatefinalintFP=Li
23、nearLayout.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.drawable
24、.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=10
25、;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;importand
26、roid.os.IBinder;importandroid.os.Parcel;publicclassmyServiceextendsServiceprivateIBindermBinder=null;OverridepublicvoidonCreate()Thread.currentThread().setName(Thread.currentThread().getName()+-onCreate);mBinder=newmyBinder();OverridepublicvoidonStart(Intentintent,intstartId)Thread.currentThread().s
27、etName(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()+-o
28、nBind);Intentin=newIntent(this.getApplicationContext(),myActivity.class);in.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(in);returnmBinder;publicclassmyBinderextendsBinderpublicmyBinder()Thread.currentThread().setName(Thread.currentThread().getName()+-myBinder);OverridepublicbooleanonTransa
29、ct(intcode,Parceldata,Parcelreply,intflags)throwsandroid.os.RemoteExceptionreply.writeString(Thread.currentThread().getName();returntrue;HYPERLINK/Topic.aspx?BoardID=11&TopicID=833t_blank返回:Android底層結(jié)構(gòu)系列文章三*Activity線程與Service線程的同步-在Binding-time時(shí),BinderSystem會(huì)建立myActivity與myBinder(即myService的Interfac
30、e)之間的連結(jié)(Connection)。-在IPCcalling-time時(shí),myActivity的線程與myBinder的線程會(huì)同步(Synchronize),讓myActivity開發(fā)者覺得IPC遠(yuǎn)程呼叫、跨進(jìn)程的兩個(gè)線程,就如同單一線程一般。茲寫個(gè)程序來說明之,此程序執(zhí)行時(shí),出現(xiàn)下述畫面:按下之后,執(zhí)行myActivity的主線程會(huì)等待myBinder線程,所以必須等待數(shù)秒鐘之后,myActivity的主線程才會(huì)繼續(xù)輸出:count:1value:5字符串:按下之后,myActivity的主線程繼續(xù)輸出:count:1value:305字符串:以上說明了:myActivity的主線程會(huì)等
31、待myBinder線程。Connection#1和Connection#2連結(jié)到同一個(gè)myBinder對象。透過兩條不同的Connection,可存取到一個(gè)myBinder物件里的values值。茲列出程序代碼如下:/ac01packagecom.misoo.kx02c;importandroid.app.Activity;importandroid.content.ComponentName;importandroid.content.Context;importandroid.content.Intent;importandroid.content.ServiceConnection;im
32、portandroid.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;publicclassac01extendsActivityimplementsOnCl
33、ickListenerprivatefinalintWC=LinearLayout.LayoutParams.WRAP_CONTENT;privatefinalintFP=LinearLayout.LayoutParams.FILL_PARENT;privateButtonbtn,btn2,btn3;publicTextViewtv;privateIBinderib=null;privateIBinderib2=null;publicvoidonCreate(Bundleicicle)super.onCreate(icicle);LinearLayoutlayout=newLinearLayo
34、ut(this);layout.setOrientation(LinearLayout.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
35、);btn2=newButton(this);btn2.setId(102);btn2.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);
36、layout.addView(btn3,param);tv=newTextView(this);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,Conte
37、xt.BIND_AUTO_CREATE);/-bindService(newIntent(com.misoo.kx02c.REMOTE_SERVICE),mConnection2,Context.BIND_AUTO_CREATE);/-privateServiceConnectionmConnection=newServiceConnection()publicvoidonServiceConnected(ComponentNameclassName,IBinderibinder)ib=ibinder;publicvoidonServiceDisconnected(ComponentNamec
38、lassName);privateServiceConnectionmConnection2=newServiceConnection()publicvoidonServiceConnected(ComponentNameclassName,IBinderibinder)ib2=ibinder;publicvoidonServiceDisconnected(ComponentNameclassName);publicvoidonClick(Viewv)switch(v.getId()case101:Parcelp=Parcel.obtain();Parcelp_reply=Parcel.obt
39、ain();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.setText(pc_reply.readString();catch(Exceptione)e.printStackTrace();break;case103:finish()
40、;break;/myServicepackagecom.misoo.kx02c;importandroid.app.Service;importandroid.content.Intent;importandroid.os.Binder;importandroid.os.IBinder;importandroid.os.Parcel;publicclassmyServiceextendsServiceprivatestaticintcount=0;OverridepublicIBinderonBind(Intentintent)count+;returnnewmyBinder();public
41、classmyBinderextendsBinderprivateintvalue=0;OverridepublicbooleanonTransact(intcode,Parceldata,Parcelreply,intflags)throwsandroid.os.RemoteExceptionif(code=0)value+=5;tryThread.sleep(8000);catch(InterruptedExceptione)/TODOAuto-generatedcatchblocke.printStackTrace();elseif(code=1)value+=300;reply.wri
42、teString(count:+String.valueOf(count)+value:+String.valueOf(value);returntrue;END*Service進(jìn)程的ThreadPool-在Binding-time時(shí),BinderSystem會(huì)建立myActivity與myBinder(即myService的Interface)之間的連結(jié)(Connection)。-在IPCcalling-time時(shí),每次IPCcall,BinderSystem會(huì)從Service進(jìn)程的Threadpool里啟動(dòng)一個(gè)Thread來對應(yīng)myActivity的線程。茲寫個(gè)范例:myActivity的
43、mainthread先誕生一個(gè)子線程發(fā)出IPC,Service進(jìn)程則啟動(dòng)BinderThread#1來接待它。此myActivity子線程會(huì)等待BinderThread#1睡醒。myActivity的mainthread再誕生一個(gè)子線程發(fā)出IPC,Service進(jìn)程則啟動(dòng)BinderThread#2來接待它。此myActivity子線程會(huì)等待BinderThread#2睡醒。myActivity的mainthread自己發(fā)出IPC,Service進(jìn)程則啟動(dòng)BinderThread#3來接待它。茲列出程序代碼:/ac01.javapackagecom.misoo.kx02c;importandr
44、oid.app.Activity;importandroid.content.ComponentName;importandroid.content.Context;importandroid.content.Intent;importandroid.content.ServiceConnection;importandroid.graphics.Color;importandroid.os.Bundle;importandroid.os.Handler;importandroid.os.IBinder;importandroid.os.Message;importandroid.os.Par
45、cel;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;importandroid.widget.LinearLayout;importandroid.widget.TextView;publicclassac01extendsActivityimplementsOnClickListenerprivatefinalintWC=LinearLayout.LayoutParams.WRAP_CONTENT;privatefinalintFP=LinearLayo
46、ut.LayoutParams.FILL_PARENT;privateButtonbtn,btn2;publicTextViewtv,tv2;privateIBinderib=null;privateHandlerh1,h2;publicvoidonCreate(Bundleicicle)super.onCreate(icicle);LinearLayoutlayout=newLinearLayout(this);layout.setOrientation(LinearLayout.VERTICAL);btn=newButton(this);btn.setId(101);btn.setText
47、(createthreads);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.setText(exit);btn2.setBackgroundResource(R.drawable.hear
48、t);btn2.setOnClickListener(this);layout.addView(btn2,param);tv=newTextView(this);tv.setTextColor(Color.WHITE);tv.setText();LinearLayout.LayoutParamsparam2=newLinearLayout.LayoutParams(FP,WC);param2.topMargin=10;layout.addView(tv,param2);tv2=newTextView(this);tv2.setTextColor(Color.WHITE);tv2.setText
49、();layout.addView(tv2,param2);setContentView(layout);/-Intentin=newIntent(com.misoo.kx02c.REMOTE_SERVICE);in.putExtra(key,0);bindService(in,mConnection,Context.BIND_AUTO_CREATE);privateServiceConnectionmConnection=newServiceConnection()publicvoidonServiceConnected(ComponentNameclassName,IBinderibind
50、er)ib=ibinder;publicvoidonServiceDisconnected(ComponentNameclassName);publicvoidonClick(Viewv)switch(v.getId()case101:h1=newHandler()publicvoidhandleMessage(Messagemsg)tv.setText(String)msg.obj);Threadt1=newThread(newTask();t1.start();/-tryThread.sleep(1000);catch(InterruptedExceptione1)/TODOAuto-ge
51、neratedcatchblocke1.printStackTrace();/-h2=newHandler()publicvoidhandleMessage(Messagemsg)tv2.setText(String)msg.obj);Threadt2=newThread(newTask2();t2.start();Parcelpc=Parcel.obtain();Parcelpc_reply=Parcel.obtain();tryib.transact(2,pc,pc_reply,0);setTitle(pc_reply.readString();catch(Exceptione)e.pri
52、ntStackTrace();break;case102:finish();break;/-classTaskimplementsRunnablepublicvoidrun()Parcelpc=Parcel.obtain();Parcelpc_reply=Parcel.obtain();tryib.transact(0,pc,pc_reply,0);Messagem=h1.obtainMessage(1,1,1,pc_reply.readString();h1.sendMessage(m);catch(Exceptione)e.printStackTrace();classTask2imple
53、mentsRunnablepublicvoidrun()Parcelpc=Parcel.obtain();Parcelpc_reply=Parcel.obtain();tryib.transact(1,pc,pc_reply,0);Messagem=h2.obtainMessage(1,1,1,pc_reply.readString();h2.sendMessage(m);catch(Exceptione)e.printStackTrace();/myBinder.javapackagecom.misoo.kx02c;importandroid.os.Binder;importandroid.
54、os.Parcel;publicclassmyBinderextendsBinderprivateintid=0;publicmyBinder(intidd)id=idd;OverridepublicbooleanonTransact(intcode,Parceldata,Parcelreply,intflags)throwsandroid.os.RemoteExceptionif(code!=2)tryThread.sleep(8000);catch(InterruptedExceptione)/TODOAuto-generatedcatchblocke.printStackTrace();
55、reply.writeString(Thread.currentThread().getName();/elseif(id=200)/reply.writeString(Thread.currentThread().getName()+-conn.#1);returntrue;/myService.javapackagecom.misoo.kx02c;importandroid.app.Service;importandroid.content.Intent;importandroid.os.IBinder;publicclassmyServiceextendsServiceprivatemy
56、Bindermb;OverridepublicvoidonCreate()mb=newmyBinder(100);OverridepublicIBinderonBind(Intentintent)returnmb;HYPERLINK/Topic.aspx?BoardID=11&TopicID=833t_blank返回:Android底層結(jié)構(gòu)系列文章五*ToBind到Service的不同Interface-如果從Binder衍生了myBinder1、myBinder2和myBinder3等子類時(shí),如何替myService選擇適當(dāng)?shù)膍yBinder接口類別呢?-如果連續(xù)呼叫bindService(
57、)兩次,會(huì)bind到同一個(gè)myBinder物件。-如果想Bind到另一個(gè)myBinder接口類別之對象,可先unbind(),就會(huì)呼叫到onBind()函數(shù),來決定bind到哪一個(gè)對象。茲寫個(gè)范例:按下會(huì)呼叫onBind()而綁到myBinder1的對象。再按下,就出現(xiàn):由于Connection1已經(jīng)綁定了myBinder1的對象。繼續(xù)按下就還是Bind到myBinder1的對象(不會(huì)呼叫onBind()函數(shù)),按下,就出現(xiàn):繼續(xù)按下,先unbind掉myBinder1的對象,再按下,會(huì)呼叫onBind()而綁到myBinder3的對象。再按下,就出現(xiàn):茲列出程序代碼/ac01packagec
58、om.misoo.kx02c;importandroid.app.Activity;importandroid.content.ComponentName;importandroid.content.Context;importandroid.content.Intent;importandroid.content.ServiceConnection;importandroid.graphics.Color;importandroid.os.Bundle;importandroid.os.IBinder;importandroid.os.Parcel;importandroid.view.Vi
59、ew;importandroid.view.View.OnClickListener;importandroid.widget.Button;importandroid.widget.LinearLayout;importandroid.widget.TextView;publicclassac01extendsActivityimplementsOnClickListenerprivatefinalintWC=LinearLayout.LayoutParams.WRAP_CONTENT;privatefinalintFP=LinearLayout.LayoutParams.FILL_PARE
60、NT;privateButtonbtn,btn2,btn3,btn4,btn5;publicTextViewtv;privateIBinderib=null;publicvoidonCreate(Bundleicicle)super.onCreate(icicle);LinearLayoutlayout=newLinearLayout(this);layout.setOrientation(LinearLayout.VERTICAL);btn=newButton(this);btn.setId(101);btn.setText(bind-1);btn.setBackgroundResource
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《Unit 2 What's interesting about families 》(教學(xué)設(shè)計(jì))-2024-2025學(xué)年滬教版(2024)英語三年級上冊
- 2024年視覺傳播設(shè)計(jì)視覺信息處理試題及答案
- 2024年CPBA考試中戰(zhàn)略思維與商業(yè)實(shí)踐的融合分析試題及答案
- 2024年寧波鄞州銀行招聘考試真題
- 血站疫情防控課件
- 小自考行政管理知識融合試題及答案
- 《晚風(fēng)》(教學(xué)設(shè)計(jì))-2024-2025學(xué)年人音版(2012)音樂五年級上冊
- 視覺傳播設(shè)計(jì)創(chuàng)新型項(xiàng)目案例分析試題及答案
- 中國古典名著研讀試題及答案
- 管理學(xué)試題及答案喬森
- DeepSeek在海洋資源開發(fā)中的應(yīng)用潛力
- 2025年供水安全考試試題及答案
- 腹外疝圍手術(shù)期護(hù)理
- 課件:德國魯爾區(qū)的工業(yè)遺產(chǎn)與轉(zhuǎn)型
- 中國近現(xiàn)代史綱要學(xué)習(xí)心得體會(huì)對青少年成長的影響
- 新租賃準(zhǔn)則培訓(xùn)課件
- 2025年河南經(jīng)貿(mào)職業(yè)學(xué)院單招職業(yè)技能測試題庫帶答案
- 接觸網(wǎng)工職業(yè)技能鑒定題庫(技師)題庫
- 2025年二級建造師建筑實(shí)務(wù)真題及答案
- 2025年山西地質(zhì)集團(tuán)招聘筆試參考題庫含答案解析
- 提高發(fā)票額度的合同6篇
評論
0/150
提交評論