最近公司的APP要實現進入APP的時候使用者手動選擇地區,然後在登入,這個時候其實是選擇的對應的伺服器位址,然而在實現過程中,我發現SharedPreferences在首頁始終讀取不到最新的伺服器位址,然而登入頁面的伺服器位址又是最新更改的,比如說我剛開始進入的研發伺服器,後面切換為測試伺服器,然后里面的資料還是讀取的 研發伺服器的,後來列印發現首頁伺服器位址始終不是讀取的當前最新地址,最後看了下,APP的兩個service並沒有運行在同一進程,讀取不到資料,最後切換讀模數式為多進程模式,然後就讀取到了,
shared=getContext().getSharedPreferences("config",MODE_MULTI_PROCESS);
然而這樣是讀取到了最新的伺服器位址,後來又發現當切換為案頭,把APP掛在後台,在切回前台的時候,APP的伺服器位址又變回了之前的地址了,我想這個應該是要在儲存狀態的時候重新儲存到別的變數中去吧,切回來的時候再去讀取儲存的變數來實現伺服器位址的統一,後來乾脆換了一種方式實現儲存伺服器位址,使用Properties索引值對來儲存伺服器位址,這樣沒什麼問題
package com.shangyi.utils;import android.annotation.SuppressLint;import android.content.Context;import android.os.Environment;import android.os.StatFs;import android.text.TextUtils;import android.util.Log;import com.shangyi.log.SyLog;import java.io.BufferedInputStream;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.util.ArrayList;import java.util.Enumeration;import java.util.List;import java.util.Map;import java.util.Properties;/** * 檔案操作工具類 * * @version 1.0 */public class FileUtils { private static final String TAG = FileUtils.class.getSimpleName(); /** * 寫入Properties資訊 * * @param context 內容物件 * @param fileName 檔案名稱,不帶尾碼 * @param pKey 要儲存資料的key * @param pValue 資料 * @throws IOException */ public static void WriteProperties(Context context, String fileName, String pKey, String pValue) throws IOException { //this.getFilesDir(); 這個是得到當前app目錄下的files目錄路徑 //this.getCacheDir(); 這個是得到當前app目錄下的cache目錄路徑 String filePath = context.getFilesDir() + "/" + fileName + ".properties"; File file = new File(filePath); if (!file.exists()) {//檢查目錄檔案是否存在,不存在則建立 file.createNewFile(); } Properties pps = new Properties(); InputStream in = new FileInputStream(filePath); pps.load(in);//從輸入資料流中讀取屬性列表(鍵和元素對) OutputStream out = new FileOutputStream(filePath);//調用 Hashtable 的方法 put。使用 getProperty 方法提供並行性。 //強制要求為屬性的鍵和值使用字串。傳回值是 Hashtable 調用 put 的結果。 pps.setProperty(pKey, pValue); //以適合使用 load 方法載入到 Properties 表中的格式, //將此 Properties 表中的屬性列表(鍵和元素對)寫入輸出資料流 pps.store(out, "Update " + pKey + " name"); } /** * 根據Key讀取Value * * @param context * @param fileName 檔案名稱,不包含尾碼 * @param key * @return */ public static String getValueByKey(Context context, String fileName, String key) { String filePath = context.getFilesDir() + "/" + fileName + ".properties"; Properties pps = new Properties(); try { InputStream in = new BufferedInputStream(new FileInputStream(filePath)); pps.load(in); String value = pps.getProperty(key); System.out.println("---------------------------------------------------------------------"); System.out.println(key + " = " + value); System.out.println("---------------------------------------------------------------------"); return value; } catch (IOException e) { e.printStackTrace(); return null; } } /** * 讀取Properties的全部資訊 * * @param context * @param fileName * @throws IOException */ public static void getAllProperties(Context context, String fileName) throws IOException { String filePath = context.getFilesDir() + "/" + fileName + ".properties"; Properties pps = new Properties(); InputStream in = new BufferedInputStream(new FileInputStream(filePath)); pps.load(in); Enumeration en = pps.propertyNames(); //得到設定檔的名字 while (en.hasMoreElements()) { String strKey = (String) en.nextElement(); String strValue = pps.getProperty(strKey); System.out.println(strKey + "=" + strValue); } } /** * 刪除該目錄下的檔案 * * @param path */ public static void delFile(String path) { if (!TextUtils.isEmpty(path)) { File file = new File(path); if (file.exists()) { file.delete(); } } } /** * 根據檔案名稱清空所有資料 * @param context * @param fileName * @throws IOException */ public static void clearAllProperties(Context context,String fileName) throws IOException{ String filePath = context.getFilesDir() + "/" + fileName + ".properties"; boolean d=deleteFileWithPath(filePath); /* if(d){ ToastUtil.defaultToast(context.getApplicationContext(),"刪除成功"); }else { ToastUtil.defaultToast(context.getApplicationContext(),"刪除失敗"); }*/ /* Properties pps = new Properties(); InputStream in = new BufferedInputStream(new FileInputStream(filePath)); pps.load(in); pps.clear();//清楚所有資料*/ } /** * 寫文字檔 在Android系統中,檔案儲存在 /data/data/PACKAGE_NAME/files 目錄下 * * @param context * @param fileName * @param content */ public static void write(Context context, String fileName, String content) { if (content == null) content = ""; try { //MODE_PRIVATE 預設模式,檔案只可以被調用該方法的應用程式訪問 //MODE_APPEND 如果檔案已存在就向該檔案的末尾繼續寫入資料,而不是覆蓋原來的資料。 //MODE_WORLD_READABLE 賦予所有的應用程式對該檔案讀的許可權。 //MODE_WORLD_WRITEABLE 賦予所有的應用程式對該檔案寫的許可權。 FileOutputStream fos = context.openFileOutput(fileName, Context.MODE_APPEND); OutputStreamWriter osw = new OutputStreamWriter(fos, "utf-8"); osw.write(content); fos.flush(); osw.flush(); osw.close(); fos.close(); SyLog.d(TAG, "寫入成功");// ToastUtil.defaultToast(context,"寫入成功"); } catch (Exception e) { e.printStackTrace(); ToastUtil.defaultToast(context.getApplicationContext(), "寫入失敗"); } } /** * @param context * @param fileName * @param id */ public static void writeId(Context context, String fileName, String id) { if (id == null) id = "-1"; try { Log.d("id",id); //MODE_PRIVATE 預設模式,檔案只可以被調用該方法的應用程式訪問 //MODE_APPEND 如果檔案已存在就向該檔案的末尾繼續寫入資料,而不是覆蓋原來的資料。 //MODE_WORLD_READABLE 賦予所有的應用程式對該檔案讀的許可權。 //MODE_WORLD_WRITEABLE 賦予所有的應用程式對該檔案寫的許可權。 FileOutputStream fos = context.openFileOutput(fileName, Context.MODE_PRIVATE); OutputStreamWriter osw = new OutputStreamWriter(fos, "utf-8"); osw.write(id); fos.flush(); osw.flush(); osw.close(); fos.close(); SyLog.d(TAG, "寫入成功");// ToastUtil.defaultToast(context,"寫入成功"); Log.d("讀取id",read(context,fileName)); } catch (Exception e) { e.printStackTrace(); ToastUtil.defaultToast(context.getApplicationContext(), "寫入失敗"); } } /** * 讀取文字檔 * * @param context * @param fileName * @return */ public static String read(Context context, String fileName) { try { FileInputStream in = context.openFileInput(fileName); InputStreamReader isr = new InputStreamReader(in); char[] data = new char[in.available()]; isr.read(data); String s = new String(data); isr.close(); in.close(); SyLog.d(TAG, "讀取成功");// ToastUtil.defaultToast(context,s); return s; } catch (Exception e) { e.printStackTrace();// ToastUtil.defaultToast(context.getApplicationContext(), "讀取使用者id失敗,請重新登入"); } return "-1"; } /** * 讀取輸入資料流 * * @param inStream * @return */ public static String readInStream(InputStream inStream) { try { ByteArrayOutputStream outStream = new ByteArrayOutputStream(); byte[] buffer = new byte[512]; int length = -1; while ((length = inStream.read(buffer)) != -1) { outStream.write(buffer, 0, length); } outStream.close(); inStream.close(); return outStream.toString(); } catch (IOException e) { Log.i("FileTest", e.getMessage()); } return null; } public static File createFile(String folderPath, String fileName) { File destDir = new File(folderPath); if (!destDir.exists()) { destDir.mkdirs(); } return new File(folderPath, fileName + fileName); } /** * 向手機寫圖片 * * @param buffer * @param folder * @param fileName * @return */ public static boolean writeFile(byte[] buffer, String folder, String fileName) { boolean writeSucc = false; boolean sdCardExist = Environment.getExternalStorageState().equals( android.os.Environment.MEDIA_MOUNTED); String folderPath = ""; if (sdCardExist) { folderPath = Environment.getExternalStorageDirectory() + File.separator + folder + File.separator; } else { writeSucc = false; } File fileDir = new File(folderPath); if (!fileDir.exists()) { fileDir.mkdirs(); } File file = new File(folderPath + fileName); FileOutputStream out = null; try { out = new FileOutputStream(file); out.write(buffer); writeSucc = true; } catch (Exception e) { e.printStackTrace(); } finally { try { out.close(); } catch (IOException e) { e.printStackTrace(); } } return writeSucc; } /** * 根據檔案絕對路徑擷取檔案名稱 * * @param filePath * @return */ public static String getFileName(String filePath) { if (StringUtils.isEmpty(filePath)) return ""; return filePath.substring(filePath.lastIndexOf(File.separator) + 1); } /** * 根據檔案的絕對路徑擷取檔案名稱但不包含副檔名 * * @param filePath * @return */ public static String getFileNameNoFormat(String filePath) { if (StringUtils.isEmpty(filePath)) { return ""; } int point = filePath.lastIndexOf('.'); return filePath.substring(filePath.lastIndexOf(File.separator) + 1, point); } /** * 擷取副檔名 * * @param fileName * @return */ public static String getFileFormat(String fileName) { if (StringUtils.isEmpty(fileName)) return ""; int point = fileName.lastIndexOf('.'); return fileName.substring(point + 1); } /** * 擷取檔案大小 * * @param filePath * @return */ public static long getFileSize(String filePath) { long size = 0; File file = new File(filePath); if (file != null && file.exists()) { size = file.length(); } return size; } /** * 擷取檔案大小 * * @param size 位元組 * @return */ public static String getFileSize(long size) { if (size <= 0) return "0"; java.text.DecimalFormat df = new java.text.DecimalFormat("##.##"); float temp = (float) size / 1024; if (temp >= 1024) { return df.format(temp / 1024) + "M"; } else { return df.format(temp) + "K"; } } /** * 轉換檔大小 * * @param fileS * @return B/KB/MB/GB */ public static String formatFileSize(long fileS) { java.text.DecimalFormat df = new java.text.DecimalFormat("#.00"); String fileSizeString = ""; if (fileS < 1024) { fileSizeString = df.format((double) fileS) + "B"; } else if (fileS < 1048576) { fileSizeString = df.format((double) fileS / 1024) + "KB"; } else if (fileS < 1073741824) { fileSizeString = df.format((double) fileS / 1048576) + "MB"; } else { fileSizeString = df.format((double) fileS / 1073741824) + "G"; } return fileSizeString; } /** * 擷取目錄檔案大小 * * @param dir * @return */ public static long getDirSize(File dir) { if (dir == null) { return 0; } if (!dir.isDirectory()) { return 0; } long dirSize = 0; File[] files = dir.listFiles(); for (File file : files) { if (file.isFile()) { dirSize += file.length(); } else if (file.isDirectory()) { dirSize += file.length(); dirSize += getDirSize(file); // 遞迴調用繼續統計 } } return dirSize; } /** * 擷取目錄檔案個數 * * @param dir * @return */ public long getFileList(File dir) { long count = 0; File[] files = dir.listFiles(); count = files.length; for (File file : files) { if (file.isDirectory()) { count = count + getFileList(file);// 遞迴 count--; } } return count; } public static byte[] toBytes(InputStream in) throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(); int ch; while ((ch = in.read()) != -1) { out.write(ch); } byte buffer[] = out.toByteArray(); out.close(); return buffer; } /** * 檢查檔案是否存在 * * @param name * @return */ public static boolean checkFileExists(String name) { boolean status; if (!name.equals("")) { File path = Environment.getExternalStorageDirectory(); File newPath = new File(path.toString() + name); status = newPath.exists(); } else { status = false; } return status; } /** * 檢查路徑是否存在 * * @param path * @return */ public static boolean checkFilePathExists(String path) { return new File(path).exists(); } /** * 計算SD卡的剩餘空間 * * @return 返回-1,說明沒有安裝sd卡 */ public static long getFreeDiskSpace() { String status = Environment.getExternalStorageState(); long freeSpace = 0; if (status.equals(Environment.MEDIA_MOUNTED)) { try { File path = Environment.getExternalStorageDirectory(); StatFs stat = new StatFs(path.getPath()); long blockSize = stat.getBlockSize(); long availableBlocks = stat.getAvailableBlocks(); freeSpace = availableBlocks * blockSize / 1024; } catch (Exception e) { e.printStackTrace(); } } else { return -1; } return (freeSpace); } /** * 建立目錄 * * @param directoryName * @return */ public static boolean createDirectory(String directoryName) { boolean status; if (null != directoryName && !directoryName.equals("")) { File path = Environment.getExternalStorageDirectory(); File newPath = new File(path.toString() + directoryName); status = newPath.mkdir(); status = true; } else status = false; return status; } /** * 檢查是否安裝SD卡 * * @return */ public static boolean checkSaveLocationExists() { String sDCardStatus = Environment.getExternalStorageState(); boolean status;