通過SharedPreferences實現程序間資料共享的問題詳解
之前為了解決應用的記憶體壓力,在同一個應用中使用了多程序,但在程式自測的過程中發現不同程序之間的SharedPreferences資料不能共享,但應用內很多資料都是通過SharedPreferences來儲存的,如果改成其它多程序通訊的方式改動比較大。通過檢視原始碼發現,在API Level>=11即Android 3.0可以通過Context.MODE_MULTI_PROCESS屬性來實現SharedPreferences多程序共享,具體使用方式如下:
SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_MULTI_PROCESS);
SharedPreferences時間程序間資料共享會導致的問題
本來以為通過MODE_MULTI_PROCESS屬性使用SharedPreferences就可以解決不同程序之間不能共享資料的問題了,但SQA總是反饋一些隨機但出現頻率比較大的bug,比如在使用過程中沒有清除程式資料的前提下,會出現歡迎介面和操作指引,這是通過儲存在SharedPreferences的標誌來判斷使用者是否是第一次啟動程式的,分析發現儲存在SharedPreferences中的資料丟失了,但程式碼中並沒有去清除這些資料,所以推測可能是不同程序同一時間對SharedPreferences操作導致的,經驗證確實如此,去掉多程序就不會再出現這個問題了。
解決方案
由於程序間是不能記憶體共享的,每個程序操作的SharedPreferences都是一個單獨的例項,上述的問題並不能通過鎖來解決,這導致了多程序間通過SharedPreferences來共享資料是不安全的,這個問題只能通過多程序間其它的通訊方式或者是在確保不會同時操作SharedPreferences資料的前提下使用SharedPreferences來解決。
可以參考這個專案 https://github.com/seven456/MultiprocessSharedPreferences
參考資料
stackoverflow相關推薦
通過SharedPreferences實現程序間資料共享的問題詳解
之前為了解決應用的記憶體壓力,在同一個應用中使用了多程序,但在程式自測的過程中發現不同程序之間的SharedPreferences資料不能共享,但應用內很多資料都是通過SharedPreferences來儲存的,如果改成其它多程序通訊的方式改動比較大。通過檢視原始碼發現,在API Level>=11即A
共享記憶體 —— 通過SharedPreferences實現程序間資料共享的問題詳解
2015-10-29 10:44 之前為了解決應用的記憶體壓力,在同一個應用中使用了多程序,但在程式自測的過程中發現不同程序之間的SharedPreferences資料不能共享,但應用內很多資料都是通過SharedPreferences來儲存的,如果改成其它多程序通
通過記憶體對映實現程序間資料交換
程序間通訊有好幾种放發,其中共享記憶體可以實現大量快速得資料交換,現簡單介紹下這種方法得基本原理所用API函式說明:HANDLE CreateFileMapping( HANDLE hFile, // handle to file to map ,
程序間的訊號 --------詳解(通過訊號去控制程序的執行狀態)
(1)概述 1.訊號是一種軟體中斷,用來處理非同步事件 2.訊號的本質是一種程序間的通訊,一個程序向另一個程序傳送訊號 3.執行kill -l可檢視系統所有的訊號 4.作用:ctl+c時用來做一些收尾工作: 1.刪除管道.刪除共享記憶體.刪除訊號量.刪除訊息佇列..
實現程序間資料交換的兩種方法和應用
Windows作業系統是一個多工系統,每個任務都有相應的程序對應。熟悉windows系統的使用者知道,每個程序都有自己獨立的記憶體地址和記憶體空間。這對程序間之間的資料相互訪問和相互交換帶來一定的不便,但是在實際應用中有時要在程序間進行資料交換。windows系統提供了許多方
4種程序間通訊方式詳解
程序間通訊有4種方式,以下從簡單到複雜的方式出場:1.管道(pipe) 管道是一種具有兩個端點的通訊通道,一個管道實際上就是隻存在在記憶體中的檔案,對這個檔案操作需要兩個已經開啟檔案進行,他們代表管道的兩端,也叫兩個句檳,管道是一種特殊的檔案,不屬於一種檔案系統,而是一種獨立的檔案系統,有自
IPC(中)-程序間通訊方式詳解
IPC(中) 1 Android中IPC方式 在第一篇IPC(上)中我們已經介紹了IPC的基礎知識:序列化和Binder,本篇將詳細介紹各種跨程序通訊方式.具體有如下幾種: Intent中extras傳遞 共享檔案 Binder ContentPr
Linux 通過共享記憶體機制實現程序間通訊
問題背景 編寫程式 sender ,它建立一個共享記憶體,然後等待使用者通過終端輸入一串字元,並將這串字元通過共享記憶體傳送給 receiver;最後,它等待 receiver 的應答,收到應答訊息後,將接收到的應答資訊顯示在終端螢幕上,刪除共享記憶體,結束程式的執行。 編寫 receiver 程
Qt提供通過訪問共享記憶體實現程序間通訊
② 通過建構函式QSharedMemory::QSharedMemory (QObject * parent = 0 )構造例項物件,之後呼叫setKey()函式為該例項物件設定關鍵字。例如:QSharedMemory* sharememory;sharememory = new QSharedMemory(
ython實現程序間的通訊有Queue,Pipe,Value+Array等,其中Queue實現多個程序間的通訊,而Pipe實現兩個程序間通訊,而Value+Array使用得是共享記憶體對映檔案的方式,所以速度比較快
1.Queue的使用 from multiprocessing import Queue,Process import os,time,random #新增資料函式 def proc_write(queue,urls): print("程序(%s)正在寫入..."%(os.getpid()))
Android ContentProvider實現兩個程式間資料共享demo
1、客戶端程式碼: 先實現服務端 SQL建立: public class DBHelper extends SQLiteOpenHelper { // 資料庫名 private static final String DATABASE_NAME = "finch.db"
Windows or Linux環境下利用“共享記憶體”實現程序間通訊的C/C++程式碼
程序A對應的程式: #include <iostream> #include <windows.h> using namespace std; #define BUF_SIZE 1025 char szName[] = "NameOfMappi
python 使用多程序實現併發程式設計/使用queue進行程序間資料交換
import time import os import multiprocessing from multiprocessing import Queue, pool """ 一.Python 使用多程序實現併發程式設計: 因為cpython直譯器中有GIL存在的原因(每個程序都會維護一
訊號量與共享記憶體實現程序間通訊(生產者消費者問題為例)
(一)訊號量訊號量是IPC的一種,可以看做是一個計數器,計數值為可用的共享資源的數量,訊號量可用於多程序的同步,為多個程序提供對共享資源的訪問。linux下的訊號量的介面函式如下:/*(1)獲取訊號量*/int semget(key_t key, int semnum, in
【C語言】【unix c】兩個程序通過訊息佇列實現程序間的通訊
send.c: #include <stdio.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h>
iOS--CFMessagePort實現程序間通訊
CFMessagePort屬於CoreFoundation框架中的類。因此可以在http://opensource.apple.com/tarballs/CF/CF-855.17.tar.gz中在原始碼,如果感興趣可以去看看。 下面說下CFMessagePortRef的具體使用。 首先建立一
Android BroadcastReceiver使用,可實現程序間通訊
1、建立廣播接收器: /** * 作者:created by meixi * 郵箱:[email protected] * 日期:2018/11/1 09 */ public class MyBroadcastReceiver extends BroadcastReceiver
C#使用SendMessage實現程序間通訊的方法
本文例項講述了C#使用SendMessage實現程序間通訊的方法。分享給大家供大家參考。具體分析如下: 為了深入理解訊息機制,先來做一個測試專案 在新建專案的Form1的程式碼中,加入方法: ?
利用管道實現程序間的單向通訊
管道是程序間通訊的最原始方式,今天我們利用管道的程序間通訊,來實現簡單的程序間單向通訊 首先我們需要了解命名管道的一些特性命名管道的使用與建立 然後建立一個fifo_c的檔案來實現輸入資料和傳送資料 /*這是一個命名管道的實現,往命名管道中寫入資料,並且傳送給另一個程序 *
Android AIDL實現程序間通訊
今天犯二了, 犯了個超級低階的錯誤, 真的是丟人丟大發了. 剛好順道反思下, 也對工作這幾年做一些簡單的總結. 不知道你們是不是和我一樣也總遇到各