聲明:學習的書籍《Android應用開發揭秘》,這裡記錄學習該書籍的日誌,引用的相關代碼與總結描述,沒有商業的用途,完全是自我學習的一個記錄,剛剛學習不可避免會出現很多問題,若是有錯誤還請大家多多批評。
學習完基本的控制項與布局之後,我跳過了遊戲編程的章節,直接開始了android關於資料的操作的學習,遊戲編程準備放到後面學習,而學習完基本的控制項以及相關事件操作之後,按照學習Web開發的流程,也就是牽涉到了資料操作的資料,包括檔案,網路資源以及資料庫操作,這塊內容,自己反覆學習了好幾遍因為畢竟每個應用程式都不是獨立存在的,資料操作不可避免。廢話不說了,開始吧。
一、資料存放區之SharedPreferences
對於SharedPreferences的理解,我個人認為就是針對一個程式的init設定檔,也可以理解為我們web開發中得cookie。它儲存的方式是索引值對的方式進行儲存的,而且Android中SharedPreferences也提供了各種資料類型的get方法。注意,SharedPreferences是一個介面,而且一般都是通過getPreferences方法擷取Preferences對象。通過Preferences對象的edit()方法擷取編輯對象。
// 取得活動的preferences對象.SharedPreferences uiState = getPreferences(0);// 取得編輯對象SharedPreferences.Editor editor = uiState.edit();
通過編輯對象可以對裡面的資料進行更新與維護。
執行個體分析:該程式是個音樂播放程式,若是在按照返回鍵退出程式時音樂還在播放,請儲存當前音樂的狀態,下次啟動時音樂狀態就是開啟的。
音樂播放類MIDIPlayer關鍵代碼:
public MediaPlayerplayerMusic= null;private ContextmContext= null;public MIDIPlayer(Context context){mContext = context;}/* 播放音樂 */public void PlayMusic(){/* 裝載資源中的音樂 */playerMusic = MediaPlayer.create(mContext, R.raw.start);/* 設定是否迴圈 播放*/playerMusic.setLooping(true);try{playerMusic.prepare();//準備同步,無傳回值}catch (IllegalStateException e){e.printStackTrace();}catch (IOException e){e.printStackTrace();}playerMusic.start();}/* 停止並釋放音樂 */public void FreeMusic(){if (playerMusic != null){playerMusic.stop();playerMusic.release();}}
而SharedPreferencesActivity類關鍵代碼:
public void onCreate(Bundle savedInstanceState){. . . . . .mMIDIPlayer = new MIDIPlayer(this);// 取得活動的preferences對象.SharedPreferences settings = getPreferences(Activity.MODE_PRIVATE);// 取得值.mbMusic = settings.getBoolean("bmusic", false);if (mbMusic){mTextView.setText("當前音樂狀態:開");mbMusic = true;mMIDIPlayer.PlayMusic();}else{mTextView.setText("當前音樂狀態:關");}}public boolean onKeyDown(int keyCode, KeyEvent event){if (keyCode == KeyEvent.KEYCODE_BACK){/* 這裡我們在退出時儲存資料 */// 取得活動的preferences對象.SharedPreferences uiState = getPreferences(0);// 取得編輯對象SharedPreferences.Editor editor = uiState.edit();editor.putBoolean("bmusic", mbMusic); // 添加值// 提交儲存editor.commit();if ( mbMusic ){mMIDIPlayer.FreeMusic();}this.finish();return true;}return super.onKeyDown(keyCode, event);}
【擴充學習】
這裡需要強調的是:多個程式之間是不能直接共用Preferences資料的。
1. haredPreferences的檔案實際是儲存在一個檔案中,如,切換到DDMS視圖,
每在模擬器中安裝一個項目,對應在data/data目錄下產生一個檔案夾,若是使用SharedPreferences就會有一個shared_prefs檔案夾,
對於本程式對應的SharedPreferencesActivity.xml 內容為:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?><map><boolean name="bmusic" value="true" /></map>
2 SharedPreferences相關API介紹
內部類
interface SharedPreferences.Editor ——於修改SharedPreferences對象設定值的介面。
interface SharedPreferences.OnSharedPreferenceChangeListener ——介面定義一個用於在偏好設定(shared preference)改變時調用的回呼函數。
公用方法
public abstract boolean contains (String key) ——判斷preferences是否包含一個preference。
參數:key 想要判斷的preference的名稱
傳回值:Peferences中存在preference,則返回true,否則返回false。
public abstract SharedPreferences.Editor edit ()
針對preferences建立一個新的Editor對象,通過它你可以修改preferences裡的資料,並且原子化的將這些資料提交回SharedPreferences對象。(譯者註:原子化——作為一個整體提交,原子性)
注意:如果你想要在SharedPreferences中即時顯示,剛通過Editor對象進行的修改,那麼你必須調用commit()方法。
返回一個SharedPreferences.Editor的新執行個體,允許你修改SharedPreferences對象裡的值。
public abstract Map<String, ?> getAll ()——取得preferences裡面的所有值,返回一個map,其中包含一列preferences中的索引值對
異常:null 指標異常(NullPointerException)
public abstract boolean getBoolean (String key, boolean defValue)——從preferences中擷取一個boolean類型的值。
參數:key 擷取的preference的名稱
defValue 當此preference不存在時返回的預設值
傳回值:如果preference存在,則返回preference的值,否則返回defValue。如果使用此名稱的preference不是一個boolean類型,則拋出ClassCastException。
異常:ClassCastException
public abstract float getFloat (String key, float defValue)
public abstract int getInt (String key, int defValue)
public abstract long getLong (String key, long defValue)
public abstract String getString (String key, String defValue)
public abstract void registerOnSharedPreferenceChangeListener (SharedPreferences.OnSharedPreferenceChangeListener listener)
註冊一個回呼函數,當一個preference發生變化時調用。
public abstract void unregisterOnSharedPreferenceChangeListener (SharedPreferences.OnSharedPreferenceChangeListener listener)
登出一個之前(註冊)的回呼函數
二、資料存放區之Files
有的程式需要把資料中儲存到相應的檔案中,但是要注意的事檔案在多個程式之間也是不能共用的。檔案儲存體資料可以openFileOutput方法開啟一個檔案進行操作。
執行個體分析:與上面SharedPreferences例子效果一樣。
關鍵源碼:
void load(){ /* 構建Properties對對象 */Properties properties = new Properties();try{/* 開發檔案 */FileInputStream stream = this.openFileInput("music.cfg");/* 讀取檔案內容 */properties.load(stream);}catch (FileNotFoundException e){return;}catch (IOException e){return;}/* 取得資料 */mbMusic = Boolean.valueOf(properties.get("bmusic").toString()); } /* 儲存資料 */boolean save(){Properties properties = new Properties();/* 將資料打包成Properties */properties.put("bmusic", String.valueOf(mbMusic));try{FileOutputStream stream = this.openFileOutput("music.cfg", Context.MODE_WORLD_WRITEABLE);/* 將打包好的資料寫入檔案中 */properties.store(stream, "");}catch (FileNotFoundException e){return false;}catch (IOException e){return false;}return true;}
【擴充學習】
使用Files方式儲存資料,同樣會在對應data/data目錄下面的files檔案下也有相關的檔案來儲存資料,
Music.cfg的檔案內容為:
##Wed Nov 02 10:06:38 GMT+00:00 2011bmusic=true
三、資料存放區之Web資料操作
很多程式都是通過網路來把資料等資訊儲存到服務上,同樣從伺服器上讀取相關的資料到自己。最典型的如,手機的郵件的收發,當然要使用網路,必先保證手機的網路是串連上。
這裡我就在模擬器下配置了163郵箱的綁定,左圖,中間圖為接受伺服器設定,右圖為外發伺服器設定。
下面兩個例子分別是寫資料與取資料,
1. 從發送郵件功能(寫資料)
關鍵源碼:
public boolean onKeyDown(int keyCode, KeyEvent event){if(keyCode == KeyEvent.KEYCODE_BACK){//退出應用程式時儲存資料//發送郵件的地址Uri uri = Uri.parse("mailto:jercy1987@163.com");//建立IntentIntent intent = new Intent(Intent.ACTION_SENDTO,uri);//設定郵件的主題intent.putExtra(android.content.Intent.EXTRA_SUBJECT, "資料備份");//設定郵件的內容intent.putExtra(android.content.Intent.EXTRA_TEXT, "本次計數:"+miCount);startActivity(intent);this.finish();return true;} return super.onKeyDown(keyCode, event); }
:
2. 從網頁擷取資料
為了測試從WEB上擷取資料,這裡我搭建了一個簡單TestWeb的Web項目,並用Tomcat發布,在IE上運行,其中在項目根目錄下按照資料例子,放了一個android.txt檔案。
關鍵源碼:
String myString = null;try{/* 定義我們要訪問的地址url */URL uri = new URL("http://192.168.8.64:8080/TestWeb/android.html");/* 開啟這個url串連 */URLConnection ucon = uri.openConnection();/* 從上面的連結中取得InputStream */InputStream is = ucon.getInputStream();BufferedInputStream bis = new BufferedInputStream(is);ByteArrayBuffer baf = new ByteArrayBuffer(100);int current = 0;/* 一直讀到檔案結束 */while ((current = bis.read()) != -1){baf.append((byte) current);}myString = new String(baf.toByteArray());}catch (Exception e){myString = e.getMessage();}/* 將資訊設定到TextView */tv.setText(myString);
程式運行:
【擴充學習】:
(1)、android訪問網路資源必須要有:
<uses-permission android:name="android.permission.INTERNET" />
不然運行會提示:
Permission denied
(2)、
/* 定義我們要訪問的地址url */
URL uri = new URL("http://192.168.8.64:8080/TestWeb/android.txt");
/* 開啟這個url串連 */
URLConnection ucon = uri.openConnection();
其中若是本地機器,也不能用localhost或者127.0.0.1,不然會串連不上
(3)、測試訪問html檔案android.html
<html><head>頭部內容</head><body>內容資訊</body></html>
android擷取時,擷取時html的源碼而不是內容,因為他沒有解析器,而且會是亂碼。
以上資料存放區就先學到這裡,下一篇文章主要是針對資料庫的操作。