乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      解析activity之間數(shù)據(jù)傳遞的方法

       520jefferson 2014-01-07
      1 基于消息的通信機制 Intent--------boudle,extra

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

      詳細介紹下Intent機制

      Intent包含兩部分:

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

      2 內(nèi)容【category、data】----------路上帶些什么,區(qū)分性數(shù)據(jù)和內(nèi)容性數(shù)據(jù)

      簡單數(shù)據(jù)傳遞:

      復(fù)制代碼
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10

      Intent intent = new Intent(LoginActivity.this, MainActivity.class);
      intent.putExtra("flag", flag);
      startActivity(intent);
      /////////////////////////////////////////////////////////
      String flag = "   ";
      Intent intent1 = this.getIntent();  
      flag = intent1.getStringExtra("flag");
      /////////////////////////////////////////////////////////

      數(shù)據(jù)類型有限,遇到不可序列化的數(shù)據(jù)Bitmap,Inputstream,或者是LinkList鏈表等數(shù)據(jù)類型就不太好用了

      2 利用static靜態(tài)數(shù)據(jù),public static成員變量

      我們千萬不要以為Davlik虛擬機的垃圾回收器會幫助我們回收不需要的內(nèi)存垃圾。事實上,回收器并不可靠,

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

      注:如果經(jīng)常使用static的Bitmap、Drawable等變量??赡芫蜁伋鲆粋€在Android系統(tǒng)中非常著名的異常(

      以前budget這個單詞一直記不住什么意思,自從經(jīng)常拋出這個異常后,這個單詞終于爛熟于心了,)

      ERROR/AndroidRuntime(4958): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget

      注:如果經(jīng)常使用static的Bitmap、Drawable等變量??赡芫蜁伋鲆粋€在Android系統(tǒng)中非常著名的異常(

      以前budget這個單詞一直記不住什么意思,自從經(jīng)常拋出這個異常后,這個單詞終于爛熟于心了,)

      3 基于外部存儲的傳輸 ,F(xiàn)ile/Preference/Sqlite,如果要針對第三方應(yīng)用需要Content provider

      作為一個完成的應(yīng)用程序,數(shù)據(jù)存儲操作是必不可少的。因此,Android系統(tǒng)一共提供了四種數(shù)據(jù)存儲方式。

      分別是:SharePreference、SQLite、Content Provider和File。由于Android系統(tǒng)中,數(shù)據(jù)基本都是私有的的

      ,都是存放于“data/data/程序包名”目錄下,所以要實現(xiàn)數(shù)據(jù)共享,正確方式是使用Content Provider。

      SQLite: SQLite是一個輕量級的數(shù)據(jù)庫,支持基本SQL語法,是常被采用的一種數(shù)據(jù)存儲方式。Android

      為此數(shù)據(jù)庫提供了一個名為SQLiteDatabase的類,封裝了一些操作數(shù)據(jù)庫的API。

      SharedPreference: 除SQLite數(shù)據(jù)庫外,另一種常用的數(shù)據(jù)存儲方式,其本質(zhì)就是一個xml文件,常用于

      存儲較簡單的參數(shù)設(shè)置。

      File: 即常說的文件(I/O)存儲方法,常用語存儲大數(shù)量的數(shù)據(jù),但是缺點是更新數(shù)據(jù)將是一件困難的

      事情。

      ContentProvider: ContentProvider是安卓平臺中,在不同應(yīng)用程序之間實現(xiàn)數(shù)據(jù)共享的一種機制。一個

      應(yīng)用程序如果需要讓別的程序可以操作自己的數(shù)據(jù),即可采用這種機制。并且此種方式忽略了底層的數(shù)據(jù)存儲

      實現(xiàn),ContentProvider提供了一種統(tǒng)一的通過Uri實現(xiàn)數(shù)據(jù)操作的方式。

      詳細介紹使用過程

      File 通過文件內(nèi)容的讀取傳遞數(shù)據(jù)

      Preference: SharedPreferences也是一種輕型的數(shù)據(jù)存儲方式,它的本質(zhì)是基于XML文件存儲key-value鍵值

      對數(shù)據(jù),通常用來存儲一些簡單的配置信息

      SharedPreferences對象本身只能獲取數(shù)據(jù)而不支持存儲和修改,存儲修改是通過Editor對象實現(xiàn)。實現(xiàn)

      SharedPreferences存儲的步驟如下:

      一、根據(jù)Context獲取SharedPreferences對象

      二、利用edit()方法獲取Editor對象。

      三、通過Editor對象存儲key-value鍵值對數(shù)據(jù)。

      四、通過commit()方法提交數(shù)據(jù)。


      復(fù)制代碼
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16

         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. 在當(dāng)前應(yīng)用程序中定義一個ContentProvider。

      2. 在當(dāng)前應(yīng)用程序的AndroidManifest.xml中注冊此ContentProvider

      3. 其他應(yīng)用程序通過ContentResolver和Uri來獲取此ContentProvider的數(shù)據(jù)。

      在程序A中,繼承ContProvider類,并重寫其中的方法

      復(fù)制代碼
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54

      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中初始化一個數(shù)據(jù)庫
           @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;
           }

           //實現(xiàn)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

      標(biāo)識。

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

      在應(yīng)用程序B中,通過ContentResolver獲取程序A的ContentProvider中的數(shù)據(jù)。

      復(fù)制代碼
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25

      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");
               //獲取數(shù)據(jù)
               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();
               }
           }
       }

      再觀察兩個應(yīng)用程序的結(jié)構(gòu),A的程序結(jié)構(gòu),可以清楚看到其有一個名為“test_db.db3”的數(shù)據(jù)庫,B的程序結(jié)構(gòu),其并沒有任何數(shù)據(jù)庫用于存儲數(shù)據(jù)。由此圖,可以確定應(yīng)用程序B中查詢出來的數(shù)據(jù)結(jié)果是來自于應(yīng)用程序A。

      以上就是ContentProvider的使用方式,這種存儲方式相比SQLite和SharedPreferences,其復(fù)雜性是顯而易見的,但是在處處可見“云”的今天,程序間的數(shù)據(jù)交互需求令ContentProvider存儲機制變成必不可少的一部分。

      4 基于Ipc的通信機制

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

      5 基于Application Context

      在一個activity初始化一個ArrayList<HashMap<Sting,Map>>對象,然后經(jīng)過一個tableactivity,在傳遞到另

      外一個activity,一開始直接考慮用putExtra,測試發(fā)現(xiàn)數(shù)據(jù)只能傳遞一次,就考慮用Application傳遞

      Java里面通常是用一個static的變量(例如singleton之類的)來同步activity之間(程序里面類之間)的狀態(tài)。在android里面比較靠譜的做法是用application context來關(guān)聯(lián)這些狀態(tài)。

      每個activity都是context,里面包含了運行時的狀態(tài)。同樣application也有一個context,android會保證這個context是唯一的實例。

      復(fù)制代碼
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21

      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對象的代碼:

      復(fù)制代碼
      1
      2
      3
      4
      5
      6
      7

          ImageView imageview = (ImageView)findViewById(R.id.ivImageView);

          MyApp myApp = (MyApp)getApplication();

          imageview.setImageBitmap(myApp.getBitmap());

      上面兩段代碼可以在任何的Service、Activity中使用。全局的

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多