android簡單的跨進程訪問

? ? ? ?看到跨進程,想必大家想到的都是AIDL,Binder,廣播,內容提供器等,但是AIDL,Binder可能有點難度,廣播太過于被動,要主動聯系有點困難,而內容提供器,對于太簡單的數據,顯得有點大,畢竟我可能就是為了獲取一個簡單的字段而已。

? ? ? ? 首先,先說下接到的一個客戶的需求吧。有個字段需要客戶提供接口,顯示對應的數據,而客戶只發過來一個apk,說是啟動一個activity即可,傳入參數,在onActivityResult獲取結果即可,而客戶的activity處理成透明,會將數據返回,關閉當前的activity,路子野了點,但好歹實現了不是,因為客戶的apk已經形成,不好改啥了,就將就著用了。

? ? ? ? 然后,客戶又提了個需求,我的A應用的某個值顯示的情況根據B的一個選擇(該選擇會在B的SharedPreferences中保存),這時候,B也是自己開發的,那就可以選擇自己的跨進程方式了。首先,當然也可以像客戶那樣的方式,但是,畢竟有點強迫癥,啟動一個透明的activity就為了取個值,太奇怪了,然后,AIDL,Binder,好吧,承認不大會,最后就是content provider啥的,我真的就取個boolean值,有點大材小用了吧,最后想到SharedPreferences可不可以共享來著,果然發現有個MODE_MULTI_PROCESS,這個意思不就是多進程么,于是代碼如下:

Context context=null;

try{

context=this.createPackageContext("你要訪問的B應用的包名",

Context.CONTEXT_IGNORE_SECURITY);

SharedPreferences settings=context.getSharedPreferences("你的SharedPreferencesname",

Context.MODE_MULTI_PROCESS);

// SharedPreferences.Editor edtor=settings.edit();

boolean bOnOff=settings.getBoolean("你的key值",true);//取得保存的值

return bOnOff;

}catch(PackageManager.NameNotFoundException e) {

e.printStackTrace();

return true;

}

代碼很簡單,一個是createPackageContext這個函數,這個是創建其他的包的上下文,否則,你是從你的私人空間取值,肯定是取不到的,其次是mode一定是MODE_MULTI_PROCESS這個,這個才能跨進程。

? ? ? ? 然后還是會發現,讀取不了值,仔細看log,有個警告信息是Attempt to read preferences file /data/data/xxx/shared_prefs/xxx.xml without permission,那就是沒權限了,爬了一下午的文總算找到原因了,manifest根布局下的android:sharedUserId,兩個應用設置同一個id即可,原因也很簡單,android:sharedUserId

The name of a Linux user ID that will be shared with other applications. By default, Android assigns each application its own unique user ID. However, if this attribute is set to the same value for two or more applications, they will all share the same ID — provided that they are also signed by the same certificate. Application with the same user ID can access each other's data and, if desired, run in the same process.

google說這個id是linux用戶id,也就是平常不能訪問是因為用戶不同,被隔絕,而默認的會給每個應用分配唯一的id,也就是不會相同。設置成一樣就代表同一個用戶,就可以互相訪問了。

? ? ? ? 最后說下,這個跨進程是不安全的,你也會發現,在最新的api中是不建議使用的,不安全是因為如果兩個都同事要改的話。但是一來,我只有一個會改,二來,我更改都是UI線程,一個UI線程同時只會存在一個,不會出現兩個同事訪問,最后,當然是方便了,我就取個值,沒特別大的要求,當然簡單使用了,想要復雜點的,最上面的方式,隨便搜下一大堆的使用方式的。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容