1. 程式人生 > >Android元件之間 資料傳遞資料

Android元件之間 資料傳遞資料

自:http://blog.csdn.net/buaaroid/article/details/49665455 

1  基於訊息的通訊機制 Intent--------bundle,extra

用這種簡單的形式,一般而言傳遞一些簡單的型別是比較容易的,如int、string等

詳細介紹下Intent機制

Intent包含兩部分:

1 目的【action】-------要去到哪裡去

2 內容【category、data】----------路上帶些什麼,區分性資料和內容性資料

簡單資料傳遞:

Intent intent = new Intent(LoginActivity.this, MainActivity.class);

intent.putExtra("flag", flag);

startActivity(intent);

////////////////////////////////////////////////////////////////////////////////////////////////

/////////////////

String flag = "   ";

Intent intent1 = this.getIntent(); 

flag = intent1.getStringExtra("flag");

////////////////////////////////////////////////////////////////////////////////////////////////

///////////////////

資料型別有限,遇到不可序列化的資料Bitmap,Inputstream,或者是LinkList連結串列等資料型別就不太好用了

2 基於靜態變數,static靜態資料,public static成員變數

我們千萬不要以為Davlik虛擬機器的垃圾回收器會幫助我們回收不需要的記憶體垃圾。事實上,回收器並不可靠,

尤其是手機上,是更加的不可靠。 因此,除非我們要使自己的程式變得越來越糟糕,否則儘量遠離static。

注:如果經常使用static的Bitmap、Drawable等變數。可能就會丟擲一個在Android系統中非常著名的異常(

以前budget這個單詞一直記不住什麼意思,自從經常丟擲這個異常後,這個單詞終於爛熟於心了,)

ERROR/AndroidRuntime(4958): Caused by: java.lang.OutOfMemoryError:bitmap size exceeds VM budget 注:如果經常使用static的Bitmap、Drawable等變數。可能就會丟擲一個在Android系統中非常著名的異常(

以前budget這個單詞一直記不住什麼意思,自從經常丟擲這個異常後,這個單詞終於爛熟於心了,)

3 基於儲存資料的傳輸 ,File/Preference/Sqlite/網路等,如果要針對第三方應用需要Content provider

作為一個完成的應用程式,資料儲存操作是必不可少的。因此,Android系統一共提供了四種資料儲存方式。

分別是:SharePreference、SQLite、Content Provider和File。由於Android系統中,資料基本都是私有的的

,都是存放於“data/data/程式包名”目錄下,所以要實現資料共享,正確方式是使用Content Provider。

  SQLite: SQLite是一個輕量級的資料庫,支援基本SQL語法,是常被採用的一種資料儲存方式。Android

為此資料庫提供了一個名為SQLiteDatabase的類,封裝了一些操作資料庫的API。

  SharedPreference: 除SQLite資料庫外,另一種常用的資料儲存方式,其本質就是一個xml檔案,常用於

儲存較簡單的引數設定。

  File: 即常說的檔案(I/O)儲存方法,常用語儲存大數量的資料,但是缺點是更新資料將是一件困難的

事情。

  ContentProvider: ContentProvider是安卓平臺中,在不同應用程式之間實現資料共享的一種機制。一個

應用程式如果需要讓別的程式可以操作自己的資料,即可採用這種機制。並且此種方式忽略了底層的資料儲存

實現,ContentProvider提供了一種統一的通過Uri實現資料操作的方式。

詳細介紹使用過程

File 通過檔案內容的讀取傳遞資料

Preference: SharedPreferences也是一種輕型的資料儲存方式,它的本質是基於XML檔案儲存key-value鍵值

對資料,通常用來儲存一些簡單的配置資訊

SharedPreferences物件本身只能獲取資料而不支援儲存和修改,儲存修改是通過Editor物件實現。實現

SharedPreferences儲存的步驟如下:

  一、根據Context獲取SharedPreferences物件

  二、利用edit()方法獲取Editor物件。

  三、通過Editor物件儲存key-value鍵值對資料。

  四、通過commit()方法提交資料。

   SharedPreferences sp=getSharedPreferences("login",0);//login儲存檔名    SharedPreferences.Editor se=sp.edit();;    se.putString("server", logEdit.getText().toString());    se.putString("port", portEdit.getText().toString());    se.commit();

////////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////

  SharedPreferences ps=getSharedPreferences("login",0);//login是儲存檔案     server=ps.getString("server", "");   port=ps.getString("port", "");   logEdit.setText(server);   portEdit.setText(port);

////////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////

ContentProvider

其步驟為:

  1. 在當前應用程式中定義一個ContentProvider。

  2. 在當前應用程式的AndroidManifest.xml中註冊此ContentProvider

  3. 其他應用程式通過ContentResolver和Uri來獲取此ContentProvider的資料。

 在程式A中,繼承ContProvider類,並重寫其中的方法

