當前位置:首頁 » 安卓系統 » androidfloatint

androidfloatint

發布時間: 2023-06-13 01:59:57

㈠ 安卓如何自己定義一個數據類型然後我可以private 這個數據類型!

java數據類型【Android基礎第6篇】
微價值網 星河

前面我們講了Android開發環境搭建,包括模擬器與真機調試方法,本期開始,我們逐步介紹Android應用開發中常用的一些Java編程基礎知識,包括數據類型、分支與循環控制、類與對象的設計、函數與介面等。
首先來看Java數據類型,總體上可以分為基本類型(數值型、字元型、布爾型)和引用類型兩種。

一、基本類型 1、數值型
包括整數類型(又包含byte、短整型short、整數int和長整型long)、 浮點類型(包含float以及雙精度double)。
其中,整數類型默認為int,浮點型默認為double,如果要表示long型數據或float型數據,要在相應的數值後面加上l、L或f、F,否則會出現編譯問題。
2、字元型
一個char類型型的變數,對應一個字元,例如』a』,這種類型的變數在Java中由兩個位元組(byte)組成。這種類型不區分正負,為無符號類型。
3、布爾類型
也即boolean類型,只有兩個取值:false和true。注意這種類型的變數,不能轉換成任何其他數據類型。

Java中所有的基本數據類型都有固定的取值范圍、佔用固定大小的內存空間,而不受具體操作系統的影響,這樣可以保證Java程序的跨平台、可移植性。
對於基本數據類型,一個需要注意的問題是類型轉換,包括自動轉換與強制轉換,在後面會結合實例詳細分析。
二、引用類型
引用類型可以分為三種:類(Classs)、數組類型(Array)、介面類型(Interface)。 引用在某種語義上等同於C\C++語言中的指針(Pointer),指向一個相應類型(類、數組、介面)的實例對象。
當一個引用類型不指向任何對象時,其值為一個特殊值:null。引用的默認值就是null。
例如,我們定義了一個Student學生類型: class Student {
private String mName; //姓名 private String mSex; //性別 private int mAge; //年齡 private String mSchool; //學校 … }
其中mAge成員變數為int整形,是基本數據類型,這樣在實例化、創建一個Student對象的時候,mAge變數自動賦值為0。但是對於其中的引用類型對象mName來說,此時只會分配一個引用,指向null, 當你想使用mName對象的時候,必須實例化(也即創建一個String類型的mName對象)之後才能使用,否則會引起異常報錯Java數據類型【Android基礎第6篇】
微價值網 星河

前面我們講了Android開發環境搭建,包括模擬器與真機調試方法,本期開始,我們逐步介紹Android應用開發中常用的一些Java編程基礎知識,包括數據類型、分支與循環控制、類與對象的設計、函數與介面等。
首先來看Java數據類型,總體上可以分為基本類型(數值型、字元型、布爾型)和引用類型兩種。

一、基本類型 1、數值型
包括整數類型(又包含byte、短整型short、整數int和長整型long)、 浮點類型(包含float以及雙精度double)。
其中,整數類型默認為int,浮點型默認為double,如果要表示long型數據或float型數據,要在相應的數值後面加上l、L或f、F,否則會出現編譯問題。
2、字元型
一個char類型型的變數,對應一個字元,例如』a』,這種類型的變數在Java中由兩個位元組(byte)組成。這種類型不區分正負,為無符號類型。
3、布爾類型
也即boolean類型,只有兩個取值:false和true。注意這種類型的變數,不能轉換成任何其他數據類型。

Java中所有的基本數據類型都有固定的取值范圍、佔用固定大小的內存空間,而不受具體操作系統的影響,這樣可以保證Java程序的跨平台、可移植性。
對於基本數據類型,一個需要注意的問題是類型轉換,包括自動轉換與強制轉換,在後面會結合實例詳細分析。
二、引用類型
引用類型可以分為三種:類(Classs)、數組類型(Array)、介面類型(Interface)。 引用在某種語義上等同於C\C++語言中的指針(Pointer),指向一個相應類型(類、數組、介面)的實例對象。
當一個引用類型不指向任何對象時,其值為一個特殊值:null。引用的默認值就是null。
例如,我們定義了一個Student學生類型: class Student {
private String mName; //姓名 private String mSex; //性別 private int mAge; //年齡 private String mSchool; //學校 … }
其中mAge成員變數為int整形,是基本數據類型,這樣在實例化、創建一個Student對象的時候,mAge變數自動賦值為0。但是對於其中的引用類型對象mName來說,此時只會分配一個引用,指向null, 當你想使用mName對象的時候,必須實例化(也即創建一個String類型的mName對象)之後才能使用,否則會引起異常報錯

㈡ Android Cursor(游標)解析

SQLiteDatabase db = dataBaseHelper.getWritableDatabase();
Cursor cursor = db.rawQuery("select *from User",null);
1.游標的行數:int getCount()

2.當前游標的位置:int getPosition()
返回的值從零開始, 當第一次返回行集時游標將位於位置 -1,即第一行之前。在返回最後一行之後,對 next() 的另一個調用將使游標離開最後一個條目,位於 count() 的位置。

3.從當前位置應用的偏移量:boolean move(int offset)
將游標從當前位置向前或向後移動一個相對量。 正偏移向前移動,負偏移向後移動。 如果最終位置在結果集的邊界之外,則結果位置將分別固定為 -1 或 count(),具體取決於該值是在集合的前端還是末尾。如果請求的目的地可達,此方法將返回 true,否則返回 false。

4.將游標移動到絕對位置:boolean moveToPosition(int position)
值的有效范圍是 -1 <= 位置 <= 計數。如果請求目的地可達,此方法將返回 true,否則返回 false。

5.將游標移動到第一行:boolean moveToFirst()

6.將游標移動到最後一行:boolean moveToLast()

7.將游標移動到下一行:boolean moveToNext()

8.將游標移動到上一行:boolean moveToPrevious()

9.返回遊標是否指向第一行:boolean isFirst()

10.返回遊標是否指向最後一行:boolean isLast()

11.返回遊標是否指向第一行之前的位置:boolean isBeforeFirst()

12.返回遊標是否指向最後一行之後的位置:boolean isAfterLast()

13.給定列名的從零開始的列索引,如果列名不存在,則返回 -1:int getColumnIndex(String columnName)

14.給定列名的從零開始的索引,如果該列不存在則拋出非法參數異常:int getColumnIndexOrThrow(String columnName) throws IllegalArgumentException

15.給定的從零開始的列索引處的列名:String getColumnName(int columnIndex)

16.返回一個字元串數組,其中按列在結果中的順序保存結果集中所有列的名稱。:String[] getColumnNames()

17.返回總列數:int getColumnCount()

18.各類型返回值
(1)以位元組數組的形式返回請求列的值:byte[] getBlob(int columnIndex)
(2)以字元串形式返回請求列的值:String getString(int columnIndex)
(3)以整數形式返回請求列的值:int getInt(int columnIndex)
(4)以 long 形式返回請求列的值:long getLong(int columnIndex)
(5)以浮點數形式返回請求列的值:float getFloat(int columnIndex)
(6)以雙精度形式返回請求列的值:double getDouble(int columnIndex)
(7)返回給定列值的數據類型:int getType(int columnIndex)
(8)列值是否為空:boolean isNull(int columnIndex)
(9)以短形式返回請求列的值:short getShort(int columnIndex)

19.檢索請求的列文本並將其存儲在提供的緩沖區中:void StringToBuffer(int columnIndex, CharArrayBuffer buffer)

20.關閉游標:void close()

21.游標是否關閉:boolean isClosed()

22.注冊一個觀察者,當支持此游標的內容發生變化時調用該觀察者:void registerContentObserver(ContentObserver observer)

23.銷毀注冊的觀察者:void unregisterContentObserver(ContentObserver observer)

24.注冊一個觀察者,當數據集的內容發生變化時被調用:void registerDataSetObserver(DataSetObserver observer)

25.銷毀注冊的觀察者:void unregisterDataSetObserver(DataSetObserver observer)

26.注冊以查看內容 URI 的更改。這可以是特定數據行的 URI,也可以是內容類型的通用URI:void setNotificationUri(ContentResolver cr, Uri uri)

cr是上下文,uri是需要觀看的內容
27.是否所有游標移動都應導致調用 onMove():boolean getWantsAllOnMoveCalls()

只有在此方法返回 true 時,才會跨進程調用 onMove()
28.返回一組額外的值:Bundle getExtras()

29.游標用戶與游標通信的帶外方式:Bundle respond(Bundle extras)
30.設置 Bundle 返回的getExtras():void setExtras(Bundle extras)

㈢ 如何在android平台上使用js直接調用Java方法

在Cocos2d-js 3.0beta中加入了一個新特性,在Android平台上我們可以通過反射直接在js中調用java的靜態方法。它的使用方法很簡單:
var o = jsb.reflection.callStaticMethod(className, methodName, methodSignature, parameters...)
在callStaticMethod方法中,我們通過傳入Java的類名,方法名,方法簽名,參數就可以直接調用Java的靜態方法,並且可以獲得Java方法的返回值。下面介紹的類名和方法簽名可能會有一點奇怪,但是Java的規范就是如此的。

類名
參數中的類名必須是包含Java包路徑的完整類名,例如我們在org.cocos2dx.javascript這個包下面寫了一個Test類:

package org.cocos2dx.javascript;
public class Test {
public static void hello(String msg){
System.out.println(msg);
}
public static int sum(int a, int b){
return a + b;
}
public static int sum(int a){
return a + 2;
}
}

那麼這個Test類的完整類名應該是org/cocos2dx/javascript/Test,注意這里必須是斜線/,而不是在Java代碼中我們習慣的點。

方法名
方法名很簡單,就是方法本來的名字,例如sum方法的名字就是sum。
方法簽名
方法簽名稍微有一點復雜,最簡單的方法簽名是()V,它表示一個沒有參數沒有返回值的方法。其他一些例子:
(I)V表示參數為一個int,沒有返回值的方法;
(I)I表示參數為一個int,返回值為int的方法;
(IF)Z表示參數為一個int和一個float,返回值為boolean的方法;

現在有一些理解了吧,括弧內的符號表示參數類型,括弧後面的符號表示返回值類型。因為Java是允許函數重載的,可以有多個方法名相同但是參數返回值不同的方法,方法簽名正是用來幫助區分這些相同名字的方法的。
目前Cocos2d-js中支持的Java類型簽名有下面4種:
參數可以是0個或任意多個,直接使用js中的number,bool和string就可以。
使用示例
我們將會調用上面的Test類中的靜態方法:
//調用hello方法
jsb.reflection.callStaticMethod("org/cocos2dx/javascript/Test", "hello", "(Ljava/lang/String)V", "this is a message from js");
//調用第一個sum方法
var result = jsb.reflection.callStaticMethod("org/cocos2dx/javascript/Test", "sum", "(II)I", 3, 7);
cc.log(result); //10
//調用第二個sum方法
var result = jsb.reflection.callStaticMethod("org/cocos2dx/javascript/Test", "sum", "(I)I", 3);
cc.log(result); //5
在你的控制台會有正確的輸出的,這很簡單吧。
注意
另外有一點需要注意的就是,在android應用中,cocos的渲染和js的邏輯是在gl線程中進行的,而android本身的UI更新是在app的ui線程進行的,所以如果我們在js中調用的Java方法有任何刷新UI的操作,都需要在ui線程進行。
例如,在下面的例子中我們會調用一個Java方法,它彈出一個android的Alert對話框。

//給我們熟悉的AppActivity類稍微加點東西
public class AppActivity extends Cocos2dxActivity {
private static AppActivity app = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
app = this;
}

public static void showAlertDialog(final String title,final String message) {
//這里一定要使用runOnUiThread
app.runOnUiThread(new Runnable() {
@Override
public void run() {
AlertDialog alertDialog = new AlertDialog.Builder(app).create();
alertDialog.setTitle(title);
alertDialog.setMessage(message);
alertDialog.setIcon(R.drawable.icon);
alertDialog.show();
}
});
}
}

然後我們在js中調用
jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AppActivity", "showAlertDialog", "(Ljava/lang/String;Ljava/lang/String;)V", "title", "hahahahha");
這樣調用你就可以看到一個android原生的Alert對話框了。

再加點料

現在我們可以從js調用Java了,那麼能不能反過來?當然可以! 在你的項目中包含Cocos2dxJavascriptJavaBridge,這個類有一個evalString方法可以執行js代碼,它位於frameworks\js-bindings\bindings\manual\platform\android\java\src\org\cocos2dx\lib文件夾下。我們將會給剛才的Alert對話框增加一個按鈕,並在它的響應中執行js。和上面的情況相反,這次執行js代碼必須在gl線程中進行。
alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
//一定要在GL線程中執行
app.runOnGLThread(new Runnable() {
@Override
public void run() {
Cocos2dxJavascriptJavaBridge.evalString("cc.log(\"Javascript Java bridge!\")");
}
});
}
});

