當前位置:首頁 » 安卓系統 » android應用共享數據

android應用共享數據

發布時間: 2023-03-10 07:54:07

⑴ Android圖形系統(八)-app與SurfaceFlinger共享UI元數據過程

Android應用程序與SurfaceFlinger服務是運行在不同的進程中的,因此,它們採用Binder進程間通信機制來進行通信。

但是我們知道一個Android應用程序可能會有很多個窗口,而每一個窗口都有自己的UI元數據,因此,Android應用程序需要傳遞給SurfaceFlinger服務的UI元數據是相當可觀的。在這種情況下,通過Binder來在Android應用程序與SurfaceFlinger服務之間傳遞UI元數據是不合適的,因此這里選擇了Android系統的匿名共享內存的方案。在每一個Android應用程序與SurfaceFlinger服務之間的連接上加上一塊用來傳遞UI元數據的匿名共享內存。而這塊區域被包裝為SharedClient。

在每一個SharedClient裡面,有至多31個SharedBufferStack,那什麼又是SharedBufferStack?

SharedBufferStack就是共享緩沖區堆棧,每一個SharedBufferStack與一個Surface一一對應,每一個Surface又對應一個窗口,那就是一個應用程序內部最多可創建31個窗口。SharedBufferStack 內部包含N個緩沖buffer, 開篇介紹的雙緩沖(front buffer , back buffer) ,三緩沖(front buffer , back buffer, tripple buffer),有了它SurfaceFlinger服務就可以使用N個緩沖區技術來繪制UI了。

下面我們再來了解下SharedBufferStack的結構:

SharedBufferStack中分為空閑buffer和已使用的buffer。其中SharedBufferStack中的每一個已經使用了的緩沖區都對應有一個GraphicBuffer,用來描述真正的UI數據。

客戶端一次申請GraphicBuffer且將UI元數據寫入GraphicBuffer的流程:

當Android應用程序需要更新一個Surface的時候,它就會找到與它所對應的SharedBufferStack,並且從它的空閑緩沖區列表的尾部取出一個空閑的Buffer。我們假設這個取出來的空閑Buffer的編號為index。接下來Android應用程序就請求SurfaceFlinger服務為這個編號為index的Buffer分配一個圖形緩沖區GraphicBuffer。SurfaceFlinger服務分配好圖形緩沖區GraphicBuffer之後,會將它的編號設置為index,然後再將這個圖形緩沖區GraphicBuffer返回給Android應用程序訪問。Android應用程序得到了SurfaceFlinger服務返回的圖形緩沖區GraphicBuffer之後,就在裡面寫入UI數據。寫完之後,就將與它所對應的緩沖區,即編號為index的Buffer,插入到對應的SharedBufferStack的已經使用了的緩沖區列表的頭部去。這一步完成了之後,Android應用程序就通知SurfaceFlinger服務去繪制那些保存在已經使用了的緩沖區所描述的圖形緩沖區GraphicBuffer了。

那麼我們也知道一個繪圖表面,在SurfaceFlinger服務和Android應用程序中分別對應Layer對象和Surface對象,其中這兩個對象在內部分別使用一個SharedBufferServer對象和一個SharedBufferClient對象來操作這個繪圖表面的UI元數據緩沖堆棧。操作過程如下:

在Android應用程序這一側,當它需要渲染一個Surface時,它就會首先找到對應的SharedBufferClient對象,然後再調用它的成員函數dequeue來請求分配一個UI元數據緩沖區。有了這個UI元數據緩沖區之後,Android應用程序再調用這個SharedBufferClient對象的成員函數setDirtyRegion、setCrop和setTransform來設置對應的Surface的裁剪區域、紋理坐標以及旋轉方向。此外,Android應用程序還會請求SurfaceFlinger服務為這個Surface分配一個圖形緩沖區,以便可以往這個圖形緩沖區寫入實際的UI數據。最後,Android應用程序就可以調用這個SharedBufferClient對象的成員函數queue把前面已經准備好了的UI元數據緩沖區加入到它所描述的一個UI元數據緩沖區堆棧的待渲染隊列中,以便SurfaceFlinger服務可以在合適的時候對它進行渲染。當SurfaceFlinger服務需要渲染一個Surface的時候,它就會找到對應的一個SharedBufferServer對象,然後調用它的成員函數getQueueCount來檢查它所描述的一個UI元數據緩沖區堆棧的待渲染隊列的大小。如果這個大小大於0,那麼SurfaceFlinger服務就會繼續調用它的成員函數retireAndLock來取出隊列中的第一個UI元數據緩沖區,以及調用它的成員函數getDirtyRegion、getCrop和getTransform來獲得要渲染的Surface的裁剪區域、紋理坐標和旋轉方向。最後,SurfaceFlinger服務就可以結合這些信息來將保存這個Surface的圖形緩沖區中的UI數據渲染在顯示屏中。