public class MyProvider extends ContentProvider{      @Override      public int delete(Uri uri, String selection, String[] selectionArgs) {          // TODO Auto-generated method stub          return 0;      }      @Override      public String getType(Uri uri) {          // TODO Auto-generated method stub          return null;      }      @Override      public Uri insert(Uri uri, ContentValues values) {          return null;      }      //在Create中初始化一個數據庫      @Override      public boolean onCreate() {          SQLiteDatabase db = this.getContext().openOrCreateDatabase("test_db.db3", Context.MODE_PRIVATE, null);          db.execSQL("create table tab(_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL)");          ContentValues values = new ContentValues();          values.put("name", "test");          db.insert("tab", "_id", values);          db.close();          return true;      }      //實現query方法      @Override      public Cursor query(Uri uri, String[] projection, String selection,              String[] selectionArgs, String sortOrder) {          SQLiteDatabase db = this.getContext().openOrCreateDatabase("test_db.db3", Context.MODE_PRIVATE, null);          Cursor c = db.query("tab", null, null, null, null, null,null);          return c;      }      @Override      public int update(Uri uri, ContentValues values, String selection,              String[] selectionArgs) {          // TODO Auto-generated method stub          return 0;      }  }

 在其AndroidManifest.xml中宣告此ContentProvider,其中authorities屬性定義了此ContentProvider的Uri

標識。

<provider android:name=".MyProvider" android:authorities="com.test.MyProvider"/>

在應用程式B中,通過ContentResolver獲取程式A的ContentProvider中的資料。

public class MainActivity extends Activity {      @Override      public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.main);          //獲取上下文          Context ctx = MainActivity.this;          //獲取ContentResolver物件          ContentResolver resolver = ctx.getContentResolver();          //獲取Uri物件          Uri uri = Uri.parse("content://com.test.MyProvider");          //獲取資料          Cursor c = resolver.query(uri, null, null, null, null);          c.moveToFirst();          for(int i=0; i<c.getCount(); i++){              int index = c.getColumnIndexOrThrow("name");              String src = c.getString(index);              Log.d("", src);              c.moveToNext();          }      }  }

