android應用數據共享
❶ 如何android多Activity間共享數據
其實有如下5種方式:
1.基於消息的通信機制 Intent ---boudle ,extra
數據類型有限,比如遇到不可序列化的數據Bitmap,InputStream, 或者LinkList鏈表等等數據類型就不太好用。
2. 利用static靜態數據,public static成員變數;
3.基於外部存儲的傳輸, File/Preference/ Sqlite ,如果要針對第三方應用需要Content Provider
4.基於IPC的通信機制context 與Service之間的傳輸,如Activity與Service之間的通信,定義AIDL介面文件。
5. 基於Application Context
這裡面我覺得第五種方法更具普適性,在網上找了篇講解得好的文章,原文如下:
在Android中使用Intent在兩個Activity間傳遞數據時,只能是基本類型數據,或者是序列化對象。Intent是一種基於消息的進程內和進程間通信模型,當我們需要在我們應用程序內部,多個Activity間進行復雜數據對象共享交互時,使用Intent就顯得很不方便。此時,我們就需要一種數據共享的機制來實現。當然,直接使用java語言中的靜態變數是可以的,但在Android中有更為優雅的實現方式。
The more general problem you are encountering is how to save stateacross several Activities and all parts of your application. A staticvariable (for instance, a singleton) is a common Java way of achievingthis. I have found however, that a more elegant way in Android is toassociate your state with the Application context.
--如想在整個應用中使用,在java中一般是使用靜態變數,而在android中有個更優雅的方式是使用Application context。
As you know, each Activity is also a Context, which is informationabout its execution environment in the broadest sense. Your applicationalso has a context, and Android guarantees that it will exist as asingle instance across your application.
--每個Activity 都是Context,其包含了其運行時的一些狀態,android保證了其是single instance的。
The way to do this is to create your own subclass of android.app.Application,and then specify that class in the application tag in your manifest.Now Android will automatically create an instance of that class andmake it available for your entire application. You can access it fromany context using the Context.getApplicationContext() method (Activityalso provides a method getApplication() which has the exact sameeffect):
--方法是創建一個屬於你自己的android.app.Application的子類,然後在manifest中申明一下這個類,這是android就為此建立一個全局可用的實例,你可以在其他任何地方使用Context.getApplicationContext()方法獲取這個實例,進而獲取其中的狀態(變數)。
class MyApp extends Application { private String myState; public String getState(){ return myState; } public void setState(String s){ myState = s; } } class Blah extends Activity { @Override public void onCreate(Bundle b){ ... MyApp appState = ((MyApp)getApplicationContext()); String state = appState.getState(); ... } }
對於Application的生命周期,今天測試了一下,Application類型在該APP被install的時候就已經實例化了,並且onCreate也已經被調用了。
如果需要創建類型裡面可能需要用到的對象的話,就可以在構造函數裡面實現,但是如果需要將該類型bind Service或者registerReceiver等操作時,需要將這些操作放到onCreate中,否則會拋出異常。其原因主要是這個對象還沒有創建完成,此時你用這個對象來bindservice必然會出現意想不到的情況,所以在使用時還需要注意。
❷ 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變數把共享數據作為靜態變數
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應用之間共享數據
在本應用中保存數據。
//實例化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不存在那麼顯示我這個默認值");
❺ 如何android多Activity間共享數據
方法1:在某個Activity中聲明一個公共的static變數把共享數據作為靜態變數
{
publicstaticDatadata=null;//聲明的變數
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
data=newData();
}
}
{
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Datadata=OneActivity.data;
}
但是這樣會增加activity之間的耦合度,不是很好
方法二:把共享數據作為放在Applicaiton中
定義一個MyApplication繼承於Application
{
privateDatadata;
@Override
publicvoidonCreate(){
super.onCreate();
data=newData();
}
publicDatagetData(){
returndata;
}
publicvoidsetData(Datadata){
this.data=data;
}
}
將MyApplication配置到清單文件中作為程序啟動的ApplicationContext
設置Application的name屬性即可
在Activity中獲取數據
{
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyApplicationapplication=(MyApplication)getApplication();
Datadata=application.getData();
}
}
❻ 如何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多Activity間共享數據
方法1:在某個Activity中聲明一個公共的static變數把共享數據作為靜態變數
1
2
3
4
5
6
7
8
9
10
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多Activity間共享數據
1、在某個Activity中聲明一個公共的static變數把共享數據作為靜態變數,但是這樣會增加activity之間的耦合度,不是很好。
2、把共享數據作為放在Applicaiton中。定義一個MyApplication繼承於Application,將MyApplication配置到清單文件中作為程序啟動的ApplicationContext,設置Application的name屬性即可。
❾ 如何android多Activity間共享數據
方法1:在某個Activity中聲明一個公共的static變數把共享數據作為靜態變數
1
2
3
4
5
6
7
8
9
10
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();
}
}
1
2
3
4
5
6
7
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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中獲取數據
1
2
3
4
5
6
7
8
9
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();
}
}