另外想深入了解BufferQueue的生產者消費者模型,詳細可以閱讀下如下這篇博文,感覺還不錯: https://blog.csdn.net/stn_lcd/article/details/73801313

參考:
https://blog.csdn.net/Luoshengyang/article/details/7867340

⑵ 如何android多Activity間共享數據

1、在某個Activity中聲明一個公共的static變數把共享數據作為靜態變數,但是這樣會增加activity之間的耦合度,不是很好。
2、把共享數據作為放在Applicaiton中。定義一個MyApplication繼承於Application,將MyApplication配置到清單文件中作為程序啟動的ApplicationContext,設置Application的name屬性即可。

安卓系統中從其他應用中讀取共享的資料庫數據需要用到

可以按以下步驟進行:
Android應用的資料庫一般都是私有的,其他應用無法訪問,那麼怎麼在手機已root的前提下,在自己的應用中讀取指定應用中的數據信息呢,現提供一種思路。
以uc瀏覽器歷史瀏覽記錄為例:
一:對手機進行root。
某些廠家的Android設備是支持在系統設置中一鍵root的,如魅族手機。更通用的情況下一般是用第三方軟體進行root,如KingRoot。
二:在手機上安裝RootExplorer。
RootExplorer是在Android上使用很方便的文件瀏覽器,借用它,我們可以找到uc瀏覽器的歷史記錄資料庫所在為data/data/com.UCMobile/databases/history/history。
三:將資料庫文件復制到sd卡指定目錄。
四:從sd卡資料庫文件中讀取數據。
五:將數據載入到Recyclerview中展示。
至此,我們已經實現了在自己應用中讀取其他應用資料庫數據的一個完整過程,誠然這種方式存在許多局限性,但不失為解決方案的一種。

⑷ 如何android多Activity間共享數據

你好,方法如下
方法1:在某個Activity中聲明一個公共的static變數把共享數據作為靜態變數
public class OneActivity extends Activity {
public static Data data = null;//聲明的變數

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
data = new Data();
}
}public class TwoActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Data data = OneActivity.data;
}
但是這樣會增加activity之間的耦合度,不是很好

方法二:把共享數據作為放在Applicaiton中
定義一個MyApplication繼承於Application

public class MyApplication extends Application{

private Data data;
@Override
public void onCreate() {
super.onCreate();
data = new Data();
}

public Data getData(){
return data;
}
public void setData(Data data){
this.data = data;
}
}
將MyApplication配置到清單文件中作為程序啟動的ApplicationContext

設置Application的name屬性即可

在Activity中獲取數據
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyApplication application = (MyApplication) getApplication();
Data data = application.getData();
}
}

⑸ 如何在不同的android應用之間共享數據

  1. 在本應用中保存數據。

java">//實例化SharedPreferences對象(第一步)
=getSharedPreferences("test",Activity.MODE_WORLD_READABLE);
//MODE_WORLD_READABLE:表示當前文件可以被其他應用讀取
//MODE_WORLD_WRITEABLE:表示當前文件可以被其他應用寫入。
//實例化SharedPreferences.Editor對象(第二步)
SharedPreferences.Editoreditor=mySharedPreferences.edit();
//用putString的方法保存數據
editor.putString("name","我是name的數據");
editor.putString("name2","我是name2的數據");
//提交當前數據,提交以後數據才真正保存
editor.commit()


2.在其他應用中獲取數據

=getSharedPreferences("test",Activity.MODE_WORLD_READABLE);
//通過名稱name獲取存儲的值,如果這個那麼沒有存過值,就顯示第二個參數的默認值。
mySharedPreferences.getString("name","如果name不存在那麼顯示我這個默認值");
mySharedPreferences.getString("name2","如果name2不存在那麼顯示我這個默認值");
熱點內容
for循環sql語句 發布:2025-05-13 22:45:49 瀏覽:17
python實用代碼 發布:2025-05-13 22:19:41 瀏覽:843
dede資料庫的配置文件 發布:2025-05-13 22:19:08 瀏覽:967
給字元加密 發布:2025-05-13 22:12:32 瀏覽:972
資料庫系統實現答案 發布:2025-05-13 22:11:57 瀏覽:141
哪個軟體可以共存安卓 發布:2025-05-13 22:10:15 瀏覽:552
上傳宦妃天下野泉肉肉 發布:2025-05-13 22:10:10 瀏覽:408
洗眼睛解壓 發布:2025-05-13 21:58:28 瀏覽:272
c存儲指針 發布:2025-05-13 21:49:04 瀏覽:922
結繩編程軟體 發布:2025-05-13 21:49:03 瀏覽:851