 再觀察兩個應用程式的結構,A的程式結構,可以清楚看到其有一個名為“test_db.db3”的資料庫,B的程

序結構,其並沒有任何資料庫用於儲存資料。由此圖,可以確定應用程式B中查詢出來的資料結果是來自於應

用程式A。

以上就是ContentProvider的使用方式,這種儲存方式相比SQLite和SharedPreferences,其複雜性是顯而易見

的,但是在處處可見“雲”的今天,程式間的資料互動需求令ContentProvider儲存機制變成必不可少的一部

分。

4 基於Ipc的通訊機制

context與service之間的傳輸,如Activity與Service之間的通訊

5 基於Application ,Application Context------在Application中定義變數或相應的方法

在一個activity初始化一個ArrayList<HashMap<Sting,Map>>物件,然後經過一個tableactivity,在傳遞到另

外一個activity,一開始直接考慮用putExtra,測試發現數據只能傳遞一次,就考慮用Application傳遞 Java裡面通常是用一個static的變數(例如singleton之類的)來同步activity之間(程式裡面類之間)的狀態。在android裡面比較靠譜的做法是用application context來關聯這些狀態。 每個activity都是context,裡面包含了執行時的狀態。同樣application也有一個context,android會保證這個context是唯一的例項。

package net.blogjava.mobile1;

import android.app.Application; import android.graphics.Bitmap; public class MyApp extends Application {     private Bitmap mBitmap;     public Bitmap getBitmap()     {         return mBitmap;     }     public void setBitmap(Bitmap bitmap)     {         this.mBitmap = bitmap;     } } <application android:name=".MyApp" android:icon="@drawable/icon" android:label="@string/app_name"> </application> 獲得Bitmap物件的程式碼:     ImageView imageview = (ImageView)findViewById(R.id.ivImageView);     MyApp myApp = (MyApp)getApplication();     imageview.setImageBitmap(myApp.getBitmap());

上面兩段程式碼可以在任何的Service、Activity中使用。全域性的


相關推薦

Android Acitivity之間如何傳遞資料

【IT168技術】任何控制類程式都有一個入口,彙編程式的入口由處理器內部的復位(Reset)中斷向量表決定;C程式的入口是main()函式,一個C程式只能有一個main()函式;Java程式的入口必須是某個類的靜態成員函式main()。   對於依賴於作業系統的程式,客

Android元件之間 資料傳遞資料

自:http://blog.csdn.net/buaaroid/article/details/49665455  1  基於訊息的通訊機制 Intent--------bundle,extra 用這種簡單的形式,一般而言傳遞一些簡單的型別是比較容易的,如int、st

綜述種類:Android元件之間 資料傳遞方法

部落格時間:2012-06-06 18:27 ------------------------------------------- 思路 1通過共享appication做處理 2 先轉換成json,第二個activity再轉換回list3 Parcelable S

React從0到1--元件向外傳遞資料

通過props向外傳遞資料 在父元件ClickCounter檔案裡面 constructor(props){ super(props); this.onCounterUpdate = this.onCounterUpdate.bind(this); this.initValues = [

activity與fragment之間傳遞資料

首先activity之間的資料傳遞就是 用intent和intent+bundle intent 傳遞 Intent i= new Intent(MainActivity.this,TheAty.class); i.putExtra("date","Hello

Vue 中父元件和子元件之間獲取對方資料和方法

父元件獲取子元件的資料和方法 one 在父元件中呼叫子元件時,定義一個ref(其實和選擇器類似): <Common ref="commonChild" :pathologyId="form.pathologyId" /> 在父元件中獲取子元件屬性和方

Android介面回撥傳遞資料

一 、回撥函式回撥函式就是一個通過函式指標呼叫的函式。如果你把函式的指標(地址)作為引數傳遞給另一個函式,當這個指標被用為呼叫它所指向的函式時,我們就說這是回撥函式。回撥函式不是由該函式的實現方直接呼叫,而是在特定的事件或條件發生時由另外的一方呼叫的,用於對該事件或條件進行

多級元件巢狀傳遞資料,$attrs和inheritAttrs用法

我們在vue的父子元件傳值的時候,我們先在需要的子元件上用props註冊一些屬性,然後父元件呼叫的時候當屬性來傳值。 如果我們給child傳props沒有註冊的屬性,我們就要用$attrs來取了。 現有父元件A和子元件B: 元件A的內容如下: <template>

兩個Fragment之間如何傳遞資料

FragmentA啟動FragmentB,做一些選擇操作後,返回FragmentA,需要把FragmentB裡面選擇的資料傳回來。有什麼辦法? Fragment之間不能直接通訊,必須通過Activity來完成,具體步驟。 1. 在FragmentA中定義通訊介面,通過該介面向Activity傳送資料。

Android網路程式設計之傳遞資料給伺服器(二)

        我曾在《Android網路程式設計之傳遞資料給伺服器(一) 》一文中介紹瞭如何通過GET方式傳遞資料給伺服器,通過GET方式傳遞資料主要適用於資料大小不超過2KB,且對安全性要求不高的情況下。下面就介紹通過POST方式傳遞資料主到伺服器。 一、通過P

android利用廣播(BroadcastReceiver)傳遞資料

利用廣播傳遞資料,肯定需要用Intent或者bundle,那首先第一步: 一、註冊廣播接收器 public class MainActivity extends AppCompatActivity { MyReceiver myReceiver; @Overrid

Android 最全 Intent 傳遞資料姿勢

點選上面藍色字型關注“IT大飛說” 置頂公眾號(ID:ITBigFly)第一時間收到推送 作為一個 Android 開發人員,我們都是用過 Intent,用它來在元件之間傳遞資料,所以說 Intent 是元件之間通訊的使者,一般情況下,我們傳遞的都

ViewPager + Fragment處理兩個Fragment的點選跳轉以及之間傳遞資料

處理兩個Fragment的點選跳轉與在自定義元件中設定監聽的處理方式差不多,由於兩個Fragment都有一個共同的Activity而Activity通過其Viewpager的setCurrentItem(int position)可以設定顯示第幾個Fragmen

Android -- 啟動Service並傳遞資料

本文主要記錄Activity傳遞資料到Service。 原始碼與上一篇基本是保持一致的,只是在跳轉過程中增加了引數的傳遞。 我們先來看效果。 1、效果圖 2、通過以上效果圖,可以看出

3. 呼叫另一個Activity,並兩個Activity之間相互傳遞資料

一,在一個Activity中呼叫另一個Activity 利用 android.content.Intent 物件實現從一個Activity跳轉到另一個Activity 例如:從FirstActivity跳轉到SecondActivity /*           關鍵程式碼

Android activity與service傳遞資料

方式一:Activity向Service傳遞資料 在activity中,設定要傳遞的值。 Intent intent = new Intent(Main.this, DownloadS

android訊息廣播Intent傳遞資料

1.建立佈局檔案activity_broadcast.xml<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/a

如何在小程式頁面之間傳遞資料和變數?

最近組裡開發小程式,遇到了一個困擾前端很長時間的話題:頁面之間,如何傳遞資料和變數? 剛開始,我們選擇使用路徑傳參解決。但是眾所周知,各瀏覽器 HTTP Get 請求 URL 最大長度並不相同,大部分瀏覽器只能接受 7000 個字元的資料。 所以,我們覺得這個方式並不靠譜。

兩個dialog之間如何傳遞資料

 CDlg1::OnButton1() { CDlg2 dlg2; dlg2.m_str = _T( "你好 "; ) dlg2.m_bJudge = TRUE; dlg2.DoModal(); } //Dlg2.h public: CString m_str; BOOL

訊息傳遞機制之元件之間訊息傳遞

通常在元件之間傳遞訊息,我們會採用廣播形式 , 自定義介面形式 , EventBus來實現BroadCastReceiver建立廣播private BroadcastReceiver receiver = new BroadcastReceiver() { @Over