版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
,在android在做ssl開發(fā)時,要注意的是android端與服務(wù)器端的keystore類型是不一致的:如如下代碼:,在androidKeyStoretrustStore=KeyStore.getInstance(KeyStore.getDefaultType());中代碼默認(rèn)拿到的是android的BKS類型.所以需要相應(yīng)的工具轉(zhuǎn)換:資料如下:AndroidSDK在進(jìn)行https聯(lián)機(jī)時,對于自簽署的憑證是會拒絕聯(lián)機(jī)的,會得到Nottrustedservercertificate的例外。如果使用HttpsURLConnection來聯(lián)機(jī),網(wǎng)絡(luò)上可以找到一些破解方法,在此不多談。使用apachehttpclient其實(shí)執(zhí)行效率比較差一點(diǎn),但是他最大的好處就是有內(nèi)建的機(jī)制儲存cookie,并且也可以跟隨server作自動轉(zhuǎn)址。網(wǎng)絡(luò)上數(shù)據(jù)比較多的是httpclient3.x版,Android使用httpclient4(而且還有些實(shí)作被拿掉)唯一找到比較可信的來源是apachehttpclient官方的example。節(jié)錄重點(diǎn)段落如下:KeyStoretrustStore=KeyStore.getInstance(KeyStore.getDefaultType());FileInputStreaminstream=newFileInputStream(newFile(〃my.keystore"));try(trustStore.load(instream,"nopassword".toCharArray());}finally(instream.close();}8.SSLSocketFactorysocketFactory=newSSLSocketFactory(trustStore);10.Schemesch=newScheme("https",socketFactory,443);11.httpclient.getConnectionManager().getSchemeRegistry().register(sch);KeyStoretrustStore=KeyStore.getInstance(KeyStore.getDefaultType());FileInputStreaminstream=newFileInputStream(newFile("my.keystore"));try(trustStore.load(instream,"nopassword".toCharArray());}finally(instream.close();}8.9.SSLSocketFactorysocketFactory=newSSLSocketFactory(trustStore);10.Schemesch=newScheme(〃https〃,socketFactory,443);11.httpclient.getConnectionManager().getSchemeRegistry().register(sch);直接把這段拿去用當(dāng)然只有一個死字。本來看討論以為是要制造一個假的空憑證騙過httpclient,從Android文件系統(tǒng)有點(diǎn)微妙開始改來改去,一連串不同的例外或直接crash就不多談了。解決了檔案路徑,到底有沒有建立等等方面的問題之后才終于發(fā)現(xiàn),假憑證是不行的…所以首先,開啟你PC或Mac上的瀏覽器連上目標(biāo)網(wǎng)站,從憑證管理的地方把該網(wǎng)站的憑證匯出。每個瀏覽器做法都不同,請各位發(fā)揮正常工程師的水平做完這件事。以Firefox為例,找到site名后選匯出,多半是會得到一個檔名為your_site_name.crt的X509(PEM)憑證檔。為了之后使用方便,先把這檔案復(fù)制一份并把檔名改為your_site_name.pem。將這個憑證格式從PEM轉(zhuǎn)為BKS格式。這是關(guān)鍵性的一步啊。KeyStoretrustStore=KeyStore.getInstance(KeyStore.getDefaultType());KeyStoretrustStore=KeyStore.getInstance(KeyStore.getDefaultType());這行中的getDefaultType到底會get到什么type呢?答案:在Android中是BKS。有J2ME經(jīng)驗(yàn)的人會想說,我看多半是跟J2ME一樣的SunJKS格式吧,而且,我不要用getDefaultType就好了,我可以自己指定為PEM,JKS格式啊。是的,你可以。只是你會得到錯誤訊息說KeyStoreJKSimplementationnotfound。測了半天,看起來Android的httpclient只吃BKS就對了,其他都沒實(shí)作。那格式要怎么轉(zhuǎn)?根據(jù)網(wǎng)絡(luò)上找到的數(shù)據(jù),可以使用KeyToolIUI這個Java工具。打開后從接口選create—KeyStore,格式選BKS,自己命名一下,要不要設(shè)密碼都可。接著選import—Keystore'sentry—Trustedcertificate一Regularcertificate。Source的部分選PEM并選到剛剛瀏覽器得到的那個檔,Target當(dāng)然選BKS和剛create出來的檔。按OK之后會跳出Entries窗口,下方提示你enternewalias,隨便取個名字后ok連打,順利的話你應(yīng)該就會有一個your_keystore.bks之類的檔案了。要把憑證檔放在Androidapp能讀到的地方,做法有兩種,放在SDcard中,或直接放在resources中。[方案一]放在SDcard的情形:首先仿真器要掛上SDcard,這在Eclipse用AVD工具產(chǎn)生avd時就可以順便指定SD了。如果習(xí)慣用指令的話,也可以用如下指令產(chǎn)生image并mount上:$mksdcard512Mmy_sdcard.so$emulator-sdcard./my_sdcard.so再來要把憑證檔copy到SDcard中,目前只知道指令的做法:$adbpushfile_path/your_keystore.bks/sdcard如果有顯示類似ftp傳輸速度之類的訊息應(yīng)該就是成功了。接著把a(bǔ)ndroid程序代碼中檔案部分改一改viewplaincopytoclipboardprint?FileInputStreaminstream=newFileInputStream(newFile("/sdcard/your_keystore.bks〃));...trustStore.load(instream,null);viewplaincopytoclipboardprint?FileInputStreaminstream=newFileInputStream(newFile("/sdcard/your_keystore.bks〃));...trustStore.load(instream,null);如果沒設(shè)密碼,可以把keystoreload的第二個密碼參數(shù)改成null,有設(shè)的話當(dāng)然就把“nopassword”改成你的密碼?;旧线@樣應(yīng)該就大功告成了。[方案二]再講講憑證放在resources的方法。首先把檔案復(fù)制到項(xiàng)目下的res/raw/your_keystore.bks。Eclipse沒有錯誤的話就ok,否則多半是你文件名不合規(guī)格,稍微改改。接著取用方法是把a(bǔ)ndroid程序代碼改成:1.InputStreaminstream=getResources().openRawResource(R.raw.your_keystore);1.InputStreaminstream=getResources().openRawResource(R.raw.your_keystore);其它同SDcard。還有一個地方要注意,就是SSLport。viewplaincopytoclipboardprint?1.Schemesch=newScheme(〃https〃,socketFactory,443);viewplaincopytoclipboardprint?1.Schemesch=newScheme(〃https〃,socketFactory,443);如果你要連的網(wǎng)站不是用port443,這邊請記得改掉。另外如果要使用檔案放在resources的做法,getResources()應(yīng)該只能在Activityclass中執(zhí)行,如果另外包裝聯(lián)機(jī)類別的話請不要直接服用上面的程序代碼,要自行從context抓到資源再傳過去。在生成SSLkeystore時,注意CN也就是需要填寫資料的第一項(xiàng)頒發(fā)者或授權(quán)者或姓氏這一項(xiàng),請?zhí)顚懹蛎蛘絀P生成一般命令:1、用JDK的keytool生成密鑰storekeytool-genkey-aliasmykey-keystoresrvstore輸入密碼(程序中密碼為‘123456’)和相應(yīng)的證書信息2、從srvstore中導(dǎo)出證書keytool-export-aliasmykey-filesrvcert.crt-keystoresrvstore輸入剛才上面設(shè)置的密碼3、將證書導(dǎo)到公鑰中keytool-import-aliasmytrust-filesrvcert.crt-keystoresrvtrust輸入公鑰的密碼(程序中密碼為‘123456’)需要注意的是:一、android3.0以上版本對網(wǎng)絡(luò)訪問控制變得嚴(yán)格了,需要在Activity中加入如下代碼才可正常使用httclient或httpurlconnetion連線:StrictMode.setThreadPolicy(newStrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork()//or.detectAll()foralldetectableproblems.penaltyLog().build());StrictMode.setVmPolicy(newStrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());二、android模擬器需要上網(wǎng)時,需要從命令行啟動。(如有代理設(shè)置)下面是簡單的批處理setpath=E:\SDK\android-sdk_r11-windows\toolsemulator@android3.1-http-proxyproxy.cmcc:8080三、在做android開發(fā)時進(jìn)行上網(wǎng)連線時必須在AndroidManifest.xml文件中加入如下代碼:<uses-permissionandroid:name="android.permission.INTERNET"/>設(shè)置上網(wǎng)訪問權(quán)限.四、在開發(fā)android項(xiàng)目時,注意版本問題。盡量不要以最新的版本開發(fā),會導(dǎo)致應(yīng)用與手機(jī)系統(tǒng)不兼容,在工程中更換版本時可以直接修改:perties文件中的target=android-8和AndroidManifest.xml文件中的<uses-sdkandroid:minSdkVersion="8"/>部分。五、在開發(fā)android工程時,需要注意線程的控制,如發(fā)送請求或進(jìn)行流操作時需要涉及到多線程的概念。如果寫的代碼是單線程的,那么在等待響應(yīng)時系統(tǒng)UI可能會報出強(qiáng)行關(guān)閉或等待等,導(dǎo)致死機(jī)現(xiàn)象。所以這時就引入了Handler的概念。具體資料如下:、八、?刖言學(xué)習(xí)android一段時間了,為了進(jìn)一步了解android的應(yīng)用是如何設(shè)計開發(fā)的,決定詳細(xì)研究幾個開源的android應(yīng)用。從一些開源應(yīng)用中吸收點(diǎn)東西,一邊進(jìn)行量的積累,一邊探索android的學(xué)習(xí)研究方向。這里我首先選擇了jwood9關(guān)鍵d詞^血0「項(xiàng)目。本文將把研究的內(nèi)容筆記整理,建立一個索引列表。Android.os.Handler涉及較多的知識點(diǎn),我把一些關(guān)鍵詞列舉在下面,將主要介紹Handler:android.os.Handler、android.os.Handler.CallbackLooperThreadle、RunnableMessage、Messagequeueandroid.os.HandlerHandler在android里負(fù)責(zé)發(fā)送和處理消息。它的主要用途有:1)按計劃發(fā)送消息或執(zhí)行某個Runnanble(使用POST方法);2)從其他線程中發(fā)送來的消息放入消息隊(duì)列中,避免線程沖突(常見于更新UI線程)默認(rèn)情況下,Handler接受的是當(dāng)前線程下的消息循環(huán)實(shí)例(使用Handler(Looperlooper)、Handler(Looperlooper,Handler.Callbackcallback)可以指定線程),同時一個消息隊(duì)列可以被當(dāng)前線程中的多個對象進(jìn)行分發(fā)、處理(在UI線程中,系統(tǒng)已經(jīng)有一個Activity來處理了,你可以再起若干個Handler來處理)。在實(shí)例化Handler的時候,Looper可以是任意線程的,只要有Handler的指針,任何線程也都可以sendMessage。Handler對于Message的處理不是并發(fā)的。一個Looper只有處理完一條Message才會讀取下一條,所以消息的處理是阻塞形式的(handleMessage()方法里不應(yīng)該有耗時操作,可以將耗時操作放在其他線程執(zhí)行,操作完后發(fā)送Message(通過sendMessges方法),然后由handleMessage()更新UI)。
倒計時程序利用Timer編寫一個倒計時程序,程序使用Timer和TimerTask來完成倒計時,同時使用sendMessages方法發(fā)送消息,然后在HanleMessage里更新UI。Activity布局:[=]|「Layout<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_gravity="center"android:id="@+id/txt"/><Buttonandroid:id="@+id/btnStartTime"android:text="開始計時"android:layout_width="80dip"android:layout_height="wrap_content"></Button><Buttonandroid:id="@+id/btnStopTime"android:text="停止計時"android:layout_width="80dip"android:layout_height="wrap_content"/><SeekBarandroid:id="@+id/SeekBar01"android:layout_width="match_parent"android:layout_height="wrap_content"></SeekBar></LinearLayout>
這里使用TextView來顯示倒計時的時間變化,兩個按鈕用于控制時間的開始和停止。SeekBar主要是用于查看線程是否被阻塞(阻塞時無法拖動)。日onCreate@OverridepublicvoidonCreate(BundlesavedInstanceState)(super.onCreate(savedInstanceState);setContentView(R.layout.main);txt=(TextView)findViewById(R.id.txt);btnStart=(Button)findViewById(R.id.btnStartTime);btnStop=(Button)findViewById(R.id.btnStopTime);Log.d("ThreadId","onCread:"+String.valueOf(Thread.currentThread().getId()));myHandler=newHandler(this);btnStart.setOnClickListener(this);btnStop.setOnClickListener(this);}在onCreate方法中初始化元素個元素,myHandler=newHandler(this);調(diào)用的是Handler(Handler.Callbackcallback)構(gòu)造函數(shù),在回調(diào)方法callback中對發(fā)送來的消息進(jìn)行處理(這樣我們就不必使用內(nèi)部類的寫法來重寫HandleMessage()方法了),因此Activity必須實(shí)現(xiàn)android.os.Handler.Callback接口。我們還在將onCreate方法的ThreadId記錄在了Log中用以和消息發(fā)送、處理時所作的線程進(jìn)行比較。日I發(fā)送消息@OverridepublicvoidonClick(Viewv)(switch(v.getId())(caseR.id.btnStartTime:startTimer();break;caseR.id.btnStopTime:timer.cancel();break;
}privatesynchronizedvoidstartTimer()(timer=newTimer();//TimerTaskupdateTimerValuesTask=newTimerTask()(//?Override//publicvoidrun()(//updateTimerValues();//}////};//自定義的CallBack模式。Task繼承自TimerTaskTaskupdateTimerValuesTask=newTask(this);timer.schedule(updateTimerValuesTask,1000,1000);}//執(zhí)行耗時的倒計時任務(wù)。privatevoidupdateTimerValues()(total;Log.d(〃ThreadId〃,"send:"+String.valueOf(Thread.currentThread().getId()));Messagemsg=newMessage();Bundledate=newBundle();//存放數(shù)據(jù)date.putInt("time”,total);msg.setData(date);msg.what=0;myHandler.sendMessage(msg);//另一種寫法//////////////Bundledate=newBundle();//存放數(shù)據(jù)date.putInt("time”,total);msg.setData(date);
//msg.what=0;//msg.sendToTarget()…epublicvoidTaskRun()(實(shí)現(xiàn)Button按鈕的事件處理以此進(jìn)入倒計時操作。這里使用的Timer來執(zhí)行定時操作(其實(shí)我們完全可以另起一個線程)。Task類繼承了TimerTask類,里面增加了一個任務(wù)處理接口來實(shí)現(xiàn)回調(diào)模式,應(yīng)此Activity需要實(shí)現(xiàn)該回調(diào)的接口ITaskCallBack(這樣做是因?yàn)槲冶容^不喜歡內(nèi)部類的編寫方法)。日ICallBack接口和Task類publicinterfaceITaskCallBack(voidTaskRun();}publicclassTaskextendsTimerTask(privateITaskCallBackiTask;publicTask(ITaskCallBackiTaskCallBack)(super();iTask=iTaskCallBack;}publicvoidsetCallBack(ITaskCallBackiTaskCallBack)(iTask=iTaskCallBack;
—publicvoidrun()(//TODOAuto-generatedmethodstubiTask.TaskRun();這是Java的回調(diào)函數(shù)的一般寫法。日實(shí)現(xiàn)CallBack/***實(shí)現(xiàn)消息處理*/@OverridepublicbooleanhandleMessage(Messagemsg)(switch(msg.what)(case0:Bundledate=msg.getData();txt.setText(String.valueOf(date.getInt("time")));Log.d("ThreadId","HandlerMessage:"+String.valueOf(Thread.currentThread().getId()));Log.d("ThreadId","msgDate:"+String.valueOf(date.getInt("time")));break;}returnfalse;}可以看到實(shí)現(xiàn)android.os.Handler.Callback接口,其實(shí)就是對handleMessage()方法進(jìn)行重寫(和內(nèi)部類的一個區(qū)別是,內(nèi)部類的返回值是Void)。
運(yùn)行結(jié)果TijaetagMessage[板二二ThreadIdcuiCrea.d:109...ThreadIdsend:809...ThreadIdHand1erMessage:109...ThreadIdULsgDate:5909...ThreadIdsend:909...ThreadIdHand1erMessage:109...ThreadIdULsgOaitB:5809...ThreadIdsend:809...ThreadIdHand1erMessage:109...ThreadIdiiLSQDa.te:5709...ThreadIdsend;509...ThreadIdHand1erMessage:103...ThreadIdULEgDate:5609...|-||-|ThreadIdmi】-risend:8Ti-itir■可以看到在onCreate方法中線程的ID是1(UI線程)這與HandlerMessage進(jìn)行消息處理時是所作的線程ID是一樣的,而消息發(fā)送的線程ID則為8非UI線程。使用Threadle進(jìn)行實(shí)現(xiàn)日Activity類publicclassThreadHandlerrActivityextendsActivityimplementsCallback,OnClickListener(privateTextViewtxt;privateButtonbtnStart,btnStop;privateHandlermyHandler;privateTimerThreadtimerThread;privateintTotal=30;/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState)(super.onCreate(savedlnstanceState);setContentView(R.layout.main);txt(TextView)findViewByld(R.id.txt);txt(TextView)findViewByld(R.id.txt);btnStart(Button)findViewByld(R.id.btnStartTime);btnStartbtnStop=(Button)findViewByld(R.id.btnStopTime);Log.d("ThreadId","onCread:"+String.valueOf(Thread.currentThread().getId()));myHandler=newHandler(this);btnStart.setOnClickListener(this);btnStop.setOnClickListener(this);}/***實(shí)現(xiàn)消息處理*/@OverridepublicbooleanhandleMessage(Messagemsg)(switch(msg.what)(case0:Bundledate=msg.getData();txt.setText(String.valueOf(date.getInt("time")));Log.d("ThreadId","HandlerMessage:"+String.valueOf(Thread.currentThread().getId()));Log.d("ThreadId","msgDate:"+String.valueOf(date.getInt("time")));break;}returnfalse;}@OverridepublicvoidonClick(Viewv)(switch(v.getId())(caseR.id.btnStartTime://自定義的線程timerThread=newTimerThread(myHandler,60);timerThread.start();break;caseR.id.btnStopTime:timerThread.stop();//timerThread.destroy()}break;日I自定義的線程類*火*自定義的線程類,通過傳入的Handler,和Total定期執(zhí)行耗時操作*@authorlinzijun**/publicclassTimerThreadextendsThread(publicintTotal=60;publicHandlerhandler;/***初始化構(gòu)造函數(shù)@parammhandlerhandler用于發(fā)送消息@paramtotal總周期*/publicTimerThread(Handlermhandler,inttotal)(super();handler=mhandler;Total=total;}@Override
publicvoidrun()(while(true)(Total--;if(Total<0)break;try(Thread.sleep(1000);}catch(InterruptedExceptione)(//TODOAuto-generatedcatchblocke.printStackTrace();}Messagemsg=newMessage();Bundledate=newBundle();//存放數(shù)據(jù)date.putInt("time",Total);msg.setData(date);msg.what=0;Log.d("ThreadId","Thread:"+String.valueOf(Thread.currentThread().getId()));handler.sendMessage(msg);}super.run();}}關(guān)于了POST類,也可以直接實(shí)現(xiàn)Runnable接口。Post的各種方法是把一個Runnable發(fā)送給消息隊(duì)列,它將在到達(dá)時進(jìn)行處理。日POST
publicclassPostHandlerextendsActivityimplementsOnClickListener,Runnable(privateTextViewtxt;privateButtonbtnStart,btnStop;privateHandlermyHandler;privateTimertimer;privateinttotal=60;@OverrideprotectedvoidonCreate(BundlesavedInstanceState)(//TODOAuto-generatedmethodstubsuper.onCreate(savedInstanceState);setContentView(R.layout.main);txt=(TextView)findViewById(R.id.txt);btnStart=(Button)findViewById(R.id.btnStartTime);btnStop=(Button)findViewById(R.id.btnStopTime);Log.d("ThreadId","onCread:"+String.valueOf(Thread.currentThread().getId()));myHandler=newHandler()(@OverridepublicvoidhandleMessage(Messagemsg)(switch(msg.what)(case0:Bundledate=msg.getData();txt.setText(String.valueOf(date.getInt("time")));Log.d("ThreadId","HandlerMessage:"+String.valueOf(Thread.currentThread().getId()));Log.d("ThreadId","msgDate:"+String.valueOf(date.getInt("time")));break;
btnStop.setOnClickListener(this);publicvoidonClick(Viewv)(switch(v.getId())(caseR.id.btnStartTime://myHandler.post(this);myHandler.postDelayed(this,1000);break;caseR.id.btnStopTime:}break;@Overridepublicvoidrun()(while(true)total--;if(total<0)break;try(Thread.sleep(1000);}catch(InterruptedExceptione)(//TODOAuto-generatedcatchblock}…―Messagemsg=newMessage();
Bundledate=newBundle();//存放數(shù)據(jù)date.putInt("time",total);msg.setData(date);msg.what=0;Log.d("ThreadId”,"POST:"+String.valueOf(Thread.currentThread().getId()));myHandler.sendMessage(msg);Log.d("ThreadId","Thread:"+String.valueOf(Thread.currentThread().getId()));}}}使用POST的方式是將Runnable一起發(fā)送給處理的線程(這里為UI),如果Runnable的操作比較耗時的話那線程將進(jìn)入阻塞狀態(tài)??梢钥吹较冗\(yùn)行Runnable的Run方法然后在進(jìn)入HandleMessage()。我還嘗試了另一種寫法,將TimerThreadPOST過去,運(yùn)行結(jié)果是一樣的。日代碼packagezijunlin.me;importjava.util.Timer;importandroid.app.Activity;importandroid.os.Bundle;importandroid.os.Handler;importandroid.os.Message;importandroid.util.Log;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;importandroid.widget.TextView;publicclassPostHandlerextendsActivityimplementsOnClickListener,Runnable(
privateTextViewtxt;privateButtonbtnStart,btnStop;privateHandlermyHandler;privateTimertimer;privateinttotal=60;privateTimerThreadtimerThread;@OverrideprotectedvoidonCreate(BundlesavedInstanceState)(//TODOAuto-generatedmethodstubsuper.onC
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 華北理工大學(xué)冀唐學(xué)院《網(wǎng)絡(luò)信息安全》2023-2024學(xué)年第二學(xué)期期末試卷
- 淮陰工學(xué)院《虛擬交互設(shè)計》2023-2024學(xué)年第二學(xué)期期末試卷
- 臨夏現(xiàn)代職業(yè)學(xué)院《行政管理專業(yè)導(dǎo)論》2023-2024學(xué)年第二學(xué)期期末試卷
- 朔州陶瓷職業(yè)技術(shù)學(xué)院《職業(yè)素養(yǎng)與商務(wù)禮儀》2023-2024學(xué)年第二學(xué)期期末試卷
- 濰坊醫(yī)學(xué)院《政府與企業(yè)》2023-2024學(xué)年第二學(xué)期期末試卷
- 西南科技大學(xué)《商業(yè)智能與》2023-2024學(xué)年第二學(xué)期期末試卷
- 西安美術(shù)學(xué)院《體育-臺球(三)》2023-2024學(xué)年第二學(xué)期期末試卷
- 寧夏大學(xué)新華學(xué)院《數(shù)字化學(xué)習(xí)資源設(shè)計與制作》2023-2024學(xué)年第二學(xué)期期末試卷
- 二零二五年度茶葉店茶藝師培訓(xùn)與派遣合同
- 二零二五年度醫(yī)療責(zé)任保險合同嚴(yán)格責(zé)任條款
- 密封條模板大全
- 頁眉和頁腳基本知識課件
- 《賣火柴的小女孩》的語文說課課件
- ST語言編程手冊
- 經(jīng)濟(jì)數(shù)學(xué)基礎(chǔ)(高職)全套教學(xué)課件
- 世界教育思想文庫:我們?nèi)绾螌W(xué)習(xí):全視角學(xué)習(xí)理論
- 《數(shù)字經(jīng)濟(jì)學(xué)》 課件 賈利軍 專題3:數(shù)字時代下社會總資本再生產(chǎn)研究;專題4:數(shù)字貨幣與數(shù)字金融研究
- 中小學(xué)音樂課上的合唱訓(xùn)練
- 《國有企業(yè)采購操作規(guī)范》【2023修訂版】
- 基于大單元的小學(xué)數(shù)學(xué)“教學(xué)評”一體化內(nèi)涵及實(shí)踐
- 制程工程師年終總結(jié)匯報
評論
0/150
提交評論