這樣在點擊OK按鈕後,你應該可以在控制台看到正確的輸出。evalString可以執行任何js代碼,並且它可以訪問到你在js代碼中的對象。

㈣ android中怎麼把float轉換成Int

1、採用強轉的方式

floata=1.1L;//定義一個float型變數,變數名為a,值為1.1,L表示是浮點型
intb=(int)a;//用(int)強制轉換為整型b

2、採用Math.round方式

floata=1.1L;//定義一個float型變數,變數名為a,值為1.1,L表示是浮點型
intb=Math.round(a);//採用round方式轉換為整型

㈤ android 數據存儲的幾種方式

總體的來講,數據存儲方式有三種:一個是文件,一個是資料庫,另一個則是網路。其中文件和資料庫可能用的稍多一些,文件用起來較為方便,程序可以自己定義格式;資料庫用起稍煩鎖一些,但它有它的優點,比如在海量數據時性能優越,有查詢功能,可以加密,可以加鎖,可以跨應用,跨平台等等;網路,則用於比較重要的事情,比如科研,勘探,航空等實時採集到的數據需要馬上通過網路傳輸到數據處理中心進行存儲並進行處理。 對於Android平台來講,它的存儲方式也不外乎這幾種,按方式總體來分,也是文件,資料庫和網路。但從開發者的角度來講它可以分為以下五種方式: 1.SharedPreferences共享偏好 2.Internal Storage內部存儲空間 3.External Storage外部存儲空間 4.SQLite Database資料庫 5.Internet網路 這幾種方式各自有各自的優點和缺點,要根據不同的實際情況來選擇,而無法給出統一的標准。下面就各種方式談談它們的優缺點,以及最合適的使用情況: 1.Shared Preferences共享偏好 SharedPreferences是用來存儲一些Key/Value類似的成對的基本數據類型,注意,它只能存儲基本數據類型,也即int, long, boolean, String, float。事實上它完全相當於一個HashMap,唯一不同的就是HashMap中的Value可以是任何對象,而SharedPreferences中的值只能存儲基本數據類型(primitive types)。 對於它的使用方法,可以參考Android Developer Guide,這里不重復。 如此來看,最適合SharedPreferences的地方就是保存配置信息,因為很多配置信息都是Key/Value。事實上,在Android當中SharedPreferences使用最多的地方也是用來保存配置(Settings)信息,系統中的Settings中這樣,各個應用中的Settings也是這樣。並且,Android中為了方便的使用SharedPreferences保存配置信息,它來專門有PreferenceActivity用來封裝。也就是說如果你想在應用程序中創建配置(Settings),你可以直接使用PreferenceActivity和一些相關的專門為Preference封裝的組件,而不用再直接去創建,讀取和保存SharedPreference,Framework中的這些組件會為你做這些事。 再談談一些使用SharedPreference時的技巧,它只能保存基本數據類型,但假如我想保存一個數組,怎麼辦?可以把數據進行處理,把它轉化成一個String,取出的時候再還原就好了;再如,如想保存一個對象,怎麼辦,同樣,可以把對象序列化成為字元序列,或轉成String(Object.toString()),或是把它的HashCode(Object.hashCode())當成Value保存進去。 總之,SharedPreferences使用起來十分的方便,可以靈活應用,因為它簡單方便,所以能用它就盡量不要用文件或是資料庫。 1.Internal Storage內部存儲空間 所謂的內部存儲與外部存儲,是指是否是手機內置。手機內置的存儲空間,稱為內部存儲,它是手機一旦出廠就無法改變,它也是手機的硬體指標之一,通常來講手機內置存儲空間越大意味著手機價格會越貴(很多地方把它稱為手機內存,但我們做軟體的知道,這並不準確,內存是指手機運行時存儲程序,數據和指令的地方;這里應該是手機內部存儲的簡稱為內存,而並非嚴格意義上的內存)。 內部存儲空間十分有限,因而顯得可貴,所以我們要盡可能避免使用;另外,它也是系統本身和系統應用程序主要的數據存儲所在地,一旦內部存儲空間耗盡,手機也就無法使用了。所以對於內部存儲空間,我們要盡量避免使用。上面所談到的Shared Preferences和下面要談到的SQLite資料庫也都是存儲在內部存儲空間上的。 Android本身來講是一個Linux操作系統,所以它的內部存儲空間,對於應用程序和用戶來講就是「/data/data"目錄。它與其他的(外部的存儲)相比有著比較穩定,存儲方便,操作簡單,更加安全(因為可以控制訪問許可權)等優點。而它唯一的缺點就是它比較有限,比較可貴。 雖然,可以非常容易的知道程序本身的數據所在路徑,所有的應用程序的數據路徑都是「/data/data/app-package-name/」,所有的程序用到的數據,比如libs庫,SharedPreferences都是存放在這個路徑下面。但我們在使用的時候最好不要,或是千萬不要直接引用這個路徑。 使用內部存儲主要有二個方式,一個是文件操作,一個是文件夾操作。無論哪種方式,Context中都提供了相應的函數來支持,使用Context不但操作簡單方便,最重要的是Context會幫助我們管理這些文件,也可以方便幫助我們控制文件的訪問許可權。先來系統的說下Context中關於文件和文件夾操作的函數有哪些。 a. 創建一個文件,並打開成一個文件輸出流,需要提供一個String,作為文件名 1.FileOutputStream output = Context.openOutputFile(filename, Context.MODE_PRIVATE); 2.output.write(data);// use output to write whatever you like 3.output.close(); 1.FileOutputStream output = Context.openOutputFile(filename, Context.MODE_PRIVATE); output.write(data);// use output to write whatever you like output.close(); b. 同樣,想打開一個文件作為輸入的話,也是只需要提供文件名 1.FileInputStream input = Context.openInputFile(filename); 2.input.read(); 3.input.close(); 1.FileInputStream input = Context.openInputFile(filename); input.read(); input.close(); c. 列出所有的已創建的文件 1.String[] files = Context.fileList(); 2.for (String file : files) { 3. Log.e(TAG, "file is " + file); 4.} 1.String[] files = Context.fileList(); for (String file : files) { Log.e(TAG, "file is " + file); } d. 刪除文件,能創建就要能夠刪除,當然也會提供了刪除文件的介面,它也非常簡單,只需要提供文件名 1.if (Context.deleteFile(filename)) { 2. Log.e(TAG, "delete file " + filename + " sucessfully「); 3.} else { 4. Log.e(TAG, "failed to delete file " + filename); 5.} 1.if (Context.deleteFile(filename)) { Log.e(TAG, "delete file " + filename + " sucessfully「); } else { Log.e(TAG, "failed to delete file " + filename); } e. 獲取文件已創建文件的路徑,它返回一個文件對象用於操作路徑 1.File fileDir = Context.getFileDir(); 2.Log.e(TAG, "fileDir " + fileDir.getAbsolutePath(); 1.File fileDir = Context.getFileDir(); Log.e(TAG, "fileDir " + fileDir.getAbsolutePath(); f. 創建一個目錄,需要傳入目錄名稱,它返回 一個文件對象用到操作路徑 1.File workDir = Context.getDir(dirName, Context.MODE_PRIVATE); 2.Log.e(TAG, "workdir " + workDir.getAbsolutePath(); 1.File workDir = Context.getDir(dirName, Context.MODE_PRIVATE); Log.e(TAG, "workdir " + workDir.getAbsolutePath(); g. 以File對象方式查看所創建文件,需要傳入文件名,會返迴文件對象 1.File store = Context.openFileStreamPath(filename); 2.Log.e(TAG, "store " + store.length()); 1.File store = Context.openFileStreamPath(filename); Log.e(TAG, "store " + store.length()); h. 獲取Cache路徑,無需要傳入參數,返迴文件對象 1.File cachedir = Context.getCacheDir(); 2.Log.e(TAG, "cachedir " + cacheDir.getAbsolutePath()); 1.File cachedir = Context.getCacheDir(); Log.e(TAG, "cachedir " + cacheDir.getAbsolutePath()); 總結一下文件相關操作,可以得出以下三個特點: 1. 文件操作只需要向函數提供文件名,所以程序自己只需要維護文件名即可; 2. 不用自己去創建文件對象和輸入、輸出流,提供文件名就可以返回File對象或輸入輸出流 3. 對於路徑操作返回的都是文件對象。 如前所述,內部存儲空間有限,可貴,安全,穩定,所以應該用來保存比較重要的數據,比如用戶信息資料,口令秘碼等不需要與其他應用程序共享的數據。也可以用來創建臨時文件,但一定要注意及時刪除。另外,對於內部存儲還有一個非常重要的特點,那就是在應用程序被卸載時,應用程序在內部存儲空間的文件數據將全部被刪除。系統這樣做的原因很簡單,就是因為內部存儲很有限,它必須保證它的可用性,因為一旦添滿,系統將無法再正常工作。 1.External Storage外部存儲空間 再來談談手機外部存儲空間,與內部存儲空間相對,外部存儲空間是指手機出廠的時候不存在,用戶在使用時候可以自由添加的外部存儲介質比如TS卡,SD卡等快閃記憶體儲介質。這些快閃記憶體介質由最初的空間小價格貴,到現在的大容量價格便宜,所以幾乎每個支持外部存儲的手機上面都有大容量(大於等於2G)的快閃記憶體卡。 Android也是不例外,它完全支持外部存儲介質。其實更確切的說,它是要依賴於外部存儲卡的,因為對於Android系統,如果沒有外部存儲卡,很多的系統應用無法使用,比如多媒體相關的應用程序無法使用。雖然Android很依賴,但是外部存儲卡也有它自身的特點,它最大的優點就是存儲空間大,基本上你可無限制的使用,也不怎麼擔心去清除數據。就目前來看,很多程序都在使用外部存儲卡,但很少有程序去主動清理數據,所以無論你的SD卡有多大,它的可用空間卻越來越少。與內部存儲不同的是,當程序卸載時,它在外部存儲所創建的文件數據是不會被清除的。所以清理外部存儲空間的責任丟給了用戶自己,每隔一段時間就去查看下SD卡,發現無用數據立馬刪除。外部存儲的缺點就是不是很穩定,對於Android手機來講可以說,很不穩定,本身快閃記憶體介質就容易出問題,SD卡處於不能正常使用的狀態十分多。 先來說說外部存儲相關的使用方法和API: a. Check media availability檢查介質的可用性 如前所述,外部存儲介質的穩定性十分的差,所以在使用之前一定要先檢查它的可用性,如果可用再去用 view plain to clipboardprint? 1.final String state = Environment.getExternalStorageState(); 2.if (state.equals(Environment.MEDIA_MOUNTED) || state.equals(Environment.MEDIA_READ_ONLY)) {// sd card is ready to us } view plain to clipboardprint? 1.final String state = Environment.getExternalStorageState(); if (state.equals(Environment.MEDIA_MOUNTED) || state.equals(Environment.MEDIA_READ_ONLY)) {// sd card is ready to us } final String state = Environment.getExternalStorageState(); if (state.equals(Environment.MEDIA_MOUNTED) || state.equals(Environment.MEDIA_READ_ONLY)) {// sd card is ready to us } b. Get the directory獲取外部存儲卡的路徑 事實上,外部存儲卡的路徑是「/mnt/sdcard",所以你直接這樣寫去訪問也能訪問的到。鑒於可讀性和可移植性的考慮,建議這樣寫: view plain to clipboardprint? 1.File sdcardDir = Environment.getExternalStorageDirectory(); view plain to clipboardprint? 1.File sdcardDir = Environment.getExternalStorageDirectory(); File sdcardDir = Environment.getExternalStorageDirectory(); c. For API 8 or greater, there are some other useful APIs helping to manager files and directories. 如果你使用API 8(Android 2.2)或者更高,那麼SDK中又多了幾個操作外部存儲文件和路徑的介面,文檔中也建議開始者更加規范的使用SD卡。比如,創建相應的目錄去存儲相應的數據,Music,Picture,Video等。應用程序目錄也變成了"/Android/data/package-name/data"。具體的使用可以參考文檔,這里不重復。當然,就像編程規范一樣,這里只是規范,你完全可以不遵守它,但出於可讀性和可移植性,還是建議按照文檔建議的去做。 下面總結一下使用時應該注意的一些和外部存儲的特點: a. 外部存儲卡不是隨時想用就能夠用的,所以一定要記得在使用之前檢查它的可用性 b. 存儲在外部存儲卡上的數據是所有應用程序都可見,用戶也可見(使用FileManager),所以安全性不是很好,雖然文檔聲稱可以在外部存儲卡上寫程序私有數據,但貌似沒用,用FileManager仍然可以刪除或編輯文件(Market上面的FileManager功能都十分的強大,能讓用戶看到SD卡中的所有文件,和操作能看到的文件)。 c. Android手機支持把外部存儲卡Mount至PC做為U盤,當連接數據線時,這時SD卡變成了U盤連接到了另外的操作系統中。什麼意思,就是在Android當中雖然有的文件屬性(隱藏,私有等),到了PC上就不一定管用了,用戶在PC上可以隨意操作文件(這就是第二點中所提及的)。 d. 如果使用外部存儲卡保存數據,一定要額外做好異常處理:外部存儲卡不可用時把數據存入哪裡;可用的時候再怎麼同步數據(這是比較頭疼的地方,可行的做法就是當SD卡不可用時不準用戶寫數據,但這用戶體驗又不是很好,但如你所知,很多應用都這么干);你的數據被破壞了。當然常見的異常也要考慮,比如空間滿了,無法寫入,磁碟壞道等。 1.SQLite Database資料庫 Android對資料庫的支持很好,它本身集成了SQLite資料庫,每個應用都可以方便的使用它,或者更確切的說,Android完全依賴於SQLite資料庫,它所有的系統數據和用到的結構化數據都存儲在資料庫中。 它具有以下優點: a. 效率出眾,這是無可否認的 b. 十分適合存儲結構化數據 c. 方便在不同的Activity,甚至不同的應用之間傳遞數據 先前有一篇文章講到了不同Activity和不同應用之間傳遞數據的麻煩,特別是對於大型數據結構,因為Activity雖是Java對象,但去無法像使用其他類對象那樣去創建一個實例然後使用它,更無法給Activity加上Setters和Getters(雖然這樣做了沒有編譯錯誤)。比較好的解決方案就是把結構化數據寫入資料庫,然後在不同的Activity之間傳遞它們的Uri。 d. 由專門的ContentProvider來幫忙管理和維護資料庫 e. 可以方便的設置訪問許可權,私有還是都可見 f. 操作方便,使用標準的CRUDE語句,ContentResolver.query(), update(), delete() insert(),詳見ContentResolver g. 良好的可移植性和通用性,用標準的SQL語句就能實現CRUDE 對於它的使用方法可以去參考文檔,這里也說不清楚。 1.Internet網路 網路是比較不靠譜的一個,因為移動終端的網路穩定性,以及所產生的流量讓人傷不起,用戶更傷不起。但若是對於非常重要的實時數據,或是需要發送給遠端伺服器處理的,也可以考慮使用網路實時發送。這已經有先例了,Apple和Google就是這樣,iPhone設備和Android設備都會在用戶不知情的情況 下收集用戶的信息,然後又在用戶不知情的情況 下發送到Apple和Google的伺服器上,也就是所謂的「跟蹤門」。除此之外,智能手機(特別是Android和火熱的iPhone)上面的應用程序都會偷偷的在後台運行,收集用戶數據,然後再偷偷的發伺服器,直接傷害是用戶流量,請看先前的文章。 對比這幾種方式,可以總結下: 1. 簡單數據和配置信息,SharedPreference是首選; 2. 如果SharedPreferences不夠用,那麼就創建一個資料庫 3. 結構化數據,一定要創建資料庫,雖然這稍顯煩鎖,但是好處無窮 4. 文件就是用來存儲文件(也即非配置信息或結構化數據),如文本文件,二進制文件,PC文件,多媒體文件,下載的文件等等。 5. 盡量不要創建文件 6. 如果創建文件,如果是私密文件或是重要文件,就存儲在內部存儲,否則放到外部存儲 7. 不要收集用戶數據,更不要發到網路上,雖然你們也有很多無奈。用戶也無奈,也無辜,但更無助 平台為開發者准備了這么多的方式固然是一件好事,但我們要認清每一種的優點和缺點,根據實際情況選擇最合適的。還有一個原則就是最簡單原則,也就是說能用簡單的方式處理,就不要用復雜的方式。比如存儲幾個數據或簡單對象,用SharedPreference也能做到,何必還去寫個ContentProvider呢?

熱點內容
安卓市場怎麼安 發布:2025-02-08 03:23:59 瀏覽:750
蘋果如何關閉軟體緩存 發布:2025-02-08 03:18:59 瀏覽:427
安卓手機特惠訂單功能在哪裡關閉 發布:2025-02-08 03:18:58 瀏覽:490
電腦什麼配置可以流暢玩星際戰甲 發布:2025-02-08 03:18:49 瀏覽:513
千葉加密平台 發布:2025-02-08 03:16:12 瀏覽:258
il腳本 發布:2025-02-08 03:08:49 瀏覽:315
我的世界介紹神奇寶貝伺服器 發布:2025-02-08 03:02:52 瀏覽:748
咪咕音樂linux 發布:2025-02-08 02:53:04 瀏覽:410
我的世界手機版大陸練習伺服器 發布:2025-02-08 02:50:43 瀏覽:213
php的特點與優勢 發布:2025-02-08 02:43:16 瀏覽:719