當前位置:首頁 » 存儲配置 » 安卓組件化數據存儲

安卓組件化數據存儲

發布時間: 2022-11-29 12:34:25

Ⅰ 安卓MVVM模式以及數據的請求與緩存

MVVM模式就相當於把ViewModel改名為Presener,其他基本相同。在ViewModel中處理數據邏輯,調用數據請求。但它和MVP的區別是可以雙向綁定,ViewModel中數據的改變可以直接反應在View上,而View的修改也可以影響ViewModel,這樣就省去Presenter和View之間的大量的調用介面。

谷歌官方提供了一個ViewModel類。這個類主要用來保存View的數據,一般在Activity的onCreate()方法中初始化ViewModel,但如果第二次調用onCreate(),那獲取到的ViewModel依然是第一次生成的那個實例,這就保證了數據的連貫。一般使用的場景為當屏幕旋轉時,Activity會重新調用onCreate()方法,但這時ViewModel依然能保存之前的數據。但Activity完全finish時,ViewModel才會被清空。

使用ViewModel還有其他好處,比如方便同一個Activity中不同的Fragment直接的通信,可以避免內存泄漏等等。

以下是ViewModel的基本使用方法,來自 官網 :

ViewModel一般和LiveData一起用。LiveData中的數據發生改變時,能發送通知給觀察者,觀察者就能修改相應的View。這也使得MVVM模式獲取數據時可以直接返回一個結果,而不用等網路請求數據成功後再通過回調返回數據,因為在回調中修改數據之後,LiveData會自動通知大家這個數據被修改了。

除此之外谷歌還提供了其他的架構組件,包括Lifecycle和Room等,可以查看官網的介紹。

Ⅱ 如何在android中利用shared preferences存儲和讀取數據

1、任務目標

(1)掌握Android中SharedPreferences的使用方法。

2、任務陳述

(1)運行後,顯示如下界面,可以寫入和讀取SharedPreferences中的數據:

3、任務實施及所涉及知識技能講解

第一步:新建一個Android工程,命名為SharedPreferencesWrite。

第二步:在layout下添加一個使用線性布局的布局文件,命名為:main.xml。

布局文件源代碼:

http://www.worlc.com/blog2012.aspx?bid=19403636

第三步:在CopySharedPreferencesTest.java下聲明如下變數,並導入導入相關包(如何使用SharedPreferences存儲和讀取數據):

[java] view plain
SharedPreferences preferences;
Editor editor;

第四步:在onCreate方法中修改如下代碼:

[java] view plain
setContentView(R.layout.main);

第五步:在onCreate方法中實例化前面聲明的兩個對象,代碼如下:

[java] view plain
preferences = getSharedPreferences("crazyit", MODE_WORLD_READABLE);
editor = preferences.edit();

第六步:在onCreate方法中獲取兩個按鈕,代碼如下:

[java] view plain
Button read = (Button) findViewById(R.id.read);
Button write = (Button) findViewById(R.id.write);

第七步:在onCreate方法中為兩個按鈕添加監聽器,代碼如下:

[java] view plain
write.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View arg0)
{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 "
+ "hh:mm:ss");
// 存入當前時間
editor.putString("time", sdf.format(new Date()));
// 存入一個隨機數
editor.putInt("random", (int) (Math.random() * 100));
// 提交所有存入的數據
editor.commit();
}
});

read.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View arg0)
{
//讀取字元串數據
String time = preferences.getString("time", null);
//讀取int類型的數據
int randNum = preferences.getInt("random", 0);
String result = time == null ? "您暫時還未寫入數據": "寫入時間為:" + time + "\n上次生成的隨機數為:" + randNum;
//使用Toast提示信息
Toast.makeText(SharedPreferencesTest.this ,
result , 5000).show();
}
});

第七步:點擊運行程序,程序源代碼如下:http://www.worlc.com/blog2012.aspx?bid=19403601

課堂練習:創建一個記錄應用程序使用次數的程序,當用戶第一次啟動應用程序時,系統創建SharedPrefererences,來記錄使用次數。用戶以後啟動應用程序時,系統先讀取SharedPrefererences中記錄的使用次數,然後將使用次數加1。

程序源代碼如下:

http://www.worlc.com/blog2012.aspx?bid=19403695

Ⅲ Android MMKV - 性能強悍的存儲工具(騰訊出品)

