第一篇:江西理工大學安卓Android期末考試2018
1.在 android 中使用 RadioButton 時,要想實現互斥的選擇需要用的組件是 ? A、ButtonGroup C、CheckBox
B、RadioButtons D、RadioGroup 2.關于 Handler 的說法正確的是()A、它實現不同線程間通信的一種機制 B、它避免了新線程操作 UI 組件 C、它采用棧的方式來組織任務的 D、它可以屬于一個新的線程
3.下列哪個可做EditText編輯框的提示信息? A、android:inputType C、android:digits
B、android:text D、android:hint 4.退出Activity對一些資源及狀態的操作保存,可在生命周期的哪個函數中進行。()A、onPause()B、onCreate()C、onResume()D、onStart()5.Android項目工程下面的assets目錄的作用是什么?()
A、放置應用到的圖片資源Res/drawable。
B、主要放置一些文件資源,這些文件會被原封不動打包到apk里面
C、放置字符串,顏色,數組等常量數據 res/values
D、放置一些與 UI 相應的布局文件,都是 xml 文件 res/layout
6.Intent的作用是()
A、intent是連接四大組件的紐帶,可以實現界面間切換,可以包含動作和動作數據。
B、是一段長的生命周期,沒有用戶界面的程序,可以保持應用在后臺運行,而不會因 為切換頁面而消失。
C、實現應用程序間的數據共享。D、處理一個應用程序整體性的工作。
7.下列哪個是AbsoluteLayout中特有的屬性?()A、android:layout_height B、android:layout_x
C、android:layout_above D、android:layout_toRightOf 8.在手機開發中常用的數據庫是()
A、sqlLite
B、Oracle
C、Sql Server
D、Db23
9.關于BroadcastReceiver的說法不正確的是()A、是用來接收廣播Intent的。
B、一個廣播Intent只能被一個訂閱了此廣播的BroadcastReceiver所接收。C、對有序廣播,系統會根據接收者聲明的優先級別按順序逐個執行接收者。D、接收者聲明的優先級別在
B 明顯錯誤,廣播可以被訂閱了該廣播的所有接受者接收。10.使用MediaPlayer播放保存在sdcard上的mp3文件時()A、需要使用MediaPlayer.create方法創建MediaPlayer。B、直接newMediaPlayer即可。
C、需要調用setDataSource方法設置文件源。D、直接調用start方法,無需設置文件源。
11.在android中使用RadioButton時,要想實現互斥的選擇需要用的組件是()A、ButtonGroup B、RadioButtons C、CheckBox D、RadioGroup 12.在多個應用中讀取共享存儲數據時,需要用到的query方法,是哪個對象的方法?()A、ContentResolver
C、Cursor
個方法。
2、使用ContentResolver是用來操作數據的。貼一張李剛的《瘋狂Android講義》第9章9.2開頭對這部分ContentResolver的原話.B、ContentProvider D、SQLiteHelper
1、無論是ContentProvider還是ContentResolver都有各自的insert(),delte(),uapdte(),query(),四
注意紅色框起來的部分,調用的是ContentResolver的的的
3、再不行上一小段代碼證明吧:我們在avtivity的onCreate()里邊寫一句代碼就可以。把鼠標放在query()函數上,可以看到解釋的是ContentResolver的query(),不是ContentProvider的
13.內存監測工具DDMS中Log信息分為幾個級別?()
A、3
B、4
C、5
D、6 14.關于自定義Adapter的優化方法,我們通常采用三種方式,則以下能采用的是()A、復用布局視圖對象 B、圖片異步加載 C、組件重用 D、創建一個內部類 應該是不能采用的是什么:B、圖片異步加載 15.在多個應用中讀取共享存儲數據時,需要用到的query方法,是哪個對象的方法?()
A、ContentResolver C、Cursor
B、ContentProvider D、SQLiteHelper 16.在android中使用RadioButton時,要想實現互斥的選擇需要用的組件是()
A、ButtonGroup
C、CheckBox
B、RadioButtons
D、RadioGroup 17.能夠自動完成輸入內容的組件是()
A、TextView
B、EditText
D、AutoCompleteTextView C、ImageView
18.表示下拉列表的組件是()
A、Gallery
B、Spinner
C、GridView
D、ListView 19.在Activity中需要找到一個id是bookName的的TextView組件,下面哪種語句寫法是 正確的?()
A、TextView tv = this.findViewById(R.id.bookName);B、TextView tv =(TextView)this.findViewById(R.id.code);C、TextView tv =(TextView)this.findViewById(R.id.bookName);D、TextView tv =(TextView)this.findViewById(R.string.bookName);20.Android SDK中提供了一個什么處理圖片的工具解決不同屏幕分辨率適配的問題。()
A、Draw7-patch B、Draw8-patch C、Draw9-patch D、Draw10-patch
21.下列說法錯誤的是()A、Button是普通按鈕組件,除此外還有其他的按鈕組件。B、TextView是顯示文本的組件,TextView是EditText的父類。C、EditText是編輯文本的組件,可以使用EditText輸入特定的字符。D、ImageView是顯示圖片的組件,可以通過設置顯示局部圖片。一般來說android不能設置顯示圖片中的局部
22.Android API將什么以Content Provider的方式提供給開發者,使其可以對通訊錄進 行一系列操作?()
A、文件瀏覽器 B、數據庫文件 C、系統通訊錄 D、數據表 23.關于BroadcastReceiver的說法不正確的是()
A、是用來接收廣播Intent的。
B、一個廣播Intent只能被一個訂閱了此廣播的BroadcastReceiver所接收。C、對有序廣播,系統會根據接收者聲明的優先級別按順序逐個執行接收者。D、接收者聲明的優先級別在
24.Android API 提供了一系列的類來實現或操作Content Provider相關功能,以下未涉及到的一類是()
A、Content Provider B、Content Resolver C、ContentValues D、Content Changer 25.ArrayAdapter通常用什么構造方法進行構建?()
A.ArrayAdapter
26.表示下拉列表的組件是()
A、Gallery
B、Spinner
C、GridView
D、ListView 27.下列說法錯誤的是()A、Button是普通按鈕組件,除此外還有其他的按鈕組件。B、TextView是顯示文本的組件,TextView是EditText的父類。C、EditText是編輯文本的組件,可以使用EditText輸入特定的字符。D、ImageView是顯示圖片的組件,可以通過設置顯示局部圖片。28.能夠自動完成輸入內容的組件是()
A、TextView B、EditText C、ImageView D、AutoCompleteTextView
29、處理菜單項單擊事件的方法不包含()
A、使用onOptionsItemSelected(MenuItem item)響應。
B、使用onMenuItemSelected(int featureId,MenuItem item)響應。C、使用onMenuItemClick(MenuItem item)響應。D、使用onCreateOptionsMenu(Menu menu)響應。1.列舉Android系統中的五個進程優先級,并作出詳細介紹。答:前臺進程>可見進程>服務進程>后臺進程>空進程。(1)前臺進程,表明用戶正在與該進程進行交互操作。
(2)可見進程,指部分程序界面能夠被用戶看見,卻不在前臺與用戶進行交互,不響應界面事件的進程。
(3)服務進程,指包含已啟動服務的進程,特點是沒有用戶界面,在后臺長期運行。(4)后臺進程,指不包含任何已經啟動的服務,而且沒有用戶可見的Activity進程。(5)空進程,不持有任何活動組件的進程。
2.介紹Android系統有四個重要的組件。
答:Android系統的四種基本組件Activity、Service、Broadcase Receiver和Content Provider。(1)Activity是Android程序的呈現層,顯示可視化的用戶界面,并接收與用戶交互所產生的界面事件,用于提示用戶程序已經正常啟動。
(2)Service一般用于沒有用戶界面,但需要長時間在后臺運行的應用。(3)Broadcase Receiver是用來接受并響應廣播消息的組件。
(4)Content Provider是Android系統提供的一種共享數據的機制,應用程序可以通過ContentProvider訪問其他應用程序的私有數據。
3. 在Android生命周期過程中,Activity一般表現為哪4種狀態? 答:(1)活動狀態,完全能被用戶看到,與用戶進行交互的狀態。
(2)暫停狀態,Activity不處于用戶界面的最上層,已經失去了焦點,不能與用戶進行交互。
(3)停止狀態,Activity在界面上完全不能被用戶看到,保存了當前數據和UI狀態。(4)死亡狀態,Activity被系統銷毀。
4.Android系統中Intent的定義和用途?Intent啟動Activity方式有哪兩種? 定義:為其他組件提供交互能力,將一個組件的數據和動作傳遞給另一個組件。用途:1)啟動Activity和Service 2)發布廣播消息
啟動方式:顯式調用,指明調用Activity的Class類;隱式調用,無需指明具體啟動哪一個Activity,選擇權由Android系統和最終用戶類似決定。
5.使用Service的方式有哪兩種?描述Service的生命周期。Context.startService()方式啟動 Context.bindService()方式啟動
6.SQLite數據庫體系結構中最核心的部分是什么?
答:虛擬機/虛擬數據庫引擎。完成與數據操作相關的全部操作并且是客戶與儲存之間信息進行交換的中間單元。
7.ContentProvider是應用程序之間一種什么樣的接口機制?通過繼承ContentProvider類可以創建一個新的數據提供者,請簡述該過程。
答:ContentProvider為不同的軟件之間數據共享,提供統一的接口。
1)定義URI,即統一資源標識符,作用是唯一標識 Content Provider 及其中的數據。2)設置MIME數據類型,作用是指定某個擴展名的文件用某種應用程序來打開。3)實現初始化、查詢、插入、更新、刪除、返回這幾個方法。onCreate():初始化 provider insert():插入數據到 provider
query():查詢數據
update():更新 provider 的數據
delete():刪除 provider 中的數據 getType():返回 provider 中的數據的 MIME 類型 8.系統和用戶之間進行信息交換的媒介是什么?實現什么信息的轉換? 答:用戶界面。實現信息的內部形式與人類可以接受形式之間的轉換。
9.Android中使用什么接口定義遠程服務的窗口?服務接口文件的擴展名是什么? 答: AIDL
10.簡述Android系統三種菜單的特點及使用方式。
(1)選項菜單:可分為圖標菜單和擴展菜單,圖標菜單的子項最多是六個,支持顯示圖標,不支持單選框和復選框;而當子項多于六個時,采用擴展菜單,擴展菜單的子項是垂直排列,支持單選框和復選框,不支持顯示圖標。第一次啟動選項菜單時,只需要調用一次onCreateMenu函數。
(2)子菜單:能夠展示更加詳細的信息,通過addSubMenu函數增加子菜單,但不支持嵌套。
(3)快捷菜單;點擊界面元素超過2秒后,則啟動該界面元素的快捷菜單。每次啟動時都要調用一次onCreateMenu函數。
11.編寫一個Android程序,使用AsyncTask實現獲取網頁html代碼,并且使用TextView 顯示。
public class MainActivity extends Activity {
// 定義組件
private EditText edtURL;private TextView edtHTTP;private Button btnRequest;
private String strURL;// 用于存儲網站地址
private MyTask myTask;@Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);
// 初始化組件
edtURL =(EditText)findViewById(R.id.edturl);edtHTTP =(EditText)findViewById(R.id.edthttp);.aidl btnRequest =(Button)findViewById(R.id.requesthtml);
// 監聽獲取html代碼的按鈕
btnRequest.setOnClickListener(new View.OnClickListener(){
@Override public void onClick(View v){ if(!(strURL = edtURL.getText().toString()).equals(“")){ //實例myTask對象
myTask = new MyTask(edtHTTP);myTask.execute(strURL);}
} });} }
public class MyTask extends AsyncTask
private TextView edtHTTP;// 用于顯示HTML代碼 private StringBuffer sbHTML;// 用于儲存HTML代碼
public MyTask(TextView edtHTTP){
this.edtHTTP = edtHTTP;sbHTML = new StringBuffer();}
/** * doInBackground方法內部執行后臺任務,不可在此方法內修改UI */ @Override protected StringBuffer doInBackground(String...params){ // 初始化HTTP的客戶端
HttpClient hc = new DefaultHttpClient();// 實例化HttpGet對象
HttpGet hg = new HttpGet(params[0]);
try { // 讓HTTP客戶端已Get的方式請求數據,并把所得的數據賦值給HttpResponse的對象
HttpResponse hr = hc.execute(hg);// 使用緩存的方式讀取所返回的數據
BufferedReader br = new BufferedReader(new InputStreamReader(hr.getEntity().getContent()));
// 讀取網頁所返回的HTML代碼 String line = ”“;sbHTML = new StringBuffer();while((line = br.readLine())!= null){ sbHTML.append(line);}
return sbHTML;} catch(IOException e){
edtHTTP.setText(”獲取網頁HTML代碼出錯!!“);} return null;}
/** * onPostExecute方法用于在執行完后臺任務后更新UI,顯示結果 */ @Override protected void onPostExecute(StringBuffer result){ // 判斷是否為null,若不為null,則在頁面顯示HTML代碼 if(result!= null){ edtHTTP.setText(result);} super.onPostExecute(result);} } 12.編寫一個程序,輸入兩個整數值,點擊求和按鈕后顯示兩個數的和。MainActivity.java public class MainActivity extends AppCompatActivity {
EditText one,two;Button add;TextView show;
@Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);one = findViewById(R.id.one);two = findViewById(R.id.two);add = findViewById(R.id.add);show = findViewById(R.id.show);
add.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v){ String first = one.getText().toString();String second = two.getText().toString();try { int add = Integer.parseInt(first)Integer.parseInt(second);show.setText(”兩數之和:“+ add);} catch(Exception e){ show.setText(”請輸入數字!“);} } });} }
+
13.編程實現具有“登錄按鈕”的主界面,點擊“登錄”按鈕后打開第二個Activity,第二個Activity上面顯示主界面輸入的用戶名和密碼,并定義返回鍵將用戶名和密碼 傳遞回主頁面的Acivity中。MainActivity.java public class MainActivity extends AppCompatActivity {
EditText name,password;Button register;TextView show;
@Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);
name = findViewById(R.id.name);password = findViewById(R.id.password);register = findViewById(R.id.register);show = findViewById(R.id.show);
register.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v){ String message = name.getText().toString()+ ”n“ + password.getText().toString();
Intent intent = new Intent(MainActivity.this, Second_Activity.class);intent.putExtra(”message“, message);startActivityForResult(intent,1);} });}
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data){ if(requestCode==1 && resultCode==2){ String result=data.getStringExtra(”data“);show.setText(result);} super.onActivityResult(requestCode, resultCode, data);} }
Second_Activity.java public class Second_Activity extends Activity{ Button back;TextView message;String send;
@Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.second_view);
back = findViewById(R.id.back);message = findViewById(R.id.message);
Intent intent = getIntent();String result = intent.getStringExtra(”message“);send = result;message.setText(result);
back.setOnClickListener(new View.OnClickListener(){
@Override public void onClick(View view){ Intent data = new Intent();data.putExtra(”data“, send);setResult(2,data);
finish();} });
} }
第二篇:安卓android課程設計報告
湘潭大學課程設計報告
課
程 課
題指
導
名
稱______手機安卓開發_______ 名
稱______天氣預報APP_______老
師______周唯___________
姓
名____黃柳________
學
號___2012600719_________ 班
級____12計2班________
小
組______棒棒糖_______ 時
間____2015年1月26 日_____
一、需求分析(一)引言
1.編寫目的
1.1 為用戶提供一個顯示天氣預報的軟件,可以根據百度地圖顯示用戶需求的城市位置,以及用圖標表示各城市對應的氣象信息,可以簡潔的表示出“晴、雨、雪”和“氣溫”氣象信息。
2.項目風險
2.1(項目風險識別是指找出影響項目目標順利實現的主要風險因素,并識別出這些風險究竟有哪些基本特征、可能會影響到項目的那些方面。)2.2 聯網收費視用戶電話運營商的收費標準決定
2.3 手機或者無線信號不好時,可能無法連接或更新天氣情況 3.預期讀者和閱讀建議
3.1 預期讀者:會使用已經安裝安卓系統的手機或者平板電腦及其他移動設備的用戶
3.2 閱讀建議:讀者應通過該文檔可以了解相關項目的需求分析、使用注意事項以及可能存在的風險
4.產品范圍
2.2 手機,平板電腦,MP4,導航儀,上網本,電紙書等使用安卓系統的數碼領域(二)綜合描述
1.產品的狀況
1.1 Android是一種以Linux為基礎的開放源代碼操作系統,主要使用于便攜設備。目前未有統一中文名稱,中國大陸地區較多人使用“安卓”或“安致”。Android操作系統最初由Andy Rubin開發,最初主要支持手機。2005年由Google收購注資,并組建開放手機聯盟開發改良,逐漸擴展到平板電腦及其他數碼領域上。我們開發的相關項目正是一個在安卓平臺上開發的軟件,可以用這個軟件來實現用戶在一些簡單的手持設備如手機或者平板電腦等上面及時的了解到用戶所在城市的天氣預報。
2.產品的功能
2.1 天氣信息獲取 2.2 天氣信息顯示 3.系統配置功能
3.1 用戶類和特性
安卓平臺用戶:安卓新用戶可以使用軟件來了解用戶所在城市的天氣預報。熟悉安卓平臺用戶還可以選擇對相關軟件的系統按自己的喜好進行配置并保留自己的個性化系統配置。
安卓軟件開發者:安卓軟件開發者(喜好者)可以通過相關的開源代碼來了解軟件運行的原理。
3.2 運行環境
軟件需要在支持安卓系統的可移動設備中正確安裝才能正常運行。安卓版本需在2.2及以上,同時建議用戶如果是在手機移動設備使用的話,需確保手機支持聯網服務。
3.3 設計和實現上的限制
Eclipse是開發相關應用軟件的首選集成開發環境,安卓開發環境首先需要安裝支持java應用軟件運行的java開發軟件包(即JDK),然后安裝集成開發環境Eclipse,最后安裝Android SDK的Eclipse的ADT插件。
Android SDK和Eclipse的ADT插件是必須使用的。
軟件支持高效、快速的數據存儲方式,包括快速數據存儲方式SharedPreferences、文件存儲和輕量級關系數據塊SQLite,可軟件可以使用適合的方法對數據進行進程保存和訪問。
3.4 假設和約束(依賴)
軟件必須在安卓系統下才可以正常運行,若需要獲取天氣更新或者是短信服務,需確保用戶的數碼設備支持聯網及短信服務。(三)外部接口需求 1 2 用戶的手機設備可以支持聯網。用戶界面 軟件接口
軟件提供輕量級的進程間通信機制Intent,實現跨進程組件通信。4 訪問硬件的API庫函數通訊接口
4.1 HTTP 協議:有多種接口可以調用你可以用Java類庫封裝的HttpConnection 或者用Apach的開源項目的 HttpGet 或者HttpPost,服務器端 需要 編寫 Serlvet來響應客戶端的請求。
4.2 Sokcet : 就是 服務器端 不斷監聽 雙方約定好的端口號,客戶端通過服務器IP去請求連接,連接成功后,得到Socket 的輸入輸出流,直接操作即可。(四)系統功能需求
天氣信息顯示和獲取
功能描述:需有一個顯示天氣情況的用戶界面,要求百度地圖顯示各城市位置(如:北京、長沙、廣州等3-5個城市),以及用圖標表示各城市對應的氣象信息,表示出“晴、雨、雪”和“氣溫”簡潔氣象信息。輸入輸出信息:
輸入:當觸摸某一城市對應的氣象圖標時,顯示該城市當天的溫度、濕度、風向和雨雪詳細天氣信息,并預報該城市后面幾天的氣象信息。
輸出:氣象信息的獲取,從百度上獲取天氣預報信息,這些天氣數據是通過后臺服務獲取的,這個后臺服務可以按照一定時間間隔,并將各城市的天氣信息保存到SQLite數據庫中。
二、概要設計
三、Ui界面
我們的ui界面秉承著清新的風格開發出來的。
整個軟件界面使用一個線性布局,讓所有的元素從屏幕上方向下填充,并給整個線性布局進行權重劃分。
線性布局的最上方是一個TextView,顯示當前城市的名字,接著往下是一個相對布局,相對布局的左側是天氣的圖片,右側是三個天氣相關的參數。
接著是一個線性布局,布局的左上方是三個TextView,分別顯示“預報”,“趨勢”,“指數”功能,通過點擊相應的TextView,下方的一個線性布局展現不同的功能。功能面板文字的下方是一個大的線性布局,用來顯示未來三天的天氣情況。在這個大的線性布局中,又含有三個小的線性布局,這三個小線性布局中包含了日期,天氣圖片和風力狀況等(這些控件從上到下垂直居中顯示)。
通過給整個XML文件中LinearLayout布局的的子級布局添加權重,讓各個部分從上到下有序的顯示,讓當前城市名稱在屏幕的上方顯示,功能面板位于屏幕下方顯示,以匹配不同尺寸屏幕,讓軟件的顯示效果更好。軟件的整體布局風格是清新,優美,大方。
四、功能設計
功能上實現實時的獲取天氣信息,獲取百度api返回數據,解析百度api返回的json數據,根據解析到的數據繪制氣溫趨勢圖,并將數據反饋到app上的相應的區域。通過使用ViewPager類,來實現天氣預報軟件中多個城市間的無縫頁面切換。由于組員都缺少JAVA開發經驗,對安卓開發也不熟悉,所以我們決定采用調用API的方法來實時獲取不同城市的天氣預報數據,在這次項目中我們將采用百度的車載API。通過HttpClient類和AsyncTask異步類來獲取網絡數據。最后通過Gson類來解析獲取的網絡數據,并給頁面中的所有的布局空間設置id,在AsyncTask得到網絡數據之后將這些數據同步到軟件界面上,呈現給用戶。
三、功能模塊
我主要負責監聽程序的設計,監聽用戶按鍵,并進行相應的動作。
只要用戶滑動面板,就切換到下一個城市,并獲得下一個城市的天氣數據,顯示在面板上。每隔15分鐘自動更新天氣數據。主要代碼如下:
下面的代碼處理網絡連接部分,用GSON解析網絡上獲得的Json網頁:
下面代碼訪問網絡:
四、心得體會
通過這個軟件的實現,我對Android編程有了更加濃厚的興趣,對Android中的常用類和接口有了進一步的認識。對編程有了一種新的看法,編程在我的學習中不再是那樣的枯燥無味,而是時時刻刻充滿驚喜。雖然這是一個挺小的項目但它對我在編程方面起到了一種激勵的作用。我會在此基礎上更加努力做出更好的程序。
第三篇:安卓(Android)游戲以及手機游戲開發的詳細流程
安卓(Android)游戲以及手機游戲開發的詳細流程【精華版】
>>首先說游戲設計部門
通常這是如下職位:游戲設計主負責(也有稱主策劃)執行游戲設計師(稱執行策劃):分劇情策劃,數據策劃,也有不分的,大家一起提高。輔助員(稱輔助策劃):做一些比較簡單的表據維護,資料收集。
工作職責:
游戲設計主負責人:主要負責游戲設計的整體把握、給大家安排工作,審核工作,提高部門人員士氣。,劇情策劃一般負責背景,任務等等故事性比較強的,要求文筆要好
數據策劃再細分,為規則和數據平衡,包括規則的描述,公式確定,數據表設定等等。輔助員,主要是收集資料,維護表格等等,比較不涉及核心的工作。*注:有一些公司或者團隊,在策劃崗位,還有新的崗位,如:
表現策劃:主要負責特效、動作、音效收集并提需求,部分如音效部分亦有策劃來完成。資源策劃:主要負責UI設計,模型相關配置,資源管理等等。
>>下面是程序部門
主程序與主設計師,是對游戲引擎最了解的人,以主程序為最強。主程的主要工作,安排程序部門工作,定游戲的數據結構,定一些主要方案的完成方法。
一般程序員,分服務器端與客戶端、服務器端程序,對于數據庫結構,數據傳輸、通訊方式等等。客戶端程序,對圖像及優化有研究的會易受重用。
>>美術部門
主美負責整體美術風格的把握 原畫繪制原畫交于3D
2D負責貼圖,游戲界面等的制作
3D負責3D建模,動作等方面工作
>>腳本與編輯器
在具體游戲實現時,越來越多的公司不會說把游戲中的數據寫在C++里,而是用“腳本與數據庫”的方式。
C++的作用是用來解釋腳本和調用數據庫的 在腳本中,寫上,if
{
player hp >=30%hpmax
add hp=hpmax
}
這里的東西是寫在腳本里的,C++就會解釋,player、hp、hpmax是什么,hp、hpmax對應數據庫是什么列主要的游戲內核是寫在C里的,腳本用來實現游戲具體的一些東西。如每個場景、每個NPC、每個道具都有可能有個腳本文件制定命令及數據一般由主程與主設計師一起來做,具體寫腳本,一般為游戲設計部門按規范做這個工作。
編輯器:是高于腳本的一個給游戲設計部門或是美術部門用的工作工具優點是使用簡單,界面化的東西,可以自動生成腳本。
缺點是,把一些比較活的東西,寫死到工具中了,將來要加功能改結構很麻煩 這些都是程序部門的工作
另外,在程序部門中主要交流就是服務器端與客戶端的。這實際就是說,一個游戲主體置放與傳輸的問題。
一般來說,一些音聲文件、圖像文件、大一些的文本都會放在客戶端,而數據庫,游戲的核心解釋在服務器端。
【游戲開發流程】
>>軟件:有兩部分。
1.編寫游戲引擎、建模:需要熟練掌握C/C++、Microsoft Develop Studio開發環境、使用SDK或者MFC、DirectX/OpenGL、SQL編程、SQLServer或Oracle數據庫配置。2.策劃、美工、音效:MAYA、3DMAX、PS(音效制作方面不熟,這方面無法提供)。流程:策劃——引擎——建模——美工——測試。
團隊:首先要組成一個由各功能小組核心構成的策劃組,負責構思整個游戲的內容架構。包括故事大綱,游戲風格,人物造型,操作模式,任務模式,裝備模式等等,以及程序編寫、美工貼圖能否實現等等,資金預算能否維持等等。
然后籌建各功能小組:主編程組,負責游戲引擎。建模組,負責編寫一個完整的世界,各種人物、怪等。美工組,負責包裝游戲。測試組,設置若干組服務器,對游戲進行測試。>>游戲設計部門:為最前期
立項
主要目的是描述項目的風格、主亮點、一些方方面面的規則,具體可能會涉的游戲資源(如多少主角,多少場景,多少NPC等等統計)
這個階段主要目的,是與投資人交流,描述清楚這個項目可不可以做,做了有什么好處,與其它同類游戲對比,競爭優劣勢的分析,種種設定因何這樣說服投資人,這個項目就可開做了。接下來與主美主程開會,就具體如何劃分數據結構,如果命名文件等等交流相關的開始進行。(注:這有個前提,游戲設計必須要前于另兩個部門。不能讓很多程序或是美術,都等著,這與成本有關)游戲設計這個部門,這時定了數據后,就開始分頭建表,游戲有多少會變動的數據就應該有多少表。如道具,NPC,場景、寵物,技能,ICON,特效,音樂,音效這些都要有表的。(注:這里說的變動只是人為的變動,是不是被動,級別這個就是被動的變動,不需要玩家等級表。)這時主策劃已經給大家一份總案了,這個總案中,比較清楚的告訴大家這個游戲有什么玩點,也就是模塊。(1)劇情設計師開始編世界背景世界觀。
(2)規則設計師開始與數據設計師一起一個一個分配著開始寫規則文檔。(3)輔助員也可以開始先確定一些道具,NPC的名字什么的(注:這些在主設計的審核下進行著)當場景美術描述表,NPC美術描述表,道具美術描述等東西出來了,確定后,就可以交給美術部門開始試著做。--(注:這時,美術部門應該也按投資人的要求確定了美術風格)
[注:策劃的工作一直先于其它幾個部門,完善表,寫全規則文檔,寫數據表(為將來寫腳本做好準備)等等] 美術部門的工作當做完一部分就可以交付程序部門了,這時部門的數據庫,數據結構也早搞定了,收到游戲資源,游戲規則,可以做一個簡單的版本出來了。首先按游戲設計,把操作、視角等東西,都搞順。這時,團隊中的人就可以都進來看看了。版本不斷更新內容,然后游戲開發這樣就一步步在開動起來了。這個過程中,需要不斷的反饋。
美術部門進到游戲里,發現做的東西不好看這時要返回去重做;
策劃部門如果數據不合理,要隨時調,同時,如果寫了模塊,交給程序部門,還要寫腳本,實現在游戲中,要去測試。
(1)如果是程序部門理解不清或是別的BUG要及時反饋;(2)如果是規則有問題,或是數據不合理,要自行調節;
(3)另外為了給將來游戲的宣傳推廣留好接口,對于每個模塊在游戲中,可以做什么活動等等都要有文檔描述。
附:名詞釋義
游戲引擎:不是一個軟件,更不是其它的什么東西,只是一段這個游戲能實現什么的中心代碼。這個代碼,也許可以做出很多東西,也許在這個基礎上,做出很好的花樣,但需要程序去挖掘,更需要游戲設計部門去了解。又常被稱作游戲平臺。
編輯器:位置要比腳本高一些的一個軟件。
它的作用就是生成腳本,但是因為寫死了,功能不能隨心所欲。優點是用著方便。
以下是游戲制作流程的簡單總結:
>>
一、計劃階段:首先,是項目計劃階段。
1、創意管理:第一步,是召開個會議,在會議中最常見的方法就是采取“頭腦風暴法”。每個人都必須拿出自己的建議和想法,之后大家一起進行討論。另外在會場內,會有專人進行會議記錄。而在項目開發的前期則會有市場調查。
2、撰寫草案:第二步,撰寫策劃草案,也叫意向書。撰寫策劃草案的目的在于,使得小組內每個成員對即將開發的項目有一個大體的認識,并且對目標進行明確。
3、市場分析:第三步,市場分析。決定了是否需要開發這個游戲。1)、目標客戶:最重要的一點是確定目標客戶。即該游戲是面向核心玩家,還是普通的大眾玩家。如果是面向核心玩家所開發的游戲,則需要游戲的難度更大一些;反之,如果是面向大眾玩家開發的游戲,則需要游戲的難度簡單一些。最好的方法是允許玩家自定義游戲的難度。2)、成本估算:以網游為例,包括以下幾個方面 ?服務器:運行網絡游戲所需花費的硬件方面的成本。成本中的大頭。大約占到總成本的40%左右。
?客服:屬于人力成本的范疇。網絡游戲不同于單機游戲的部分在于,其不同于單機游戲的“售后不理”的銷售模式。用戶在玩這個游戲之后,運營商需要不斷的提供更新和各種在線服務。
?社區關系專員:同上,屬于人力成本的范疇。同其他方面的花銷相比,這方面幾乎可以忽略不計。?開發團隊:人力成本,這方面花費的真正大頭在核心成員和天才制作人的薪資上。?管理:管理方面花費的成本,這方面成本較少。
?用戶帳號管理:發行成本的一部分,但也屬于運營的范疇。至于成本幾乎可以忽略不計。?辦公室、電腦、家具:這方面是大頭,不過這次花費之后,開發下部游戲時基本上花費就不需要或者很少花費了。
?帶寬:發行成本的一部分,但也屬于運營的范疇。成本也是極高的,當然各地可能都不一樣。
?網管:發行成本的一部分,同樣屬于運營成本的范疇。?其他雜費:雜七雜八的一些費用,包括水電費、燃氣費、可能還會包括買咖啡和茶葉的錢。?宣傳、廣告和推廣的費用:屬于運營成本。應該說最好的宣傳方法就是廣告,但各種廣告在花費上都不盡相同,這個就不細說了。
?客戶端:制作游戲客戶端、點卡、充值卡、印制游戲說明書、游戲包裝、游戲贈品一類的成本。
4、需求分析:第四步,撰寫需求分析書。這包括以下三個方面: 1)、美工需求:撰寫美工需求分析書,內容包括需求圖、工作量等。其中工作量需要以天來計。內容具體如下:
?場景:包括游戲地圖、小場景等方面。
?人物:包括玩家角色、重要NPC(玩家隊友、提供任務的NPC、主線劇情NPC等)、次要NPC(路人、村民等)、怪物、BOSS等。
?動畫:動畫方面估計每個公司的需求都不盡相同。如果公司能力有限,動畫的制作可以考慮外包的方式。
?道具:主要需要考慮是否采取紙娃娃系統。?全身像:人物的全身像方面。
?靜畫&CG:游戲中可能出現的靜畫和CG的需求。沒有則不需要寫。
?人物頭像:人物的頭像制作需求,其中包括人物的表情方面,包括喜、怒、哀、樂、悲等多種表情。
?界面:界面的需求,包括主界面、各項子界面、屏幕界面、開頭界面、END界面、保存和載入界面等方面。
?動態物件:包括游戲中可能出現的火把、光影等方面。?卷軸:又稱為滾動條。根據游戲的情況來定具體的需求。?招式圖:根據游戲開發的具體情況決定是否有此需求。
?編輯器圖素:各種編輯器的圖素需求,例如關卡編輯器、地圖編輯器等方面。?粒子特效:3D粒子特效的需求。
?宣傳畫;包括游戲的宣傳畫、海報等方面的制作需求。?游戲包裝:游戲客戶端的封面包裝的制作。?說明書插圖:游戲說明書內附插圖的制作需求。?盤片圖鑒:游戲客戶端盤片上的圖鑒的制作需求。?官方網站:游戲官方網站的制作需求。2)、程序需求:撰寫程序需求分析書,內容具體如下:
?地圖編輯器:包括編輯器的功能需求、各種數據的需求等。?粒子編輯器:關于粒子編輯器的需求。
?內鑲小游戲:包括游戲內部各種小游戲的需求。
?功能函數:包括游戲中可能會出現的各種程序功能、技術參數、數據、碰撞檢測、AI等方面的需求。?系統需求:包括升級系統、道具系統、招式系統等系統導入器的需求。3)、策劃需求
?策劃的分工:包括劇本、數值、界面、執行等方面。
?進度控制:要時刻注意時間和開發進度的控制,需要寫一個專門的項目進度表。
?例會:項目會以里程碑的形式呈現。當完成一個里程碑后,或者到達固定日期時,需要召開例行會議,除了成員彼此交流外,還需討論開發中遇到的困難,進度是否有拖延等問題。
>>
二、組織階段:其次,是項目組織階段。
1、確定日程:確定游戲開發的日程和進度安排。包括以下幾個方面: 1)Demo版本階段
?前期策劃:前期策劃和項目的規劃。?關卡設計:關卡設計階段。?前期美工:前期的美工制作。?后期美工:后期的美工制作。
?程序實現:程序的實現,包括編碼等。2)Alpha版本階段
?內部測試:主要是測試和完善各項功能,看一看是否有重大BUG。3)Beta版本階段
?外部測試:進一步測試和完善各項功能,并預備游戲的發行。4)Release版本階段
?游戲發行:項目完成階段,開始正式的發行游戲。5)Gold Release版本階段
?開發補丁:開發游戲的補丁包、升級版本,以及各種官方插件等。
2、確定人員:確定各個項目所需的人員。包括策劃、程序、美工、測試、音樂、運營等方面。
3、分配任務:分配各個人員的具體的開發任務。
4、撰寫策劃書:正式撰寫游戲策劃書。
>>
三、開發階段:其三,是項目開發階段。
作為策劃來說,此階段主要需做到同各方面保持順暢的溝通,并處理各種游戲制作中的突發事件。其中需要做到與同事的溝通、同主管的溝通、同領導和老板的溝通等。
>>
四、控制階段:最后,是項目控制階段。
1、時間 1)、成本控制:需要注意到開發成本的控制,包括服務器、客服、場租、人工(社區關系專員、開發團隊、管理)、設備(辦公室、電腦、家具等)、帶寬、網管、宣傳、廣告和推廣的費用等方面。2)、市場變化:需要注意市場的因素。?發行檔期:需要注意發行檔期,要趕在暑假和寒假之前發行。?盜版因素:必須時刻注意盜版、私服等因素對游戲發行的影響。3)、競爭對手的因素:需要時刻注意競爭對手的情況。畢竟,知己知彼,才能百戰不殆。
2、品質
由于開發人員的水平大都參差不齊,所以必須根據制作人員的總體水平,決定作品的品質。既不能要求太高,亦不能要求太低,需要折中考慮。
3、突發事件
例如,老板的突擊檢查、項目投資人的突然撤資等,這些都必須全盤考慮。
4、控制成本
包括時間、品質等方面的成本控制。
【游戲開發隊伍組成】
開發團隊 ?制作人 ?執行制作人 ?策劃團隊 ?程式團隊 ?美術團隊 銷售團隊 測試團隊 游戲評論隊伍 游戲制作人
?開發組長(always)?資源管理(Resource Management)?行政管理(Administration)?向上負責(Upward Management)?專案管理(Project Management)游戲執行制作人
?專案管理執行(Project Management)?Daily 運作 ?House Keeping
?Not full-time job position
游戲策劃
?故事設計(Story Telling)?腳本設計(Scripting)?玩法設計(Game Play Design)?關卡設計(Level Design)?游戲調適(Game Tuning)?數值設定(Numerical Setup)?AI 設計(Game AI)?音效設定(Sound FX Setup)?場景設定(Scene Setup)游戲美術
?場景(Terrain)?人物(Character)?建模(Models)?材質(Textures)?動作(Motion / Animation)?特效(FX)?用戶界面User Interface 游戲程序
?游戲程序(Game Program)?游戲開發工具(Game Tools)?Level Editor ?Scene Editor ?FX Editor ?Script Editor
?游戲Data Exporters from 3D Software ?3dsMax / Maya / Softimage
?游戲引擎開發Game Engine Development ?網絡游戲服務端開發Online Game Server Development ?創意(Idea)?提案(Proposal)?制作(Production)?整合(Integration)?測試(Testing)?除錯(Debug)?調試(Tuning)游戲設計(Concept Design)?游戲類型(Game Types)?游戲世界觀(Game World)?故事(Story)?游戲特色(Features)?游戲玩法(Game Play)?游戲定位(Game Product Positioning)?Target player
?Marketing segmentation / positioning ?風險評估(Risk)?SWOT(優勢Strength/缺點Weakness/機會Opportunity/威脅Threat)游戲提案(Proposal)?系統分析(System Analysis)?游戲設計文件撰寫(Game Design Document)?傳播媒介文件撰寫(Media Design Document)?技術設計文案撰寫(Technical Design Document)?游戲專案建立(Game Project)?時間表Schedule ?進程/控制Milestones / Check points ?管理Risk management ?測試計劃書
?團隊建立(Team Building)游戲開發(Production)?美術量產制作 ?(建模)Modeling ?(結構)Textures ?(動畫)Animation ?(動作)Motion ?(特效)FX ?程序開發(Coding)?策劃數值設定
游戲整和(Integration)?關卡串聯(Level Integration)?數值調整(Number Tuning)?音效置入(Audio)?完成所有美術 ?程旬與美術結合
?(攻略)Focus Group(說明書User Study)?發布一些攻略截圖Release some playable levels for focus group 游戲測試(Testing)?Alpha(α)測試 ?除錯(Debug)?Beta(β)測試 ?數值微調
?Game play 微調
?對網絡游戲而言(MMOG)?封閉測試(Closed Beta)?開放測試(Open Beta)?壓力(極限)測試(Critical Testing)?網絡游戲才有 關于Bug ?Bug 分級(Bug Classification)?A Bug ?B Bug ?C Bug ? S Bug ?Principles
?Bug 分級從嚴
?Tester(測試對象?—)vs Debugger(調試程序)游戲系統(Game Software System)系統層System Layer – APIs ?3D Graphics API ?DirectX 9.0 SDK – Direct3D ?OpenGL 2.0 ?2D API
?DirectX 9.0 SDK-DirectMedia ?Win32 GDI ?Input Device
?DirectX 9.0 SDK – DirectInput ?Audio
?DirectX 9.0 SDK – DirectSound / Direct3DSound / DirectMedia ?OpenAL ?OS API ?Win32 SDK ?MFC ?Network
?DirectX 9.0 SDK – DirectPlay ?Socket library
引擎層Engine Layer ?3D Scene Management System ?Scene Graph ?Shaders
?2D Sprite System ?Audio System ?Gamepad ?Hotkey ?Mouse ?Timers ?Network
?DDK Interface ?Terrain
?Advanced Scene Management – Space Partition ?BSP Tree ?Octree
?Character System
?Motion Blending Techniques ?Dynamics
?Collision Detection ?SoundFX
?User Interface
游戲層Game Play Modula ?NPC(Non-playable Characters)?Game AI ?Path Finding ?Finite State Machine ?? ?Avatar
?Combat System ?FX System ?Script System ?Trading System ?Number System ??
Game Dev Tools ?Visual C/C++ ?.net 2003
?Visual C/C++ 6.0+ SP5 ?DirectX
?Current 9.0c
?NuMega BoundsChecker ?Intel vTune ?3D Tools
?3dsMax/Maya/Softimage ?In-house Tools 【游戲分類】
?RPG(Role playing games角色扮演)?AVG(Adventure games冒險類)?RTS(Real-time strategy games既時戰略)?FPS(First-person shooting games主視覺射擊)?MMORPG(多人在線角色扮演)?SLG(戰棋)?Simulation(模擬)?Sports(運動)
?Puzzle games(解迷)?Table games(棋牌)
第四篇:安卓學習心得
Android學習心得
-----093380117
計算機應用(1)
張峰
1.關于Activity
1.在一個Activity中使用多個View
如果把Activity看作MVC中的Control?它負責管理UI和接受事件(包括用戶的輸入),雖然說一個Activity通常對應一個屏幕,但事實上,我們是可以只用一個Activity管理多個不同的View來實現簡單的邏輯。首先,我們增加一個新的資源描述layout/second.xml。
除了一個“Hello中國”以外,增加一個按鈕可以返回前一個界面。然后,在代碼中我們要為helloTwo增加兩個方法,setViewOneCommand和setViewTwoCommand,分別處理一下在不同界面時,從資源里加載組件并為組件綁定一個事件處理器最后,我們需要在onCreate的時候,也就是啟動后的main界面上設置一下按鈕事件處理器。2.還是回到正道上,多個Activity之間的跳轉
Android中提供一個叫Intent的類來實現屏幕之間的跳轉,按文檔的說法,似乎他們也建議采用這種方法,Intent的用法比較復雜,現在我先看看它最簡單的用法。
這里的跳轉功能用Intent來操作,它的最簡單用法就是用函數setClass()設置跳轉前后兩個Activity類的實例,然后調用Activity自己的startActivity(intent)即可。最后一句finish()表示將當前Activity關掉(如果不關掉會如何?你可以自己試一下看效果,事實上有時我們是不需要關掉當前Activity的)。
然后,我們同樣弄一個Activity類HelloThreeB,代碼與前面的差不多,只是將setClass的兩個參數反一下,這樣就可以簡單地實現在兩個Activity界面中來回切換的功能了。
2.關于 Intent的使用
Intent分為兩大類,顯性的(Explicit)和隱性的(Implicit)。一般來說,intent要定位事件的目的地,無外乎需要以下幾個信息: 1.種類(category),比如我們常見的 LAUNCHER_CATEGORY 就是表示這是一類應用程序。
2.類型(type),在前面的例子中沒用過,表示數據的類型,這是隱性Intent定位目標的重要依據。
3.組件(component),前面的例子中用的是setClass,不過也可以用setComponent來設置intent跳轉的前后兩個類實例。4.附加數據(extras),在ContentURI之外還可以附加一些信息,它是Bundle類型的對象。
其實,如果是在一個應用內部,這種隱性的intent實在有點別扭,個人覺得,這種松藕合的實現方法,只適用于那些較大的系統或者多個不同的應用之間的調用,可手機上又有什么“較大”的系統呢?無非是可以與不同來源的多個應用之間方便地互操作而已,那么會是什么樣的場景呢?比如,給QQ好友發送gmail郵件,用GoogleMap查找QQ好友所在的位置?看上去挺不錯的。
關于這個ContentProvider,其實還有話說,它主要是的那些看似數據庫操作的方法我們都沒真正去實現呢。不過今天就到這里了,等下回再去研究吧。
3.關于ListActivity
準備一個List對象并借助Adapter就可以構造出一個列表。重載onListItemClick方法可以響應選擇事件,利用第一個參數可以訪問到這個ListView實例以得到選中的條目信息。這里有一點要說明的,就是如果更簡單的話,其實連那個setContentView都可以不要了,Android也會自動幫我們構造出一個全屏的列表。但是本例中我們需要一個TextView來顯示選中的條目,所以我們需要一個layout.mainb描述一下這個列表窗口。
這里需要注意的是那個ListView的ID,是系統自定義的android:list,不是我們隨便取的,否則系統會說找不到它想要的listview了。然后,在這個listview之外,我們又增加了一個TextView,用來顯示選中的條目。
再來說說這里用到的ArrayAdapter,它的構造函數中第二個參數是一個資源ID,ArrayAdapter的API文檔中說是要求用一個包含TextView的layout文件,平臺用它來顯示每個選擇條目的樣式,這里的取值是R.layout.list_row,所以,我們還有一個list_row.xml文件來描述這個布局,相當簡單。
從ArrayAdapter上溯到BaseAdapter,發現還有幾個同源的Adapter也應該可以使用,象SimpleAdapter和CursorAdapter,還是做個例子來實驗一下吧。
然后,在HelloTwoB中的onCreate函數中,修改代碼,有幾個不同:items的元素是HashMap實例,這是一點變化,然后構造函數除了要求items以外,還要求提供一個string[]來說明用hash表中的哪個字段顯示在列表中,而后是一個資源ID的數組。
因為單純的CursorAdapter是抽象類,所以我用的是它的子類SimpleCursorAdapter,很好理解,先用ContentResolver查詢通訊簿得到一個游標,然后告訴SimpleCursorAdapter要用其中的People.NAME作為顯示項來構造出一個adapter即可。4.關于Dialog
注意到android.app包下除了Dialog(可用于制作復雜的對話框)以外,還包括了幾個系統定義好的對話框類,如DatePickerDialog、TimePickerDialog及AlertDialog。
其中AlertDialog我上回用過一次,基本上就那樣子了,今天看看另外兩個對話框的使用吧。
很簡單的,無非是需要一個OnDateSetListener接口的實現而已,在它里面的dateSet方法中就可以得到選擇的日期了。而TimePickerDialog與DatePickerDialog使用如出一轍。
看看另一個ProgressDialog的用法吧,這個類與AlertDialog一樣包含了多個static的方法,所以使用起來是非常方便的。比如說,如果我們需要用它來表示一個長時間的操作。
5.關于Service和Notification
大略地看了一下android.app下的Service類,覺得它與Activity非常相似,只是要注意幾個地方:
1.生命周期,Service的從onCreate()->onStart(int,Bundle)->onDestroy()顯得更為簡單。但是它的onStart是帶參數的,第一個ID可用來標識這個service,第二個參數顯示是用來傳遞數據的了。比較Activity,傳遞數據的Bundle是在onCreate就帶進入的。
2.Service的啟動由Context.startService開始,其實Activity或者Service都是Context的派生類。結束于Context.stopService()或者它自己的stopSelf()。
3.Service還有一個與Activity不一樣的是它可以由另一個Context去綁定一個已存在的Service。就是這個方法Context.bindService(),被綁定的Service要求是已經onCreate了但可以沒有onStart。在Service類中有個抽象方法getBinder()可以得到這個IBinder對象。關于這方面的細節,以后再看,這里只做個記錄罷。
4.與Service有關的還有一個安全的問題,可以在AndroidManifest.xml中用
6.GridView與ImageView
簡單一點吧,就瞧瞧那個Grid的效果,Android提供了一個GridView,不過從APIDemo中看來,它似乎與PC上的GRID差別還是挺大的,更像那個IconView的感覺。不知道Android中如何實現表格界面?雖然在移動終端上,表格一般不會有誰使用,大家似乎更傾向于使用ListView,而Android對于ListView則有更簡單的實現ListActivity。
很簡單,只要重載幾個方法就可以了,關鍵是那個getView方法,它負責構建出每個單元格中的對象實例。這里我們構造的是一個ImageView實例。
然后就是同樣的將這個Adapter賦給GridView即可,大家可以看看效果,注意在做這個例子前,先放幾個小圖片到res/drawable目錄下,buildproject一下就可以得到那個R.drawable.a了(這里的a是圖像文件名,如a.png)。
在getView方法中我們使用了ImageView類,這又是一個widget。除了上面用到的幾個方法以外,還有以下幾個方法值得注意: 與圖像來源有關的方法,我們只用了資源文件的方式。
還是習慣性跑題了,其實,我是想通過我對這個類的無數次Debugger跟進,說說它的多線程異步處理的解決策略的。他的基本策略如下: 1.當你實例化一個AsyncQueryHandler類時(包括其子類...),它會單件構造一個線程(后面會詳述...),這個線程里面會構建一個消息循環。
2.獲得該消息循環的指針,用它做參數實例化另一個Handler類,該類為內部類。至此,就有了兩個線程,各自有一個Handler來處理消息。3.當調用onXXX的時候,在XXX函數內部會將請求封裝成一個內部的參數類,將其作為消息的參數,將此消息發送至另一個線程。4.在該線程的Handler中,接受該消息,并分析傳入的參數,用初始化時傳入的ContentResolver進行XXX操作,并返回Cursor或其他返回值。
5.構造一個消息,將上述返回值以及其他相關內容綁定在該消息上,發送回主線程。
6.主線程默認的AsyncQueryHandler類的handleMessage方法(可自定義,但由于都是內部類,基本沒有意義...)會分析該消息,并轉發給對應的onXXXComplete方法。
7.用戶重寫的onXXXComplete方法開始工作。
這就是它偷偷摸摸做過的事情,基本還是很好理解的。我唯一好奇的是它的線程管理方式,我猜測他是用的單件模式。第一個AsyncQueryHandler的實例化會導致創建一個線程,從此該線程成為不死老處男,所有的ContentResolver相關的工作,都由該線程統一完成。個人覺得這種解決方式很贊。本來這個線程的生命周期就很難估量,并且,當你有一個ContentProvider的請求的時候,判斷你會做更多的類似操作并不過分。就算錯了,花費的也只是一個不死的線程(與進程同生死共存亡...),換來的卻是簡單的生命周期管理和無數次線程生死開銷的節約。同時另外一個很重要的問題,他并會涉及到單件中數據同步的問題,每個類都有各自的Handler類,彼此互不干擾,分發可以分別進行。當多個數據請求的時候,在同一個ContentResolver上進行的可能微乎其微,這就避免了堵塞。總而言之,這套解決辦法和Android的整體設計算是天作之合了。
所以建議,如果你有什么非ContentProvider操作,卻需要異步多線程執行的話,模擬一套,是個不錯的策略,當然,具體情況具體分析,生搬硬套是學不好馬列主義的。
7.顯示控件使用
Android的界面顯示同樣也是基于控件的。通常是用View(包括ViewGroup)控件配上XML的樣式來做的。具體細節不想說了,可以參考 Samples里的ApiDemos/View,和View的Doc,以及Implementing a UI這篇Doc。其他還有很多,感覺算是SDK講述的最多的內容。
從控件的使用上,和網頁的設計類似,盡量用parent_width之類的抽象長度,用Theme來做風格,抽取所有的字串等信息做本地化設計。相關內容參看Implementing a UI就好。
一類比較重要的是數據綁定控件。如果做過ASP.Net會從中看到很多類似的地方。一個支持數據綁定的控件,比如ListView。可以通過一個 ListAdapter綁定到一個數據源上。ListAdapter是一個抽象類,主要的實現類包括SimpleAdapter和 SimpleCursorAdapter。前者是綁定一個靜態的Array,后者是綁定一個動態的Cursor。Cursor前面說過,是一個指向數據源的隨機迭代器,將View綁定到Cursor通常要設置這樣幾個參數。一個是每一行的樣式,稱作Row Layout,其實就是一個普通的Layout的XML文件。還有就是一個列和現實控件的對應關系。那個控件顯示哪個列的值,這是需要配置的。為了定制一個良好的數據顯示控件,最簡單你可以定制很PP的Row Layout,復雜一點就是可以重載綁定控件View,或者是適配器ListAdapter。如果是一個數據顯示密集的應用,且你對UI有些追求,這個工作估計是必不可少的。
一個主要用于顯示數據內容的Activity,可以選擇派生自ListActivity。它提供了一個具有ListView 的Layout,還有simple_list_item_1, simple_list_item_2, two_line_list_item等默認的Row Layout,還有一些比較不錯的API,和可供響應選擇Item的事件。可以滿足你比較基礎的需求。如果你覺得只有一個ListView的界面太突兀,你可以為這個ListActivity指定一個Layout,需要注意的是,你需要提供一個id為@android:id/list的ListView控件,避免Activity在內部偷偷尋找該控件的時候失敗。
除了這些要求,做好UI還有注意易用性和效率。快捷鍵是一個比較不錯的選擇,在 Activity中調用setDefaultkeyMode(SHORTCUT_DEFAULT_KEYS),可以開啟快捷鍵模式,然后你可以將菜單綁定到指定快捷鍵上就OK了。個人覺得Tip也是一個比較重要的東西,但目前觀察看來,這個東西只能夠自己提供了。界面的動態性有時候是不可避免的,比如說菜單就是一個需要經常根據光標位置提供不同的選項。這個東西Android很人道的考慮到了,你可以參看NodeList這個Sample。它采取的應該是一個靜態模擬動態的方式,這樣有助于提高速度。你也可以利用ViewInflate,動態從一個XML創建一個控件。成本據Doc說很大,不到萬不得已不要使用。
8.Intent消息傳遞
在前面寫Android的ContentProvider時候,可以看到那是基于觀察者模式的一個消息傳遞方法。每一個Cursor、ContentResolver做為一個小的注冊中心,相關觀察者可以在這個中心注冊,更新消息由注冊中心分發給各個觀察者。而在MFC或Winform中,都會形成一個消息網,讓消息在網中流動,被各節點使用、吃掉或者在出口死掉。
相比之下,我個人覺得基于Intent的Android核心消息傳遞機制是有所不同的。它應該會有一個全局性的注冊中心,這個注冊中心是隱性的,整個Android系統中就那么一個。所有的消息接收者,都被隱形的注冊到這個中心。包括Activity,Service和IntentReceiver。其實說隱形注冊是不確切的,所有注冊都還是我們手動告訴注冊中心的,只是與傳統的方式不一樣,我們通常不是通過代碼,而是通過配置文件來做。在應用的Manifest中,我們會為一些Activity或Service添加上Intent-filter,或在配置文件中添加
當程序有一個消息希望發出去的時候,它需要將消息封裝成一個Intent,并發送。這時候,應該是有一個統一的中心(恩,有可能Android底層實現的時候不是,但簡單這樣看是沒問題的...)接受到這個消息,并對它進行解析、判定消息類型(這個步驟降低了耦合...),然后檢查注冊了相匹配的filter或receiver,并創建或喚醒接收者,將消息分發給它。這樣做有很多好處。雖然這種傳遞有的時候不如點對點的傳遞快(這有些需要速度的地方,我們看到Android會通過直接通信來做),但有時候又因為它只經過一跳(姑且這么叫吧...),比復雜的流動又要更快。更重要的是,它耦合性低,在手機平臺這種程序組件多變的條件下使用十分適合。并且它可以很容易實現消息的精確或模糊匹配,彈性很大。(我個人曾想在開發一個C++二次平臺的時候引入這樣的機制,但在C++中,建立一套完整的數據marshal機制不容易,相比之下,用java來做會簡單很多...)
恩,廢話說了很多,具體講講Android中Intent的使用。當你有一個消息需要傳遞,如果你明確知道你需要哪個Activity或者其他Class來響應的話,你可以指定這個類來接受該消息,這被稱為顯性發送。你需要將Intent的class屬性設置成目標。這種情況很常見,比如startActivity的時候,會清楚當前Activity完了應該是哪個Activity,那就明確的發送這個消息。
但是,有的時候你并不確定你的消息是需要具體哪個類來執行,而只是知道接收者該符合哪些條件。比如你只需要有一個接收者能顯示用戶所選的數據,而不想制定某個具體的方法,這時候你就需要用到隱形發送(傳統上,我們可能會考慮用多態,但顯然這種方式更為靈活...)。在Android中,你可以為Intent指定一個action,表示你這個指令需要處理的事情。系統為我們定義了很多Action類型,這些類型使系統與我們通信的語言(比如在Activity里面加一個Main的filter,該activity就會做成該應用的入口點),當然你也可以用于你自己的應用之間的通信(同樣當然,也可以自定義...)。強烈建議,在自己程序接收或發出一個系統action的時候,要名副其實。比如你響應一個view動作,做的確實edit的勾當,你發送一個pick消息,其實你想讓別人做edit的事,這樣都會造成混亂。當然只有Action有時候是不夠的,在Android中我們還可以指定catalog信息和type/data信息,比如所有的顯示數據的Activity,可能都會響應View action。但很多與我們需要顯示的數據類型不一樣,可以加一個type信息,明確的指出我們需要顯示的數據類型,甚至還可以加上一個catalog信息,指明只有你只有按的是“中鍵”并發出這樣的消息才響應。從上面可以看出,Android的Intent可以添加上class, action, data/type, catalog等消息,注冊中心會根據這些信息幫你找到符合的接收者。其中class是點對點的指示,一旦指明,其他信息都被忽略。Intent中還可以添加key/value的數據,發送方和接收方需要保持統一的key信息和value類型信息,這種數據的marshal在java里做,是不費什么力氣的。
Android的Intent發送,可以分成單播和廣播兩種。廣播的接收者是所有注冊了的符合條件的IntentReceiver。在單播的情況下,即使有很多符合條件的接收者,也只要有一個出來處理這個消息就好(恩,個人看法,沒找到確切條款或抉擇的算法,本來想實驗一下,沒來得及...),這樣的情況很容易理解,當你需要修改某個數據的時候,你肯定不會希望有十個編輯器輪流讓你來處理。當廣播不是這樣,一個receiver沒有辦法阻止其他receiver進行對廣播事件的處理。這種情況也很容易理解,比如時鐘改變了,鬧鐘、備忘錄等很多程序都需要分別進行處理。在自己的程序的使用中,應該分清楚區別,合理的使用。
9.ContentProvider數據模型
數據庫操作
從我目前掌握的知識來看,SQLite比較輕量(沒有存儲過程之類的繁雜手段),用起來也比較簡單。實例化一個SQLiteDatabase類對象,通過它的APIs可以搞定大部分的操作。從sample中看,Android中對db的使用有一種比較簡單的模式,即派生一個 ContentProviderDatabaseHelper類來進行SQLiteDatabase對象實例的獲取工作。基本上,ContentProviderDatabaseHelper類扮演了一個singleton的角色,提供單一的實例化入口點,并屏蔽了數據庫創建、打開升級等細節。在ContentProvider中只需要調用ContentProviderDatabaseHelper的openDatabase方法獲取SQLiteDatabase的實例就好,而不需要進行數據庫狀態的判斷。URI 像進行數據庫操作需要用SQL一樣,對ContentProivder進行增刪改查等操作都是通過一種特定模式的URI來進行的(ig:content: //provider/item/id),URI的能力與URL類似,具體細節可以查看SDK。建立自己的ContentProvider,只需要派生 ContentProivder類并實現insert, delete, update等抽象函數即可。在這些接口中比較特殊的是getType(uri)。根據傳入的uri,該方法按照MIME格式返回一個字符串(==!沒聽過的詭異格式...)唯一標識該uri的類型。所謂uri的類型,就是描述這個uri所進行的操作的種類,比如content://xx/a與 content://xx/a/1不是一個類型(前者是多值操作,后者是單值),但content://xx/a/1和content://xx/a/2 就會是一個類型(只是id號不同而已)。
在ContentProvider通常都會實例化一個ContentURIPraser來輔助解析和操作傳入的URI。你需要事先(在static域內)為該ContentURIPraser建立一個uri的語法樹,之后就可以簡單調用 ContentURIPraser類的相關方法進行uri類型判斷(match方法),獲取加載在uri中的參數等操作。但我看來,這只是在使用上簡化了相關操作(不然就需要自己做人肉解析了...),但并沒有改變類型判定的模式。你依然需要用switch...case...對uri的類型進行判斷,并進行相關后續的操作。從模式來看,這樣無疑是具有強烈的壞味道,類似的switch...case...代碼要出現N此,每次一個 ContentProvider做uri類型的增減都會需要遍歷修改每一個switch...case...,當然,如果你使用模式(策略模式...)進行改造對手機程序來說無疑是崩潰似的(類型膨脹,效率降低...),所以,只能是忍一忍了(恩,還好不會擴散到別的類中,維護性上不會有殺人性的麻煩...)。增刪改查
ContentProvider 和所有數據源一樣,向外提供增刪改查操作接口,這些都是基于uri的指令。進行insert操作的時候,你需要傳入一個uri和 ContentValues。uri的作用基本就限于指明增減條目的類型(從數據庫層面來看就是table名),ContentValues是一個 key/value表的封裝,提供方便的API進行插入數據類型和數據值的設置和獲取。在數據庫層面上來看,這應該是column name與value的對應。但為了屏蔽ContentProvider用戶涉及到具體數據庫的細節,在Android的示例中,用了一個小小的模式。它為每一個表建一個基于BaseColumn類的派生類(其實完全可以不派生自BaseColumn,特別當你的表不基于默認的自動id做主鍵的時候),這個類通常包括一個描述該表的ContentURI對象和形如 public static final TITLE = “title”這樣的column到類數據的對應。從改變上角度來看,你可以修改column的名字而不需要更改用戶上層代碼,增加了靈活性。insert方法如果成功會返回一個uri,該uri會在原有的uri基礎上增加有一個row id。對于為什么使用row id而不是key id我想破了腦袋。到最后,我發現我傻了,因為ContentProvider不一定需要使用數據庫,使用數據庫對應的表也可以沒有主鍵,只有row id,才能在任何底層介質下做索引標識。
但,基于row id在刪除和修改操作是會造成一定的混亂。刪除和修改操作類似。刪除操作需要傳入一個uri,一個where字串,一組where的參數(做條件判定...),而修改操作會多一個ContentValues做更新值。著兩個操作的uri都支持在末尾添加一個row id。于是混亂就出現了。當在where參數中指明了key id,而在uri中提供了row id,并且row id和key id所指函數不一致的時候,你聽誰的?示例代碼中的做法是完全無視row id(無語...),如此野蠻的方式我估計也只能在示例中出現,在實際中該如何用,恩,我也不知道。幸運的是,我看了下上層對 ContentProvider的刪除操作,其實都不會直接進行,而是通過調用Cursor的delete方法進行,在這前提下,我想Cursor會處理好這些東西吧。
最后一個操作是查詢操作,可以想見,查詢的參數是最多的,包括uri和一組條件參數。條件參數類型和標準的sql類似,包括 sort, projection 之類的。從這些參數到sql語句的生成,可以尋求QueryBuilder類的幫助,它提供了一組操作接口,簡化了參數到sql的生成工作,哪怕你不懂 sql都完全沒有問題(這話說的我自己都覺得有點懸...)。查詢返回一個Cursor。Cursor是一個支持隨機讀寫的指針,不僅如此,它還提供了方便的刪除和修改的API,是上層對ContentProvider進行操作一個重要對象,需要仔細掌握(Cursor還可以綁定到view上,直接送顯,并與用戶進行交互,真是程序越往上,封裝越好,工作越機械沒有復雜性了...)。數據模型
在與界面打交道的Cursor、ContentResolver等數據操作層中,大量采用觀察者模式建立數據層與顯示層的聯系。一個顯示層的視圖,可以做成某一種觀察者注冊到Cursor或ContentResolver等數據中間層中,在實現底層ContentProvider中,我們需要特別注意在對數據進行修改操作(包括增刪改...)后,調用相應類型的notify函數,幫助表層對象進行刷新(還有一種刷新方式是從一個view發起的)。可以看到 Android的整體數據顯示框架有點像MVC的方式。Cursor、ContentResolver相當于控制層,數據層和顯示層的交互通過控制層來掌管,而且控制層很穩定不需要特別定制,通常工作只在定制數據層和顯示層空間,還是比較方便和清晰的。
10.學習感想
通過這學期對安卓的學習,大概了解了以上一些知識,對安卓有了初步的了解,這幾個月給我的東西我想用有形的和無形的兩部分概敘,形的當然就是技術水平的長進,雖然其中肯定有很多的不足,相信慢慢會體會到。
第五篇:Android開發前景怎樣 大學生該如何學好安卓了
Android開發行業火熱,大學生如何學好Android? 一:Android開發前景
當前,Android系統因其開放性和免費廣受歡迎,所占市場份額最大,截至2011年第四季度,國內市場Android手機的市場份額已經占據了整體智能機市場的68.4%。國內三大運營商如火如荼的3G營銷戰持續升溫,再加上3G的推出對整個行業的巨大推動作用,無疑將引爆3G-Android開發工程師這個黃金職位,符合條件的Android工程師屈指可數,企業招聘難度可想而知。我們相信,在未來幾年內,Android開發工程師將成為3G行業炙手可熱的崗位之一。據數據統計顯示:目前熱招的Android技術相關崗位約有3882個,而一個月內的有效崗位量在2298個。主要熱招職位包括Android開發工程師、Android軟件工程師、Android應用開發工程師、系統驅動工程師,Android手機游戲開發、Android系統軟件開發、Android程序員、Android游戲應用版本管理、人機交互分析工程師、Android中間層開發工程師等。
二:大學生如何學好Android?
雖然了解到Android行業未來的發展前景,Android人才的緊缺。但是作為剛畢業的應屆大學畢業生如何才能加入這個熱門行業?怎樣才能學好Android開發?今天,長沙歐柏泰克的Android培訓老師告訴大家作為一個大學生如何學好安卓?
首先:學習一門語言
眾所周知,Android行業是一個高門檻行業,所以想要進入這個
行業,首先要學習一門編程語言:從人才需求類型來看,目前對Android人才需求一類是偏向硬件驅動的Android人才需求,一類是偏向軟件應用的Android人才需求。偏向Android硬件驅動Android人才,首先要學習的是C語言。由于現在大學里面和計算機相關的專業甚至理工類專業一般都會開設C語言課程,只是很多同學在大學期間并沒有好好學習,如果對它掌握的不太好或者很久沒用了,建議先從將其好好復習一下,將其基本的語法再好好回顧一下,最好能搭建一個環境來運行、調試它。如果沒有學過,不妨也提前學習一下。大部分的高校所開設的C語言使用的教材都是用它作為教材,因此無論是購買還是借閱,都容易找到。
應用的Android開發需要學習Java語言。因為Android應用的開發語言用的是Java語言,并且在Android中也用到了Java核心類庫的大量的類,因此,在學習Android開發之前,可以先把Java基本語法和Java SE的基礎類庫好好學習一下。Android應用程序開發是以Java語言為基礎的,所以沒有扎實的Java基礎知識,只是機械的照抄別人的代碼,是沒有任何意義的。建議在安卓課程前期的java學習階段中,需要用心的學好。
其次:熟悉數據結構和算法基礎知識
如果后續有志于游戲方面的開發,最好具備一定的數據結構和算法基礎知識。雖然現代的高級編程語言中,其類庫中已經幫我們實現了大部分的數據結構,一般情況下,我們直接使用即可。但如果能對其原理有所了解,當需要在這些數據結構和算法中間的時候,可以更
加的清楚到底應該選擇哪個數據結構或者算法。另外,在圖形圖像處理上面,線性代數的作用也非常重要,如果能掌握一點這方面的基礎知識,無疑也會在后續的學習中如虎添翼。
總結:現在Android在移動領域已經得到了廣泛的應用。隨著需求的增多,行業人才的緊缺導致薪酬水漲船高,Adroid 3G技術人員入行起薪即可達到5000元。由此可見,未來的安卓人才的需求量還是很大的,大學生學習Adroid更是抓住了最佳時機。
大學畢業生通過就業培訓進軍嵌入式行業
大學生就業難一直是被關注的熱點話題,2013年大學畢業生就業形勢又將如何?近日,教育部發布關于做好2013年全國普通高等學校畢業生就業工作的通知。通知指出2013年高校畢業生比2012年增加19萬,教育部稱高校畢業生就業形勢更加嚴峻。
據專家表示:雖然目前大學畢業生就業形勢嚴峻,就業難,但是很多行業仍然面臨著人才緊缺得情況。例如:調查顯示,在求職因素的各維度分析中,學生求職者在就業行業方面很多傾向于IT/互聯網行業。但是從實際就業情況看,還是很少學生求職者能邁進這個行業,雖然目前的IT/互聯網行業發展前景很好,同時這方面的人才存在巨大缺口,但是由于IT/互聯網行業本身的行業門檻相當高,所以對于大學畢業生來說十分困難。但是很多相關方面的專家指出:由于現在很多的行業人才的需求與大學生求職者目前的能力存在一定的差距,所以需要一種方式或者是渠道去縮短這種差距。例如:目前國內嵌入式人才極度匱乏,權威部門統計,我國目前嵌入式軟件人才缺口每年
為40萬人左右。INTEL、TI、SONY、三星、TCL、聯想、康佳等大型企業對嵌入式人才都有大量的需求。供不應求使得嵌入式人才身價上漲,而且,越有專業經驗,就業競爭力就越大。雖然嵌入式行業門檻很高,但是大學畢業生同樣能加入這個行業。
目前市場上有很多的有實力的嵌入式培訓機構,他們能很好的幫助企業解決嵌入式人才短缺問題,培養一批批合格的嵌入式人才。通過最近幾年的實踐證明,很多的嵌入式培訓機構已經成功培養了大批的嵌入式人才,這也讓為什么越來越多的人開始通過培訓渠道邁入這個高門檻行業,尤其是大學畢業生參加培訓的越來越多,雖然對他們來說幾乎沒有任何的嵌入式相關的技術基礎,最多擁有的也就是c語言基礎。但是他們擁有很好的學習能力,能快速學習和掌握一門知識或者技能。在短短幾個月的培訓中,他們跟上了老師的步伐,學到了大學中幾年都沒有學會的東西!這足以證明了他們對成功的渴望,對渴望成為一個嵌入式工程師付出的決心。
最后,長沙歐柏泰克真切的希望那些有志于嵌入式行業的大學畢業生能選擇相關的培訓快速加入這個行業,因為目前嵌入式軟件人才十分緊缺,如果你想成功,你想在這個行業走的更遠,發揮你現有的超強學習能力抓住這次機會。因為我相信,成功的人之所以能取得成功是因為他們總能抓住別人沒抓住的機會,付出別人不愿付出的代價。