① android 靜態常量和枚舉哪個好
常量是直接編譯在代碼中的,而枚舉則是一種類,你可以通過反射根據值反查出它的枚舉形式是什麼。
枚舉定義了值的范圍,但是常量沒有。所以要根據你的實際情況選擇。
比如你有一個變數,是中國所有的省,那麼最好用枚舉,因為這些是固定不變的。在代碼里使用的時候更方便,也易懂。
② android OneActivity.java和TwoActivity.java的可不可以定義相同名稱的常量 A = "abc.com.a";
沒有問題 但是 表達的含義 有些混亂,我一般是定義一個public類,存放指定名稱的靜態變數,比如A跳轉到B 需要把userID 傳過去,則定一個BUNLD_USERID 靜態變數,值隨便取,在接受時同樣取BUNLD_USERID 靜態變數
③ android的data字元串常量是什麼意思
靜態變數就是一個類中的靜態成員屬性,存在data segment中,是data segment OK?不是segmeng,只存一份,字元串常量也是存在data segment中的,也只是存一份。
④ 為什麽Android源碼中的常量用十六進製表示
只是表示習慣,計算機數據是二進制的。
一個16進制位表示0-15,二進制就是0b0000-0b1111,是4個bit位,兩個十六進制位正好表示一個位元組。
十六進制正好表示位元組數據,比較符合計算機專業人士的習慣。
所以一個int數通常是4位元組正好寫成0x00000000-0xFFFFFFFF。
格式上美觀,也符合專業習慣。其實和用十進制是一樣的。
類似的一個8進制只是2的3次方 0b000-0b111。
⑤ Android的String常量是寫在Strings.xml裡面還是寫在常量類中
這個都是隨意,看自己使用哪種方式方便
還可以寫在當前頁面或者類中,這些都是編碼習慣的問題
沒有強制要求,也不是什麼規范
因為它們都是提前放到了內存中,也不存在什麼哪種方式具有優點
⑥ Android 靜態常量對象什麼時候被回收
Java Heap分為3個區
1.Young 年輕代
2.Old 老年代
3.Permanent 持久代,也有的JVM實現里叫 Method Area 方法區,具體取決於JVM實現. 所有類信息,類的靜態變數都在 持久代 中
當你new 一個對象,申請內存的時候,首先是在年輕代中申請內存.如果失敗了,會觸發一次 Minor GC.Minor GC只會釋放 年輕代 中的內存,並把仍存活的且符合條件的 對象 從年輕代 移入老年代.
如果Minor GC後 內存仍然不足,此時會觸發一次 Full GC.
⑦ Android 許可權常量保存在哪個類中
1. 保存鍵值對(Saving Key-Value Sets)
如果你要存儲存儲小型的鍵值對(key-value)數據集的話,可以使用SharedPreferences API。SharedPreferences對象是一個包含鍵值對的文件,提供了讀和寫的方法。每一個SharedPreferences文件都被框架(framework)管理,並且既可以是私有的,也可以使公有的。以下內容主要是:使用SharedPreferences APIs 來存儲和檢索簡單的數值。
Write to Shared Preferences
要寫入數據,
1.先在SharedPreferences通過調用edit()方法創建一個SharedPreferences.Editor 。
2.通過putInt()和putString()來把鍵值對寫入,
3.然後調用commit()方法來保存。
For example:
//新建一個SharedPreferences文件,設定為private模式
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
//新建一個editor對象,通過SharedPreferences對象的edit()方法。
SharedPreferences.Editor editor = sharedPref.edit();
//調用editor的putInt()方法,參數就是鍵值對。
editor.putInt(getString(R.string.saved_high_score), newHighScore);
//調用editor的commit()方法,保存。
editor.commit();
Read from Shared Preferences
調用SharedPreferences對象的getInt()方法和getString()方法,讀取SharedPreferences文件。參數可以寫default,也可以寫key。返回值都是value。
//創建一個SharedPreferences對象
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
//參數我default情況
long default = getResources().getInteger(R.string.saved_high_score_default));
//參數為(key,default)情況
long highScore = sharedPref.getInt(getString(R.string.saved_high_score), default);
2.保存文件(saving files)
android系統里對文件進行讀寫,主要使用了File APIs。
File對象主要用來讀寫大的數據量。比如圖像文件、通過網路交換的文件。
以下內容基於讀者已經了解Linux文件系統以及java.io里的標准文件輸入輸出API。
內部存儲Internal storage的特點:
1.一直可用
2.是默認程序的默認文件訪問位置,其他app訪問不了。
3.卸載app時,系統會刪除這個app所有文件
Internal storage 可以確保用戶和其他app無法訪問你的文件。很好的私密性。
外部存儲External storage的特點:
1.並非一直可用。可以插在卡槽,但是卸載掉,這時候系統就看不到了,或者用戶把sd卡當U盤使。
2.文件存儲不安全。sd卡拿出來,裡面的信息就泄露了。
3.卸載app時,只有你在路徑getExternalFilesDir()保存文件的時候,系統才可以刪除這個app的文件。
如果不在這個路徑的話,那SD卡上就會有殘留文件了。
如果文件沒有訪問限制,或者你想讓文件為其他app所用,或者希望通過電腦查看,外部存儲不失為一種好方法。
TIPS:可以設置manifest文件里的android:installLocation屬性來讓app裝在外部存儲。
Obtain Permissions for External Storage
要向外部存儲寫文件,必須在manifest文件里聲明WRITE_EXTERNAL_STORAGE許可權。
<manifest ...>
<uses-permission
//寫入外部存儲文件的許可權
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
/>
...
</manifest>
注意:目前,所有的app都可以讀取外部存儲上的文件,不需要特殊的許可權。但是以後這個肯定要改的,讀取外部存儲的文件也是需要許可權的。所以也要在manifest文件里聲明READ_EXTERNAL_STORAGE許可權。
<manifest ...>
<uses-permission
//讀取外部存儲文件的許可權
android:name="android.permission.READ_EXTERNAL_STORAGE"
/>
...
</manifest>
往內部存儲寫文件是不需要許可權的,從內部存儲讀文件也是不需要許可權的。
所以內外存儲文件還有許可權上的區別:外部的要許可權,內部的不需要。
Save a File on Internal Storage
保存一個文件到內部存儲的時候,需要獲得一個存儲路徑,方法有二:
1.getFilesDir()--------返迴文件File路徑
2.getCacheDir()--------返回一個緩存文件路徑
臨時緩存文件里存放著temporary cache files,確保不用這些文件的時候刪除,並有size上的控制,系統在低存儲空間的時候,會直接刪除這個臨時文件夾內容。
在存儲路徑上創建文件時候,使用File()構造器,參數為路徑,和文件名稱。
//使用File()構造器,參數1:文件路徑 參數2:文件名稱
File file = new File(context.getFilesDir(), filename);
或者,可以調用openFileOutput()方法來獲取FileOutputStream,來向內部存儲路徑寫文件。
String filename = "myfile";
String string = "Hello world!";
FileOutputStream outputStream;
try {
//調用方法創建流,參數1:文件名參數2:文件類型為私有
putStream = openFileOutput(filename, Context.MODE_PRIVATE);
//調用流的write方法
outputStream.write(string.getBytes());
//關閉流
outputStream.close();
}
catch (Exception e) {
e.printStackTrace();
}
如果要創建一個緩存文件,就要用createTempFile()方法。
以下代碼從url提取文件name,然後用那個name在緩存文件夾創建一個文件。
public File getTempFile(Context context, String url) {
File file;
try {
String fileName = Uri.parse(url).getLastPathSegment();
file = File.createTempFile(fileName, null, context.getCacheDir());
catch (IOException e) {
// Error while creating file
}
return file;
}
注意:app的內部存儲路徑是由你的app的包的名稱指定的,在android文件系統的特定位置。技術上看,如果你把文件mode設置為可讀,其他app是可以讀取你的app的數據的。但是其他app要想讀取,必須要知道你的包的名稱和文件的名稱。除非你明確設定file mode為readable或者writable,否則其他app肯定沒法讀和寫你的internal file。 所以,只要你把文件mode設置為Context.MODE_PRIVATE,其他app是無論如何也沒法訪問到這個文件的。
Save a File on External Storage
因為外部存儲有可能不可用,所以用之前要查詢一下外部存儲的狀態,使用之前肯定要查一下外部存儲的可用空間。調用getExternalStorageState()方法,如果返回的狀態是MEDIA_MOUNTED的話,外部存儲就是可用的,包括讀和寫。
//檢查外部存儲是否可以讀和寫
public boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
return true;
}
return false;
}
//查看外部存儲是否至少可讀
public boolean isExternalStorageReadable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state) ||
Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
return true;
}
return false;
}
有兩個文件夾來存放文件:
1.公共文件夾(Public files)
其他用戶和app都可以訪問,app卸載以後,文件仍然存在,其他app和用戶可以繼續使用。
比如:app拍的照片
2.私有文件夾(Private files)
文件私有,其他用戶和app無權訪問。app卸載以後,文件即被刪除。盡管文件存儲在外部存儲上,其他用戶
和app是可以訪問的,但是實際上,這些文件是不會向app以外的其他用戶提供數據的。、
比如:app下載的內容和臨時文件
存儲public文件到外部存儲:調用()方法。這個方法有個參數,來指定你要存儲文件的類型,這樣,其他公共文件夾就可以將其包括進去。比如 DIRECTORY_MUSIC和 DIRECTORY_PICTURES。
public File getAlbumStorageDir(String albumName) {
// 獲取用戶公共圖片文件夾路徑
File file = new File(Environment.(
Environment.DIRECTORY_PICTURES), albumName);
if (!file.mkdirs()) {
Log.e(LOG_TAG, "Directory not created");
}
return file;
}
存儲public文件到外部存儲:調用()方法。這個方法有個參數,來指定你要存儲文件的類型,這樣,其他公共文件夾就可以將其包括進去。比如 DIRECTORY_MUSIC和 DIRECTORY_PICTURES。
public File getAlbumStorageDir(String albumName) {
// 獲取用戶公共圖片文件夾路徑
// 參數1:Environment.(Environment.DIRECTORY_PICTURES)
// 參數2:albumName
File file = new File(Environment.(
Environment.DIRECTORY_PICTURES), albumName);
if (!file.mkdirs()) {
Log.e(LOG_TAG, "Directory not created");
}
return file;
}
存儲private文件到外部存儲:調用getExternalFilesDir()方法,也要傳入一個指定文件類型的參數。以下是創建一個私人相冊的文件的代碼:
public File getAlbumStorageDir(Context context, String albumName) {
// 獲取應用的私人相冊文件路徑
//參數1:context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)
//參數2:albumName
File file = new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), albumName);
if (!file.mkdirs()) {
Log.e(LOG_TAG, "Directory not created");
}
return file;
}
也可以調用 getExternalFilesDir()方法,傳如null參數,這樣就會返回外部存儲的根目錄。
記住:
1. getExternalFilesDir()方法創建的文件路徑,會在用戶卸載這個app的時候被刪除。
2. 如果想讓你的文件路徑在app被卸載以後仍然存在,那麼() 是一個更好的選擇。
3.無論是建立可以共享的文件路徑,還是私有文件路徑,使用API 常量來指定文件目錄類型是很重要的。比如,DIRECTORY_PICTURES,這可以確保系統正確的識別目錄里的數據。
Query Free Space
如果你事先知道要存儲的數據量的大小,你就可以先查詢一下可用空間有多少, 這樣就可以避免IOException,可用的方法是:getFreeSpace()和getTotalSpace()。
getFreeSpace()---返回剩餘空間
getTotalSpace()---返回總空間。
但是返回的可用空間大小,並不說明,你就可以存入這么多的數據。如果空間比你要存入的數據大幾M,或者空間被佔用率小於90%,都還可以,反之,就未必能存入。
並不需要每次存文件之前都來這么個判斷,加個異常捕捉就OK。而且,你也未必知道你要存入的數據有多大,你想判斷,也沒法判斷的,所以能catch這個IOException就行。
Delete a File
刪除文件最簡單的方法是調用文件本身的方法:delete()
myFile.delete();
如果文件存儲在內部存儲介質上,可以利用上下文的方法:deleteFile()
myContext.deleteFile(fileName);
注意:當用戶卸載app時候,系統會刪除以下文件:
1.所有存儲在內部介質上的數據
2.使用getExternalFilesDir()創建路徑的外部介質上的數據
但是,所有緩存文件夾是需要手動刪除的
⑧ android如何調用自定義類中的常量
常量用類名.常量名的方式調用
例如
class Test{
public static final int FINAL_VALUE = 1;
}
然後在任意類中都可以使用
Test.FINAL_VALUE來調用
⑨ android aidl 可以定義常量嗎
我也遇到了這個問題,按照stackoverflow的方法沒解決,上兩個我找到的方法吧, 1.鏈接在此:Android Studio下如何配置AIDL文件,先在main目錄下新建一個文件夾,命名為aidl,再在該目錄下新建一個包,包名跟AndroidManifest中的package同名詳細的可以看看安卓巴士:http://www.apkbus.com/thread-463300-1-1.html