MMKV 是基於 mmap 內存映射的 key-value 組件,底層序列化/反序列化使用 protobuf 實現,性能高,穩定性強。從 2015 年中至今在微信上使用,其性能和穩定性經過了時間的驗證.

微信作為一個即時通訊項目,需要記錄數據比較多.需要頻繁的操作記錄的數據,需要一個性能強悍的存儲組件,他們考察了 SharedPreferences、NSUserDefaults、sqlite 等常見組件,發現都沒能滿足如此苛刻的性能要求。考慮到這個防 crash 方案最主要的訴求還是實時寫入,而 mmap 內存映射文件剛好滿足這種需求,就嘗試通過它來實現一套 key-value 組件。MMKV 就應運而生了.

重復讀寫操作 1k 次 MMKV 和 SharedPreferences、SQLite 性能對比( 機型:華為 Mate 20 Pro,版本:Android 10)

注意:
一些 Android 設備(API level 19)在安裝/更新 APK 時可能出錯, 導致 libmmkv.so 找不到。然後就會遇到 java.lang.UnsatisfiedLinkError 之類的 crash。有個開源庫 ReLinker 專門解決這個問題,你可以用它來載入 MMKV

MMKV 是騰訊出品的基於mmap內存映射文件技術的一種數據存儲的組件,相對於SharedPreferences SQlite 兼容性更好,存讀取速度更快.支持常規的各種數據類型.

來都來了,點個贊再走吧!!!

1.MMKV 文檔
2.源碼地址

Ⅳ Android 輕量級存儲方案(SharedPreferences、MMKV、Jetpack DataStore)

SharedPreferences使用:

SharedPreferencesImpl#EditorImpl.java 中最終執行了apply()函數:

創建一個awaitCommit的Runnable任務並將其加入到QueuedWork中,該任務內部直接調用了CountDownLatch.await()方法,即直接在UI線程執行等待操作,那麼我們看QueuedWork中何時執行這個任務。

QueuedWork.java:

waitToFinish()方法會嘗試從Runnable任務隊列中取任務,如果有的話直接取出並執行,我們看看哪裡調用了waitToFinish():

ActivityThread.java

可以看到在ActivityThread中handleStopActivity、handleStopService方法中都會調用waitToFinish()方法,即在Activity的onStop()中、Service的onStop()中都會先同步等待寫入任務完成才會繼續執行。

所以apply()雖然是非同步寫入磁碟,但是如果此時執行到Activity/Service的onStop(),依然可能會阻塞UI線程導致ANR。

   Jetpack DataStore 是一種改進的數據存儲解決方案,允許您使用 協議緩沖區 存儲鍵值對或類型化對象。
  DataStore 使用 Kotlin 協程和 Flow 以非同步、一致的事務方式存儲數據。並且可以對SP數據進行遷移,旨在取代SP。如果正在使用 SharedPreferences 存儲數據,請考慮遷移到 DataStore。

Jetpack DataStore 有兩種實現方式:

1.添加依賴項:

2.構建Preferences DataStore:

當我們構建後,會在 /data/data/<package name>/files/ 下創建名為 preferences_dataStore 的文件如下:

1.構建Preferences DataStore

2.存儲的實體類:

3.數據存儲/獲取:
Activity中:

ViewModel中:

Repository類中:

SP遷移至Preferences DataStore
如果想將項目的SP進行遷移,只需要在Preferences DataStore在構建時配置參數3,如下:

這樣構建完成時,SP中的內容也會遷移到Preferences DataStore中了,注意遷移是一次性的,即執行遷移後,SP文件會被刪除.

MMKV 是基於 mmap 內存映射的 key-value 組件,底層序列化/反序列化使用 protobuf 實現,性能高,穩定性強。

1.添加依賴:

2.Application的onCreate方法中初始化

3.數據存儲/獲取:

github地址: https://github.com/HuiZaierr/Android_Store

