版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Good is good, but better carries it.精益求精,善益求善。Android底层结构-SDKService线程知多少-Android底层结构:SDKService线程知多少总是由进程(Process)的主线程(Mainthread)执行SDK-Service(如下图的myService)对象。Android底层BinderSystem在binding-time会从该进程的Threadpool里启动一个线程来执行SDK-Service的Binder接口对象(如myBinder)。执行myActivity对象的线程与myBinder对象的线程会同步(Synchroni
2、ze),让myActivity开发者觉得IPC远程呼叫、跨进程的两个线程,就如同单一线程一般。本文就LocalSDK-Service与RemoteSDK-Service两种来说明之。一、如果属于LocalService。-则myActivity与myService两者都是由mainthread所执行。亦即,两者是同一线程所执行。此情形下,两个类别里的函数都不宜太费时(例如不宜超过5秒钟);但必要时可诞生子线程去执行费时的函数。/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;此程序输出:此结果说明了,myActivity与myService两者都是由mainthread所执行。二就一个SDKService而言,都是由mainthread执行myService的onCreate()、onBind()、onStart()等函数。然而,是由独立的线程来执行myBinder:onTransact()函数。因为BinderSystem
11、会从该进程的Threadpool里启动一个线程来执行SDK-Service的Binder接口对象(如myBinder)。二、如果属于RemoteService。-则myActivity与myService各在不同进程里执行,两者都是由各进程的mainthread所执行。亦即,两者是由不同的线程所执行。此情形下,两个类别里的函数也不宜太费时(例如不宜超过5秒钟);但必要时可诞生子线程去执行较费时的函数。-所以由mainthread(myService所在的进程的mainthread)执行myService:onCreate()、myBinder:myBinder()和myService:onBi
12、nd()。-在Binding-time时,BinderSystem会建立myActivity与myBinder(即myService的Interface)之间的连结(Connection)。-在IPCcalling-time时,myActivity的线程与myBinder的线程会同步(Synchronize),让myActivity开发者觉得IPC远程呼叫、跨进程的两个线程,就如同单一线程一般。-在送出IPCcall时,执行myBinder对象的线程会执行myBinder:onTransact()函数。兹写个程序来说明之,此程序执行时,出现下述画面:按下上一个Button,显示出mainthr
13、ead的执行路径:按下第二个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;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底层结构系列文章三*Activity线程与Service线程的同步-在Binding-time时,BinderSystem会建立myActivity与myBinder(即myService的Interfac
30、e)之间的连结(Connection)。-在IPCcalling-time时,myActivity的线程与myBinder的线程会同步(Synchronize),让myActivity开发者觉得IPC远程呼叫、跨进程的两个线程,就如同单一线程一般。兹写个程序来说明之,此程序执行时,出现下述画面:按下之后,执行myActivity的主线程会等待myBinder线程,所以必须等待数秒钟之后,myActivity的主线程才会继续输出:count:1value:5字符串:按下之后,myActivity的主线程继续输出:count:1value:305字符串:以上说明了:myActivity的主线程会等
31、待myBinder线程。Connection#1和Connection#2连结到同一个myBinder对象。透过两条不同的Connection,可存取到一个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进程的ThreadPool-在Binding-time时,BinderSystem会建立myActivity与myBinder(即myService的Interface)之间的连结(Connection)。-在IPCcalling-time时,每次IPCcall,BinderSystem会从Service进程的Threadpool里启动一个Thread来对应myActivity的线程。兹写个范例:myActivity的
43、mainthread先诞生一个子线程发出IPC,Service进程则启动BinderThread#1来接待它。此myActivity子线程会等待BinderThread#1睡醒。myActivity的mainthread再诞生一个子线程发出IPC,Service进程则启动BinderThread#2来接待它。此myActivity子线程会等待BinderThread#2睡醒。myActivity的mainthread自己发出IPC,Service进程则启动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底层结构系列文章五*ToBind到Service的不同Interface-如果从Binder衍生了myBinder1、myBinder2和myBinder3等子类时,如何替myService选择适当的myBinder接口类别呢?-如果连续呼叫bindService(
57、)两次,会bind到同一个myBinder物件。-如果想Bind到另一个myBinder接口类别之对象,可先unbind(),就会呼叫到onBind()函数,来决定bind到哪一个对象。兹写个范例:按下会呼叫onBind()而绑到myBinder1的对象。再按下,就出现:由于Connection1已经绑定了myBinder1的对象。继续按下就还是Bind到myBinder1的对象(不会呼叫onBind()函数),按下,就出现:继续按下,先unbind掉myBinder1的对象,再按下,会呼叫onBind()而绑到myBinder3的对象。再按下,就出现:兹列出程序代码/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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 单位管理制度呈现大合集人员管理十篇
- 2024年城管督查个人总结
- 寒假自习课 25春初中道德与法治八年级下册教学课件 第三单元 第五课 第1课时 根本政治制度
- 建筑工程行业安全管理工作总结
- 2011年高考语文试卷(大纲版全国Ⅱ卷)(空白卷)
- 化妆品行业销售工作总结
- 小学数学教学计划18篇
- 2023年项目部治理人员安全培训考试题含下载答案可打印
- 2023年-2024年项目部安全培训考试题答案往年题考
- 竞业限制协议书三篇
- 2025年云南昆明经济技术开发区投资开发(集团)有限公司招聘笔试参考题库附带答案详解
- HSE基础知识培训
- 企业地震应急预案样本(三篇)
- 安徽省蚌埠市2023-2024学年高一上学期期末考试 地理 含答案
- GB/T 5483-2024天然石膏
- 2024年度托管班二人合伙协议书3篇
- 山东中医药大学中西医临床(专升本)学士学位考试复习题
- 2024-2025学年九年级语文上册部编版期末综合模拟试卷(含答案)
- 乡村振兴暨干部素质提升培训班学习心得体会
- IATF16949:2024标准质量手册
- 饲料加工混凝土施工合同
评论
0/150
提交评论