? ? ? ?看到跨進程,想必大家想到的都是AIDL,Binder鱼喉,廣播秀鞭,內(nèi)容提供器等,但是AIDL扛禽,Binder可能有點難度锋边,廣播太過于被動,要主動聯(lián)系有點困難编曼,而內(nèi)容提供器豆巨,對于太簡單的數(shù)據(jù),顯得有點大掐场,畢竟我可能就是為了獲取一個簡單的字段而已往扔。
? ? ? ? 首先,先說下接到的一個客戶的需求吧熊户。有個字段需要客戶提供接口萍膛,顯示對應(yīng)的數(shù)據(jù),而客戶只發(fā)過來一個apk嚷堡,說是啟動一個activity即可蝗罗,傳入?yún)?shù),在onActivityResult獲取結(jié)果即可蝌戒,而客戶的activity處理成透明串塑,會將數(shù)據(jù)返回,關(guān)閉當前的activity北苟,路子野了點桩匪,但好歹實現(xiàn)了不是,因為客戶的apk已經(jīng)形成粹淋,不好改啥了吸祟,就將就著用了。
? ? ? ? 然后桃移,客戶又提了個需求屋匕,我的A應(yīng)用的某個值顯示的情況根據(jù)B的一個選擇(該選擇會在B的SharedPreferences中保存),這時候借杰,B也是自己開發(fā)的过吻,那就可以選擇自己的跨進程方式了。首先,當然也可以像客戶那樣的方式纤虽,但是乳绕,畢竟有點強迫癥,啟動一個透明的activity就為了取個值逼纸,太奇怪了洋措,然后,AIDL,Binder杰刽,好吧菠发,承認不大會,最后就是content provider啥的贺嫂,我真的就取個boolean值滓鸠,有點大材小用了吧,最后想到SharedPreferences可不可以共享來著第喳,果然發(fā)現(xiàn)有個MODE_MULTI_PROCESS糜俗,這個意思不就是多進程么,于是代碼如下:
Context context=null;
try{
context=this.createPackageContext("你要訪問的B應(yīng)用的包名",
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這個函數(shù)悠抹,這個是創(chuàng)建其他的包的上下文,否則扩淀,你是從你的私人空間取值锌钮,肯定是取不到的,其次是mode一定是MODE_MULTI_PROCESS這個,這個才能跨進程。
? ? ? ? 然后還是會發(fā)現(xiàn)缝龄,讀取不了值,仔細看log氛谜,有個警告信息是Attempt to read preferences file /data/data/xxx/shared_prefs/xxx.xml without permission,那就是沒權(quán)限了区端,爬了一下午的文總算找到原因了值漫,manifest根布局下的android:sharedUserId,兩個應(yīng)用設(shè)置同一個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,也就是平常不能訪問是因為用戶不同沥邻,被隔絕危虱,而默認的會給每個應(yīng)用分配唯一的id,也就是不會相同唐全。設(shè)置成一樣就代表同一個用戶埃跷,就可以互相訪問了蕊玷。
? ? ? ? 最后說下,這個跨進程是不安全的弥雹,你也會發(fā)現(xiàn)垃帅,在最新的api中是不建議使用的,不安全是因為如果兩個都同事要改的話剪勿。但是一來贸诚,我只有一個會改,二來厕吉,我更改都是UI線程赦颇,一個UI線程同時只會存在一個,不會出現(xiàn)兩個同事訪問赴涵,最后,當然是方便了订讼,我就取個值髓窜,沒特別大的要求,當然簡單使用了欺殿,想要復(fù)雜點的寄纵,最上面的方式,隨便搜下一大堆的使用方式的脖苏。