Ⅳ Android 怎樣在應用程序中向文件里寫入數據

  1. Android 怎樣在應用程序中向文件里寫入數據?在AndroidManifest.xml中添加, <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />,解決!

  2. 另外了解一下android的數據存儲方式:文件流的讀取,SQLite,Content Provider以及Preference.。 註:resource和assets中的文件用戶方面是只可以讀取不能夠進行寫的操作的。
    Content Provider作為程序之間唯一共享數據途徑,用在這里不是很合適。所以,
    第一種方式,使用FileInputStream,FileOutputStreami類實現文件I/O操作,直接往手機中存儲數據。
    第二種方式,使用SQLite,通過SQLiteDatabase類中方法操作數據。
    第三種方式,Preference用於存儲簡單數據類型的數據,一些設置信息的保存。個人認為用在這里最合適。 它利用鍵值對存儲的。例:
    存儲:SharedPreferences.Editor editor =sp.edit();
    editor.putString(KEY_TEXT,"yonghu");
    editor.commit();
    獲取 :sp =getPreferences(MODE_PRIVATE);

    String result =sp.getString(KEY_TEXT,null)

  3. Android保存數據幾種常用方法解析

    它應用於手機中能夠幫助我們實現許多需求。比如今天為大家介紹的Android保存數據,就是其中一個比較重要的操作技巧。Android組件相關概念總結Android傳值方法細講Android橫豎屏切換正確實現方式分享Android開發環境相關配置概覽Android NDK具體作用講解對於我們所熟悉的大部分軟體都有一個比較典型的特點,應用現有的數據根據不同的需求來得到相應的結果。例如,我們最常用的Officeword、Excel、PowerPoint等辦公軟體,它們都是幫助我們完成某種特定的需求,同時由其所產生的數據或者文檔又可以被其它軟體所讀取和做進一步的優化等等,在這個層面上可以看成是這些軟體通過相同的文件標准來共享數據。但是對於Android最大的不同點在於,其平台上的應用軟體所存儲的數據或者文件是私有,僅僅可以通過它自身才可以訪問其所包含的數據資源。那麼基於這樣的限制,該如何在Android平台上實現不同程序間的數據共享呢?答案非常簡單 – 應用ContentProviders,這是建立在Android平台上用於定義統一的數據標准。Android提供了針對不同數據類型的ContentProviders來滿足各種需要。例如:Image、Audio、Video和通訊錄信息類等。閱讀下邊的文檔之前,最好先熟悉Content Providers的概念。有了上邊所提到Content Providers,接下來就要處理在共享文件過程中的存儲環節了,這里有四種方法分別適用於不同情況的需求。它們都各自有相應的優缺點,所以當開發者決定選擇應用哪種方法之前,先要考慮當前所操作的情況是否適合於所選擇的方法。Preferences Files Databases Network 接下來將依次介紹上訴四個Android保存數據方法:Preferences從其保存數據的結構來分析,這是一個相對較輕量級的存儲數據的方法。類似於我們常用的ini文件保存軟體初始化設置,同樣在Android平台常用於存儲較簡單的參數設置。例如,可以通過它保存上一次用戶所作的修改或者自定義參數設定,當再次啟動程序後依然保持原有的設置。通過Context.getSharedPreferences()方法來讀寫數值,這個方法通過設置name來使得同一個程序內的其它模塊共享數據。如果不需要與其它模塊共享數據,可以使用Activity.getPreferences()方法保持數據私有。需要著重強調一點,無法直接在多個程序間共享Preferences數據(不包括使用Content Providers)。通過一個實例來了解實際使用方法:import android.app.Activity; import android.content.SharedPreferences; public class Calc extends Activity { public static final String PREFS_NAME = "MyPrefsFile"; . . . . Override protected void onCreate(Bundle state){ super.onCreate(state); . . . . // Restore preferences SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0); boolean silent = settings.getBoolean("silentMode", false); setSilent(silent); } @Override protected void onStop(){ super.onStop(); // Save user preferences. We need an Editor object to // make changes. All objects are from android.context.Context SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0); SharedPreferences.Editor editor = settings.edit(); editor.putBoolean("silentMode", mSilentMode); // Don't forget to commit your edits!!! editor.commit(); } } Files從這是第二種方法,可以在設備本身的存儲設備或者外接的存儲設備中創建用於保存數據的文件。同樣在默認的狀態下,文件是不能在不同的程序間共享。寫文件:調用Context.openFileOutput()方法根據指定的路徑和文件名來創建文件,這個方法會返回一個FileOutputStream對象。讀取文件:調用Context.openFileInput()方法通過制定的路徑和文件名來返回一個標準的Java FileInputStream對象。
    (注意:在其它程序中將無法應用相同的路徑和文件名來操作文件)另外編譯程序之前,在res/raw/tempFile中建立一個static文件,這樣可以在程序中通過Resources.openRawResource (R.raw.myDataFile)方法同樣返回一個InputStream對象,直接讀取文件內容。Databases在Android API中包括了應用SQLite databases的介面,每個程序所創建的資料庫都是私有的,換句話說,程序間無法相互訪問對方的資料庫。在程序中創建SQLiteDatabase對象,其中包含了大部分與database交互的方法,例如:讀取數據或者管理當前數據。可以應用SQLiteDatabase和其subClassSQLiteOpenHelper的create()方法來創建新的資料庫。對於SQLitedatabase而言,其強大和方便的功能為Android提供了強有力的存儲功能。特別是存儲一些復雜的數據結構,例如:Android特別為通訊錄創建了特有的數據類型,其中包含了非常多的子集而且涵蓋了大部分的數據類型 「First Name」 「Last Name」 「PhoneNumber」和「Photo」等。Android可以通過Sqlite3 database tool來查看指定資料庫中表的內容,直接運行SQL命令來快速便捷的直接操作SQLite database。

Ⅵ Android之ContentProvider使用

ContentProvider是Android四大組件之一,其本質上是一個標准化的數據管道,它屏蔽了底層的數據管理和服務等細節,以標准化的方式在Android 應用間共享數據。用戶可以靈活實現ContentProvider所封裝的數據存儲以及增刪改查等,所有的ContentProvider 必須實現一個對外統一的介面(URI)。

使用的時候需要在androidmanifest.xml文件中注冊provider。

在androidmanifest.xml中注冊provider需要以下3個屬性:

Ⅶ Android 下的 WebView 中數據如何保存

1、Android中的WebView控制項當載入html時候,會在data/應用package下生成database與cache兩個文件夾如下圖如示:

Url記錄是保存在webviewCache.db里,而url的內容是保存在webviewCache文件夾下。
WebView中存在著兩種緩存:網頁數據緩存(存儲打開過的頁面及資源)、H5緩存(即AppCache)。



2、緩存構成
/data/data/package_name/cache/
/data/data/package_name/database/webview.db

/data/data/package_name/database/webviewCache.db

webview 會將瀏覽過的網頁url以及網頁文件(css、圖片、js等)保存到資料庫表中。


緩存模式(5種)
LOAD_CACHE_ONLY: 不使用網路,只讀取本地緩存數據
LOAD_DEFAULT: 根據cache-control決定是否從網路上取數據。
LOAD_CACHE_NORMAL: API level 17中已經廢棄, 從API level 11開始作用同LOAD_DEFAULT模式
LOAD_NO_CACHE: 不使用緩存,只從網路獲取數據.
LOAD_CACHE_ELSE_NETWORK,只要本地有,無論是否過期,或者no-cache,都使用緩存中的數據。

Ⅷ android怎樣緩存數據面試題

共有七個周期函數,按順序分別是: onCreate(), onStart(), onRestart(), onResume(), onPause(),onStop(), onDestroy()。
onCreate(): 創建Activity時調用,設置在該方法中,還以Bundle的形式提供對以前存儲的任何狀態的訪問。
onStart(): Activity變為在屏幕上對用戶可見時調用。
onResume(): Activity開始與用戶交互時調用(無論是啟動還是重新啟動一個活動,該方法總是被調用。
onPause(): Activity被暫停或收回cpu和其他資源時調用,該方法用戶保護活動狀態的,也是保護現場。
onStop(): Activity被停止並轉為不可見階段及後續的生命周期事件時調用。
onRestart(): Activity被重新啟動時調用。該活動仍然在棧中,而不是啟動新的Activity。
1、完整生命周期: 即從一個Activity從出現到消失,對應的周期方法是從onCreate()到onDestroy()。
2、可見生命周期: 當Activity處於可以用戶看見的狀態,但不一定能與用戶交互時,將多次執行從onStart()到onStop()。
3、前景生命周期: 當Activity處於Activity棧最頂端,能夠與其他用戶進行交互時,將多次執行從onResume()到onPause()。

2. 兩個Activity之間跳轉時必然會執行的是哪幾個方法。
答: 兩個Activity之間跳轉必然會執行的是下面幾個方法。
onCreate()//在Activity生命周期開始時調用。
onRestoreInstanceState()//用來恢復UI狀態。
onRestart()//當Activity重新啟動時調用。
onStart()//當Activity對用戶即將可見時調用。
onResume()//當Activity與用戶交互時,繪制界面。
onSaveInstanceState()//即將移出棧頂保留UI狀態時調用。
onPause()//暫停當前活動Activity,提交持久數據的改變,停止動畫或其他佔用GPU資源的東西,由於下一個Activity在這個方法返回之前不會resume,所以這個方法的代碼執行要快。
onStop()//Activity不再可見時調用。
onDestroy()//Activity銷毀棧時被調用的最後一個方法。

3. 橫豎屏切換時候Activity的生命周期。
答:
1、不設置Activity的android: configChanges時,切屏會重新調用各個生命周期,切橫屏時會執行一次,切豎屏時會執行兩次。
2、設置Activity的android: configChanges=「orientation」時,切屏還是會重新調用各個生命周期,切橫、豎屏時只會執行一次。
3、設置Activity的android: configChanges=「orientation|keyboardHidden」時,切屏不會重新調用各個生命周期,只會執行onConfiguration方法

4. 如何將一個Activity設置成窗口的樣式。
答: 第一種方法,在styles.xml文件中,可以新建如下的類似Dialog的style。
<style name=「Theme.FloatActivity」 parent=「android:style/Theme.Dialog」> </style>。
第二種方法,在AndroidManifest.xml中在需要顯示為窗口的Activity中添加如下屬性: android: theme=「@style/Theme.FloatActivity」即可。也可以直接添加對應需要展示為Dialog style的Activity的android: theme屬性為android: theme=「@ android: style/Theme.Dialog」。

5. 兩個Activity之間怎麼傳遞數據?
答: 可以在Intent對象中利用Extra來傳遞存儲數據。
在Intent的對象請求中,使用putExtra(「鍵值對的名字」,」鍵值對的值」);在另外一個Activity中將Intent中的請求數據取出來:
Intent intent = getIntent();
String value = intent.getStringExtra(「testIntent」);

6. 怎麼讓在啟動一個Activity是就啟動一個service?
答: 首先定義好一個service,然後在Activity的onCreate裡面進行連接並bindservice或者直接startService。

7. Activity怎麼和service綁定,怎麼在activity中啟動自己對應的service?
答:
1、activity能進行綁定得益於Serviece的介面。為了支持Service的綁定,實現onBind方法。
2、Service和Activity的連接可以用ServiceConnection來實現。需要實現一個新的ServiceConnection,重現onServiceConnected和OnServiceDisconnected方法,一旦連接建立,就能得到Service實例的引用。
3、執行綁定,調用bindService方法,傳入一個選擇了要綁定的Service的Intent(顯示或隱式)和一個你實現了的ServiceConnection的實例

8.什麼是Service以及描述下它的生命周期。Service有哪些啟動方法,有什麼區別,怎樣停用Service?
答: Android Service是運行在後台的代碼,不能與用戶交互,可以運行在自己的進程,也可以運行在其他應用程序進程的上下文里。需要通過某一個Activity或者Context對象來調用。Service有兩個啟動方法,分別是Context.startService()和Context.bindService()。如果在Service執行耗時的操作需要啟動一個新線程來執行。
Android Service只繼承了onCreate(), onStart(),onDestroy()三個方法,當我們第一次啟動Service時,先後調用onCreate(), onStart()這兩個方法,當停止Service時,則執行onDestroy()方法時。如果Service已經啟動了,當我們再次啟動Service時,不會再執行onCreate()方法,而是直接執行onStart()方法。

9. 什麼時候使用Service?
答: 比如播放多媒體的時候,用戶啟動了其他Activity,這個時候程序要在後台繼續播放,比如檢測SD卡上文件的變化,再或者在後台記錄你的地理信息位置的改變等等。

10. 請描述一下Intent 和 Intent Filter。
答: Intent在Android中被翻譯為」意圖」,他是三種應用程序基本組件-Activity,Service和broadcast receiver之間相互激活的手段。在調用Intent名稱時使用ComponentName也就是類的全名時為顯示調用。這種方式一般用於應用程序的內部調用,因為你不一定會知道別人寫的類的全名。而Intent Filter是指意圖過濾,不出現在代碼中,而是出現在android Manifest文件中,以<intent-filter>的形式。(有一個例外是broadcast receiver的intent
filter是使用Context.registerReceiver()來動態設定的,其中intent filter也是在代碼中創建的)
一個intent有action,data,category等欄位。一個隱式intent為了能夠被某個intent filter接收,必須通過3個測試,一個intent為了被某個組件接收,則必須通過它所有的intent filter中的一個。

11. Intent傳遞數據時,可以傳遞哪些類型數據?
答: intent間傳送數據一般有兩種常用的方法: 1、extra 2、data。
extra可以用Intent.putExtra放入數據。新啟動的Activity可用Intent.getExtras取出Bundle,然後用Bundles.getLong,getInt,getBoolean,getString等函數來取放進去的值。
Data則是傳輸url。url可以是指我們熟悉的http,ftp等網路地址,也可以指content來指向ContentProvider提供的資源。Intent.setData可以放入數據,Intent.getData可以取出數據。

12. 說說Activity,Intent,Service是什麼關系 ?
答: 一個Activity通常是一個單獨的屏幕,每一個Activity都被實現為一個單獨的類,這些類都是從Activity基類中繼承而來的。Activity類會顯示由視圖控制項組成的用戶介面,並對視圖控制項的事件做出響應。
Intent的調用是用來進行屏幕之間的切換。Intent描述應用想要做什麼。Intent數據結構中兩個最重要的部分是動作和動作對應的數據,一個動作對應一個動作數據。
Service是運行在後台的代碼,不能與用戶交互,可以運行在自己的進程里,也可以運行在其他應用程序進程的上下文里。需要一個Activity或者其他Context對象來調用。
Activity跳轉Activity,Activity啟動Service,Service打開Activity都需要Intent表明意圖,以及傳遞參數,Intent是這些組件間信號傳遞的承載著。

13. 請描述一下BroadcastReceiver。
答: Broadcast Receiver用於接收並處理廣播通知(broadcast announcements)。多數的廣播是系統發起的,如地域變換、電量不足、來電簡訊等。程序也可以播放一個廣播。程序可以有任意數量的broadcast receivers來響應它覺得重要的通知。Broadcast receiver可以通過多種方式通知用戶: 啟動activity、使用NotificationManager、開啟背景燈、振動設備、播放聲音等,最典型的是在狀態欄顯示一個圖標,這樣用戶就可以點它打開看通知內容。通常我們的某個應用或系統本身在某些事件(電池電量不足、來電簡訊)來臨時會廣播一個Intent出去,我們利用注冊一個broadcast
receiver來監聽這些Intent並獲取Intent中的數據。

14. 在manifest和代碼中如何注冊和使用 broadcast receiver 。
答: 在android的manifest中注冊
<receiver android: name =「Receiver1」>
<intent-filter>
<!----和Intent中的action對應--->
<actionandroid: name=「com.forrest.action.mybroadcast」/>
</intent-filter>
</receiver>
在代碼中注冊
1、 IntentFilter filter = new IntentFilter(「com.forrest.action.mybroadcast」);//和廣播中Intent的action對應;
2、 MyBroadcastReceiver br= new MyBroadcastReceiver();
3、 registerReceiver(br, filter);

15. 請介紹下ContentProvider是如何實現數據共享的。
答: 一個程序可以通過實現一個Content provider的抽象介面將自己的數據完全暴露出去,而且Content provider是以類似資料庫中的表的方式將自己的數據暴露。Content provider存儲和檢索數據,通過它可以讓所有的應用程序訪問到,這也是應用程序之間唯一共享數據的方法。
要想使應用程序的數據公開化,可通過2種方法:創建一個數據自己的Content Provider或者將你的數據添加到一個已經存在的Content Provider中,前提是有相同數據類型並且有寫入Content Provider的許可權,Android提供了Content Resolverr,外界的程序可以通過Content Resolver介面訪問Content Provider提供的數據。

16. 請介紹下Android的數據存儲方式。
答: Android提供了5中存儲數據的方式,分別是以下幾種
1、使用Shared Preferences存儲數據,用來存儲key-value,pairs格式的數據,它是一個輕量級的鍵值存儲機制,只可以存儲基本數據類型。
2、使用文件存儲數據,通過FileInputStream和FileOutputStream對文件進行操作。在Android中,文件是一個應用程序私有的,一個應用程序無法讀寫其他應用程序的文件。
3、使用SQLite資料庫存儲數據,Android提供的一個標准資料庫,支持SQL語句。
4、使用Content Provider存儲數據,是所有應用程序之間數據存儲和檢索的一個橋梁,它的作用就是使得各個應用程序之間實現數據共享。它是一個特殊的存儲數據的類型,它提供了一套標準的介面用來獲取數據,操作數據。系統也提供了音頻、視頻、圖像和個人信息等幾個常用的Content Provider。如果你想公開自己的私有數據,可以創建自己的Content Provider類,或者當你對這些數據擁有控制寫入的許可權時,將這些數據添加到Content Provider中實現共享。外部訪問通過Content Resolver去訪問並操作這些被暴露的數據。
5、使用網路存儲數據

17. 請介紹下Android中常用的五種布局。
答: 最常用的布局方式為Absolute Layout、Relative Layout、Linear Layout、FrameLayout、TableLayout。其中Linear Layout和Relative Layout是最常用的方式,他們可以通過在xml配置文件或者代碼中進行布局。
1、Frame Layout是最簡單的布局方式,放置的控制項都只能羅列到左上角,控制項會有重疊,不能進行復雜的布局。
2、Linear Layout可以通過orientation屬性設置線性排列的方向是垂直還是縱向的,每行或每列只有一個元素,可以進行復雜的布局。
3、Absolute Layout可以讓子元素指定準確的x、y坐標值,並顯示在屏幕上。Absolute Layout沒有頁邊框,允許元素之間相互重疊。它是絕對坐標,所以在實際中不提倡使用。

4、Relative Layout允許子元素制定他們相對於其他元素或父元素的位置(通過ID制定)。因此,你可以以右對齊,或上下,或置於屏幕中央的形式來排列兩個元素。元素按順序排列,因此如果第一個元素在屏幕的中央,那麼相對於這個元素的其他元素將以屏幕中央的相對位置來排列。這個是相對於Absolute Layout的,採用相對坐標,所以在實際中比較常用。
5、Table Layout將以子元素的位置分配到行或列。一個Table Layout由許多的Table Row組成,每個Table Row都會定義一個row。Table Layout容器不會顯示row、column或者cell的邊線框。每個row擁有0個或多個的cell; 和html中的table差不多。在實際中也經常使用。

18. 談談UI中, Padding和Margin有什麼區別?
答: Padding是控制項的內容相對控制項的邊緣的邊距,而Margin是控制項邊緣相對於其他控制項的邊距。如下圖所示:

19. android本身的一些限制,比如apk包大小限制,讀取大文件時的時間限。
答:apk包大小限制不好說,有的apk為100M,還是能裝到手機上。一般的apk大小為5~10M左右。讀取大文件的時間應該是在main線程裡面,時間限制為5秒左右。

20. ListView如何提高其效率?
答:1、使用分頁載入,不要一次性載入所有數據。
2、復用convertView。在getItemView中,判斷converView是否為空,如果不為空,可復用。
3、非同步載入圖片。Item中如果包含有webimage,那麼最好非同步載入。
4、快速滑動時,不顯示圖片。當快速滑動列表(SCROLL_STATE_FLING),item中的圖片或獲取需要消耗資源的view,可以不顯示出來;而處於其他兩種狀態(SCROLL_STATE_IDLE和SCROLL_STATE_TOUCH_SCROLL),則將那些view顯示出來

Ⅸ android 組件間、進程間數據傳輸和限制

1、Bunder 傳遞對象為什麼需要序列化?

1》因為 bundle 傳遞數據時只支持基本數據類型,所以在傳遞對象時需要序列化轉

換成可存儲或可傳輸的本質狀態(位元組流)。序列化後的對象可以在網路、IPC

(比如啟動另一個進程的 Activity、Service 和 Reciver)之間進行傳輸,也可以 存儲到本地。

2》序列化,表示將一個對象轉換成可存儲或可傳輸的狀態。序列化的原因基本三種 情況:

1.永久性保存對象,保存對象的位元組序列到本地文件中; 2.對象在網路中傳遞;

3.對象在 IPC 間傳遞。

2、序列化Serializable 和Parcelable 的區別
Serializable(Java 自帶):

1》Serializable 是序列化的意思,表示將一個對象轉換成存儲或可傳輸的狀態。序列化後的對象可以在網路上進傳輸,也可以存儲到本地。

2》Serializable 會使用反射,序列化和反序列化過程需要大量 I/O 操作。

Parcelable(android 專用):

1》除了 Serializable 之外,使用 Parcelable 也可以實現相同的效果,不過不同於將 對象進行序列化,Parcelable 方式的實現原理是將一個完整的對象進行分解,而分解後的每一部分都是 Intent 所支持的數據類型,這也就實現傳遞對象的功能 了。

2》Parcelable 自已實現封送和解封(marshalled &unmarshalled)操作不需要用反 射,數據也存放在 Native 內存中,效率要快很多。

兩者最大的區別在於 存儲媒介的不同,Serializable 使用 I/O 讀寫存儲在硬碟 上,而 Parcelable 是直接 在內存中讀寫。很明顯,內存的讀寫速度通常大於 IO 讀寫,所以在 Android 中傳遞數據優先選擇 Parcelable。

3、bundle傳輸的數據是否有限制,是多少,為什麼要限制?

1》Intent 在傳遞數據時是有大小限制的,大約限制在 1MB 之內,你用 Intent 傳遞 數據,實際上走的是跨進程通信(IPC),跨進程通信需要把數據從內核 到進程中,每一個進程有一個接收內核數據的緩沖區,默認是 1M;如果一次傳 遞的數據超過限制,就會出現異常。

2》不同廠商表現不一樣有可能是廠商修改了此限制的大小,也可能同樣的對象在不 同的機器上大小不一樣。

3》傳遞大數據,不應該用 Intent;考慮使用 ContentProvider 或者直接匿名共享內 存。簡單情況下可以考慮分段傳輸。

4、匿名共享內存(https://www.jianshu.com/p/d9bc9c668ba6)

Ⅹ android 怎麼做數據緩存

二級緩存工作機制
所謂二級緩存實際上並不復雜,當Android端需要獲得數據時比如獲取網路中的圖片,我們首先從內存中查找(按鍵查找),內存中沒有的再從磁碟文件或sqlite中去查找,若磁碟中也沒有才通過網路獲取;當獲得來自網路的數據,就以key-value對的方式先緩存到內存(一級緩存),同時緩存到文件或sqlite中(二級緩存)。注意:內存緩存會造成堆內存泄露,所有一級緩存通常要嚴格控制緩存的大小,一般控制在系統內存的1/4。
理解了二級緩存大家可能會有個問題網路中的數據是變化的,數據一旦放入緩存中,再取該數據就是從緩存中獲得,這樣豈不是不能體現數據的變化?我們在緩存數據時會設置有效時間,比如說30分鍾,若超過這個時間數據就失效並釋放空間,然後重新請求網路中的數據。有的童鞋就問30分鍾內咋辦?那好吧,我也沒招了,只有下拉刷新了, 實際上這不是問題。
二級緩存的實現
如何實現二級緩存,有很多技術方案,在這里我們使用 ASimpleCache框架來給大家演示一下,通過名字就可以看出它是很容易實現的。

1、ACache介紹
ASimpleCache是一個輕量級的開源cache框架,實際上就是一個叫ACache的java類。已經在商業項目中使用,運行效果不錯。

2、ACache使用
我們先做一個實現數據緩存的案例,然後再歸納一下主要的方法
編寫NewsListActivity主要代碼如下:

創建ACache組件
ACache acache=ACache.get(context)

ACache acache=ACache.get(context,max_size,max_count)

參數說明:
max_size:設置限制緩存大小,默認為50M
max_count:設置緩存數據的數量,默認不限制
設置緩存數據
acache.put(key,data,time)或acache.put(key,data)
將數據同時上存入一級緩存(內存Map)和二級緩存(文件)中
參數說明:
Key:為存入緩存的數據設置唯一標識,取數據時就根據key來獲得的
Data:要存入的數據,acache支持的數據類型如圖所示:
有String、可序列化的對象、位元組數組、Drawable等Time:設置緩存數據的有效時間,單位秒

從緩存中取數據
提供一系列getAsXXX()方法,如圖所示。
根據不同存入數據,調用不同的方法取數據

熱點內容
python字元串函數參數 發布:2025-09-23 09:03:39 瀏覽:475
dz資料庫鏈接 發布:2025-09-23 08:41:46 瀏覽:300
顯卡緩存和顯存的區別 發布:2025-09-23 08:34:00 瀏覽:226
存儲用法 發布:2025-09-23 08:19:47 瀏覽:867
汽車高配置有哪些 發布:2025-09-23 08:16:41 瀏覽:808
趣撲源碼 發布:2025-09-23 07:56:09 瀏覽:409
大佬黑源碼 發布:2025-09-23 07:32:44 瀏覽:152
女朋友的媽嗎ftp 發布:2025-09-23 07:21:46 瀏覽:688
c語言ls 發布:2025-09-23 07:21:08 瀏覽:278
有道編程模式 發布:2025-09-23 07:20:26 瀏覽:932