android五種存儲
1. 在android中簡單描述數據存儲的具體位置在哪裡
數據存儲在開發中是使用最頻繁的,Android平台主要有5種實現數據存儲的方式。
第1種: 使用SharedPreferences存儲數據
SharedPreferences是Android平台上一個輕量級的存儲類,主要是保存一些常用的配置比如窗口狀態,一般在Activity中 重載窗口狀態onSaveInstanceState保存一般使用SharedPreferences完成,它提供了Android平台常規的Long長 整形、Int整形、String字元串型的保存。
它的本質是基於XML文件存儲key-value鍵值對數據,通常用來存儲一些簡單的配置信息。
其存儲位置在/data/data/<包名>/shared_prefs目錄下。
SharedPreferences對象本身只能獲取數據而不支持存儲和修改,存儲修改是通過Editor對象實現。
實現SharedPreferences存儲的步驟如下:
一、根據Context獲取SharedPreferences對象
二、利用edit()方法獲取Editor對象。
三、通過Editor對象存儲key-value鍵值對數據。
四、通過commit()方法提交數據。
SharedPreferences對象與sqlite資料庫相比,免去了創建資料庫,創建表,寫SQL語句等諸多操作,相對而言更加方便,簡潔。但是SharedPreferences也有其自身缺陷,比如其職能存儲boolean,int,float,long和String五種簡單的數據類型,比如其無法進行條件查詢等。所以不論SharedPreferences的數據存儲操作是如何簡單,它也只能是存儲方式的一種補充,而無法完全替代如SQLite資料庫這樣的其他數據存儲方式。
2. 手機存儲卡里的zip文件能不能刪除
ZIP文件格式是一種數據壓縮和文檔儲存的文件格式可以刪除。
手機存儲卡其他文件類型:
一、android_secure:官方app2sd的產物,存儲了相關的軟體使用認證驗證,刪除之後SD卡中的軟體將無法使用。
二、Android:存放重要的程序數據,比如google:map的地圖緩存,誤刪掉後地圖還需重新下載。
三、backups:包含重要的備份文件,比如聯系人導出到SD卡會導入到此文件夾。
四、bugtogo:系統出現問題的時候會形成一些報告文件,存放在此文件夾。
五嫌賣、data:緩存數據文件夾,與Android類似。例如,「截圖助手」截圖保存在。
六、SystemAppBackup:SystemApp。
擴展攜慎資料:
刪除手機中壓縮數據包的優缺點:
每天,手機上都有一些應用軟體,包括視頻、圖片、游戲和通訊工具。當手機設置為自動下載所有應用程序時,手機的空間將被佔用,手機的性能將下降。因此,辯者敬有必要刪除一些應用軟體壓縮包,這樣既不會損壞手機,又會提高性能。
這些是手機的系統軟體。刪除手機後,可能會出現黑屏、文件丟失甚至無法使用等情況。而且,手機不可能恢復。要解決這個問題,必須去專業的修理廠。因此,在刪除這些類型的手機壓縮包時,一定要小心謹慎,使用手機時一定要定期檢查並殺滅病毒。
3. 安卓游戲和軟體保存的數據在哪
據我所知,理論上有一下途徑(如果是單機游戲的話)
使用類似於全備份的軟體,直接備份手機SD及內存內的全部數據,還原後理論上是沒有問題的。
下載一些存檔軟體,那些軟體可以支持對單機游戲進行存檔,恢復後仍然是原來玩到的關卡。
盡量不要動不動都恢復出廠設置,盡量採取別的途徑解決。
如有用請採納,沒用的話告訴我。
4. Android中用什麼方法來存儲數據,最常的方式是什麼 像 QQ 微信的數據如何存儲的
Android應用開發中,給我們提供了5種數據的存儲方式
1 使用SharedPreferences存儲數據
2 文件存儲數據
3 SQLite資料庫存儲數據
4 使用ContentProvider存儲數據
5 網路存儲數據
不同的業務邏輯,或者需求,用不同的實現方式,以下是這幾中數據存儲方式的說明用及法:
第一種: 使用SharedPreferences存儲數據
SharedPreferences是Android平台上一個輕量級的存儲類,主要是保存一些常用的配置比如窗口狀態,
一般在Activity中 重載窗口狀態onSaveInstanceState保存一般使用SharedPreferences完成,
它提供了Android平台常規的Long長 整形、Int整形、String字元串型的保存。
SharedPreferences類似過去Windows系統上的ini配置文件,但是它分為多種許可權,
可以全局共享訪問,android123提示最終是以xml方式來保存,整體效率來看不是特別的高,
對於常規的輕量級而言比SQLite要好不少,如果真的存儲量不大可以考慮自己定義文件格式。
xml 處理時Dalvik會通過自帶底層的本地XML Parser解析,比如XMLpull方式,這樣對於內存資源佔用比較好。
它的本質是基於XML文件存儲key-value鍵值對數據,通常用來存儲一些簡單的配置信息。
其存儲位置在/data/data/< >/shared_prefs目錄下。
SharedPreferences對象本身只能獲取數據而不支持存儲和修改,存儲修改是通過Editor對象實現。
實現SharedPreferences存儲的步驟如下:
一、根據Context獲取SharedPreferences對象
二、利用edit()方法獲取Editor對象。
三、通過Editor對象存儲key-value鍵值對數據。
四、通過commit()方法提交數據。
下面是示例代碼:
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//獲取SharedPreferences對象
Context ctx = MainActivity.this;
SharedPreferences sp = ctx.getSharedPreferences("SP", MODE_PRIVATE);
//存入數據
Editor editor = sp.edit();
editor.putString("STRING_KEY", "string");
editor.putInt("INT_KEY", 0);
editor.putBoolean("BOOLEAN_KEY", true);
editor.commit();
//返回STRING_KEY的值
Log.d("SP", sp.getString("STRING_KEY", "none"));
//如果NOT_EXIST不存在,則返回值為"none"
Log.d("SP", sp.getString("NOT_EXIST", "none"));
}
}
這段代碼執行過後,即在/data/data/com.test/shared_prefs目錄下生成了一個SP.xml文件,一個應用可以創建多個這樣的xml文件。
SharedPreferences對象與SQLite資料庫相比,免去了創建資料庫,創建表,寫SQL語句等諸多操作,相對而言更加方便,簡潔。
但是SharedPreferences也有其自身缺陷,比如其職能存儲boolean,int,float,long和String五種簡單的數據類型,比如其無法進行條件查詢等。
所以不論SharedPreferences的數據存儲操作是如何簡單,它也只能是存儲方式的一種補充,而無法完全替代如SQLite資料庫這樣的其他數據存儲方式。
第二種: 文件存儲數據
關於文件存儲,Activity提供了openFileOutput()方法可以用於把數據輸出到文件中,具體的實現過程與在J2SE環境中保存數據到文件中是一樣的。
文件可用來存放大量數據,如文本、圖片、音頻等。
默認位置:/data/data/< >/files/***.***。
代碼示例:
public void save(){
try {
FileOutputStream outStream=this.openFileOutput("a.txt",Context.MODE_WORLD_READABLE);
outStream.write(text.getText().toString().getBytes());
outStream.close();
Toast.makeText(MyActivity.this,"Saved",Toast.LENGTH_LONG).show();
} catch (FileNotFoundException e) {
return;
}
catch (IOException e){
return ;
}
}
openFileOutput()方法的第一參數用於指定文件名稱,不能包含路徑分隔符「/」 ,如果文件不存在,Android 會自動創建它。
創建的文件保存在/data/data//files目錄,如: /data/data/cn.itcast.action/files/itcast.txt ,
通過點擊Eclipse菜單「Window」-「Show View」-「Other」,在對話窗口中展開android文件夾,
選擇下面的File Explorer視圖,然後在File Explorer視圖中展開/data/data//files目錄就可以看到該文件。
openFileOutput()方法的第二參數用於指定操作模式,有四種模式,分別為:
Context.MODE_PRIVATE = 0
Context.MODE_APPEND = 32768
Context.MODE_WORLD_READABLE = 1
Context.MODE_WORLD_WRITEABLE = 2
Context.MODE_PRIVATE:為默認操作模式,代表該文件是私有數據,只能被應用本身訪問,在該模式下,寫入的內容會覆蓋原文件的內容,如果想把新寫入的內容追加到原文件中。可以使用Context.MODE_APPEND
Context.MODE_APPEND:模式會檢查文件是否存在,存在就往文件追加內容,否則就創建新文件。
Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用來控制其他應用是否有許可權讀寫該文件。
MODE_WORLD_READABLE:表示當前文件可以被其他應用讀取;
MODE_WORLD_WRITEABLE:表示當前文件可以被其他應用寫入。
如果希望文件被其他應用讀和寫,可以傳入: openFileOutput("itcast.txt", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE); android有一套自己的安全模型,當應用程序(.apk)在安裝時系統就會分配給他一個userid,當該應用要去訪問其他資源比如文件的時候,就需要userid匹配。默認情況下,任何應用創建的文件,sharedpreferences,資料庫都應該是私有的(位於/data/data//files),其他程序無法訪問。
除非在創建時指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE ,只有這樣其他程序才能正確訪問。
讀取文件示例:
public void load(){
try {
FileInputStream inStream=this.openFileInput("a.txt");
ByteArrayOutputStream stream=new ByteArrayOutputStream();
byte[] buffer=new byte[1024];
int length=-1;
while((length=inStream.read(buffer))!=-1) {
stream.write(buffer,0,length);
}
stream.close();
inStream.close();
text.setText(stream.toString());
Toast.makeText(MyActivity.this,"Loaded",Toast.LENGTH_LONG).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e){
return ;
}
}
對於私有文件只能被創建該文件的應用訪問,
如果希望文件能被其他應用讀和寫,
可以在創建文件時,指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE許可權。
Activity還提供了getCacheDir()和getFilesDir()方法: g
etCacheDir()方法用於獲取/data/data//cache目錄 getFilesDir()方法用於獲取/data/data//files目錄。
把文件存入SDCard:
使用Activity的openFileOutput()方法保存文件,文件是存放在手機空間上,
一般手機的存儲空間不是很大,存放些小文件還行,如果要存放像視頻這樣的大文件,是不可行的。
對於像視頻這樣的大文件,我們可以把它存放在SDCard。
SDCard是干什麼的?你可以把它看作是移動硬碟或U盤。
在模擬器中使用SDCard,你需要先創建一張SDCard卡(當然不是真的SDCard,只是鏡像文件)。
創建SDCard可以在Eclipse創建模擬器時隨同創建,也可以使用DOS命令進行創建,
如下: 在Dos窗口中進入android SDK安裝路徑的tools目錄,
輸入以下命令創建一張容量為2G的SDCard,文件後綴可以隨便取,
建議使用.img: mksdcard 2048M D:\AndroidTool\sdcard.img 在程序中訪問SDCard,你需要申請訪問SDCard的許可權。
在AndroidManifest.xml中加入訪問SDCard的許可權如下:
<!-- 在SDCard中創建與刪除文件許可權 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 往SDCard寫入數據許可權 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
要往SDCard存放文件,程序必須先判斷手機是否裝有SDCard,並且可以進行讀寫。
注意:訪問SDCard必須在AndroidManifest.xml中加入訪問SDCard的許可權。
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
File sdCardDir = Environment.getExternalStorageDirectory();//獲取SDCard目錄
File saveFile = new File(sdCardDir, 「a.txt」);
FileOutputStream outStream = new FileOutputStream(saveFile);
outStream.write("test".getBytes());
outStream.close();
}
Environment.getExternalStorageState()方法用於獲取SDCard的狀態,如果手機裝有SDCard,並且可以進行讀寫,那麼方法返回的狀態等於Environment.MEDIA_MOUNTED。
Environment.getExternalStorageDirectory()方法用於獲取SDCard的目錄,當然要獲取SDCard的目錄,你也可以這樣寫:
File sdCardDir = new File("/sdcard"); //獲取SDCard目錄
File saveFile = new File(sdCardDir, "itcast.txt");
//上面兩句代碼可以合成一句:
File saveFile = new File("/sdcard/a.txt");
FileOutputStream outStream = new FileOutputStream(saveFile);
outStream.write("test".getBytes());
outStream.close();
第三種: SQLite資料庫存儲數據
SQLite是輕量級嵌入式資料庫引擎,它支持 SQL 語言,
並且只利用很少的內存就有很好的性能。
此外它還是開源的,任何人都可以使用它。
許多開源項目((Mozilla, PHP, Python)都使用了 SQLite
SQLite 由以下幾個組件組成:SQL 編譯器、內核、後端以及附件。
SQLite 通過利用虛擬機和虛擬資料庫引擎(VDBE),使調試、修改和擴展 SQLite 的內核變得更加方便。
特點:
面向資源有限的設備,
沒有伺服器進程,
所有數據存放在同一文件中跨平台,
可自由復制。
SQLite 基本上符合 SQL-92 標准,和其他的主要 SQL 資料庫沒什麼區別。它的優點就是高效,Android 運行時環境包含了完整的 SQLite。
SQLite 和其他資料庫最大的不同就是對數據類型的支持,創建一個表時,可以在 CREATE TABLE 語句中指定某列的數據類型,但是你可以把任何數據類型放入任何列中。當某個值插入資料庫時,SQLite 將檢查它的類型。如果該類型與關聯的列不匹配,則 SQLite 會嘗試將該值轉換成該列的類型。如果不能轉換,則該值將作為其本身具有的類型存儲。比如可以把一個字元串(String)放入 INTEGER 列。SQLite 稱這為「弱類型」(manifest typing.)。 此外,SQLite 不支持一些標準的 SQL 功能,特別是外鍵約束(FOREIGN KEY constrains),嵌套 transcaction 和 RIGHT OUTER JOIN 和 FULL OUTER JOIN, 還有一些 ALTER TABLE 功能。 除了上述功能外,SQLite 是一個完整的 SQL 系統,擁有完整的觸發器,交易等等。
Android 集成了 SQLite 資料庫 Android 在運行時(run-time)集成了 SQLite,所以每個 Android 應用程序都可以使用 SQLite 資料庫。
對於熟悉 SQL 的開發人員來時,在 Android 開發中使用 SQLite 相當簡單。但是,由於 JDBC 會消耗太多的系統資源,所以 JDBC 對於手機這種內存受限設備來說並不合適。因此,Android 提供了一些新的 API 來使用 SQLite 資料庫,Android 開發中,程序員需要學使用這些 API。
資料庫存儲在 data/< 項目文件夾 >/databases/ 下。 Android 開發中使用 SQLite 資料庫 Activites 可以通過 Content Provider 或者 Service 訪問一個資料庫。
下面會詳細講解如果創建資料庫,添加數據和查詢資料庫。 創建資料庫 Android 不自動提供資料庫。在 Android 應用程序中使用 SQLite,必須自己創建資料庫,然後創建表、索引,填充數據。
Android 提供了 SQLiteOpenHelper 幫助你創建一個資料庫,你只要繼承 SQLiteOpenHelper 類,就可以輕松的創建資料庫。SQLiteOpenHelper 類根據開發應用程序的需要,封裝了創建和更新資料庫使用的邏輯。
SQLiteOpenHelper 的子類,至少需要實現三個方法:
1 構造函數,調用父類 SQLiteOpenHelper 的構造函數。這個方法需要四個參數:上下文環境(例如,一個 Activity),資料庫名字,一個可選的游標工廠(通常是 Null),一個代表你正在使用的資料庫模型版本的整數。
2 onCreate()方法,它需要一個 SQLiteDatabase 對象作為參數,根據需要對這個對象填充表和初始化數據。
3 onUpgrage() 方法,它需要三個參數,一個 SQLiteDatabase 對象,一個舊的版本號和一個新的版本號,這樣你就可以清楚如何把一個資料庫從舊的模型轉變到新的模型。
第四種 使用ContentProvider存儲數據 ContentProvider其實也是通過資料庫的方式來存儲數據的,因此這里不再做詳細介紹
第五種 網路存儲數據 也就是說將數據保存在伺服器,android上只需要通過httpclient發起一個請求,向伺服器獲取數據即可
5. android面試題會出現什麼內容
這是一篇介紹android面試題的文章,下面就讓我們一起來了解一下吧!
1.android dvm 的進程和linux的進程,應用程序的進程是否為同一個概念:
答:dvm是dalivk虛擬機。每一個android應用程序都在自己的進程中運行,都擁有一個dalivk虛擬機實例。而每一個dvm都是在linux的一個進程。所以說可以認為是同一個概念。
2.android的動畫有哪幾種?他們的特點和區別是什麼?
答:兩種,一種是tween動畫,一種是frame動畫。tween動畫,這種實現方式可以使視圖組件移動,放大或縮小以及產生透明度的變化。frame動畫,傳統的動畫方法,通過順序的播放排列好的圖片來實現,類似電影。
3.handler進制的原理:
答:android提供了handler和looper來滿足線程間的通信。Handler先進先出原則。looper用來管理特定線程內對象之間的消息交換(message Exchange).
1)looper:一個線程可以產生一個looper對象,由它來管理此線程里的message queue(消息隊列)
2)handler:你可以構造一個handler對象來與looper溝通,以便push新消息到messagequeue里;或者接收looper(從messagequeue里取出)所送來的消息。
3)messagequeue:用來存放線程放入的消息。
4)線程:UI thread 通常就是main thread,而android啟動程序時會為它建立一個message queue.
4.android view的刷新:
答:Android中對View的更新有很多種方式,使用時要區分不同的應用場合。我感覺最要緊的是分清:多線程和雙緩沖的使用情況。
1).不使用多線程和雙緩沖
這種情況最簡單了,一般只是希望在View發生改變時對UI進行重繪。你只需在Activity中顯式地調用View對象中的invalidate()方法即可。系統會自動調用 View的onDraw()方法。
2).使用多線程和不使用雙緩沖
這種情況需要開啟新的線程,新開的線程就不好訪問View對象了。強行訪問的話會報:android.view.ViewRoot$:Only the originalthread that created a view hierarchy can touch its views.
這時候你需要創建一個繼承了android.os.Handler的子類,並重寫handleMessage(Messagemsg)方法。android.os.Handler是能發送和處理消息的,你需要在Activity中發出更新UI的消息,然後再你的Handler(可以使用匿名內部類)中處理消息(因為匿名內部類可以訪問父類變數,你可以直接調用View對象中的invalidate()方法 )。也就是說:在新線程創建並發送一個Message,然後再主線程中捕獲、處理該消息。
3).使用多線程和雙緩沖
Android中SurfaceView是View的子類,她同時也實現了雙緩沖。你可以定義一個她的子類並實現SurfaceHolder.Callback介面。由於實現SurfaceHolder.Callback介面,新線程就不需要android.os.Handler幫忙了。SurfaceHolder中lockCanvas()方法可以鎖定畫布,繪制玩新的圖像後調用unlockCanvasAndPost(canvas)解鎖(顯示),還是比較方便得。
5.說說mvc模式的原理,它在android中的運用:
答:android的官方建議應用程序的開發採用mvc模式。何謂mvc?
mvc是model,view,controller的縮寫,mvc包含三個部分:
l模型(model)對象:是應用程序的主體部分,所有的業務邏輯都應該寫在該層。
2視圖(view)對象:是應用程序中負責生成用戶界面的部分。也是在整個mvc架構中用戶唯一可以看到的一層,接收用戶的輸入,顯示處理結果。
3控制器(control)對象:是根據用戶的輸入,控制用戶界面數據顯示及更新model對象狀態的部分,控制器更重要的一種導航功能,想用用戶出發的相關事件,交給m哦得了處理。
android鼓勵弱耦合和組件的重用,在android中mvc的具體體現如下:
1)視圖層(view):一般採用xml文件進行界面的描述,使用的時候可以非常方便的引入,當然,如何你對android了解的比較的多了話,就一定 可以想到在android中也可以使用javascript+html等的方式作為view層,當然這里需要進行java和javascript之間的通 信,幸運的是,android提供了它們之間非常方便的通信實現。
2)控制層(controller):android的控制層的重 任通常落在了眾多的acitvity的肩上,這句話也就暗含了不要在acitivity中寫代碼,要通過activity交割model業務邏輯層處理, 這樣做的另外一個原因是android中的acitivity的響應時間是5s,如果耗時的操作放在這里,程序就很容易被回收掉。
3)模型層(model):對資料庫的操作、對網路等的操作都應該在model裡面處理,當然對業務計算等操作也是必須放在的該層的。
6.Activity的生命周期:
答:onCreate: 在這里創建界面,做一些數據 的初始化工作
onStart: 到這一步變成用戶可見不可交互的
onResume:變成和用戶可交互 的,(在activity 棧系統通過棧的方式管理這些個Activity的最上面,運行完彈出棧,則回到上一個Activity)
onPause: 到這一步是可見但不可交互的,系統會停止動畫 等消耗CPU 的事情從上文的描述已經知道,應該在這里保存你的一些數據,因為這個時候你的程序的優先順序降低,有可能被系統收回。在這里保存的數據,應該在
onstop: 變得不可見,被下一個activity覆蓋了
onDestroy: 這是activity被幹掉前最後一個被調用方法了,可能是外面類調用finish方法或者是系統為了節省空間將它暫時性的幹掉
7.讓Activity變成一個窗口:
答:Activity屬性設定:有時候會做個應用程序是漂浮在手機主界面的。這個只需要在設置下Activity的主題theme,即在Manifest.xml定義Activity的地方加一句:
android :theme="@android:style/Theme.Dialog"
如果是作半透明的效果:
android:theme="@android:style/Theme.Translucent"
8.Android中常用的五種布局:
答:LinearLayout線性布局;AbsoluteLayout絕對布局;TableLayout表格布局;RelativeLayout相對布局;FrameLayout幀布局;
9.Android的五種數據存儲方式:
答:sharedPreferences;文件;SQLite;contentProvider;網路
10.請解釋下在單線程模型中Message、Handler、Message Queue、Looper之間的關系:
答:Handler獲取當前線程中的looper對象,looper用來從存有Message的Message Queue里取出message,再由Handler進行message的分發和處理。
11.AIDL的全稱是什麼?如何工作?能處理哪些類型的數據?
答:AIDL(AndroidInterface Definition Language)android介面描述語言
12.系統上安裝了多種瀏覽器,能否指定某瀏覽器訪問指定頁面?請說明原由:
答:通過直接發送Uri把參數帶過去,或者通過manifest里的intentfilter里的data屬性。代碼如下:
Intent intent = new Intent();
Intent.setAction(「android.intent.action.View」);
Uri uriBrowsers = Uri.parse(「http://www.sina.com.cn」);
Intent.setData(uriBrowsers);
//包名、要打開的activity
intent.setClassName(「com.android.browser」,」com.android.browser.BrowserActivity」);
startActivity(intent);
13.什麼是ANR,如何避免?
答:ANR的定義:
在android上,如果你的應用程序有一段時間響應不移靈敏,系統會向用戶提示「應用程序無響應」(ANR:application Not Responding)對話框。因此,在程序里對響應性能的設計很重要,這樣,系統不會顯示ANR給用戶。
如何避免:
首先來研究下為什麼它會在android的應用程序里發生和如何最佳構建應用程序來避免ANR.
android應用程序通常是運行在一個單獨的線程(例如:main)里,這就意味你的應用程序所做的事情如果在主線程里佔用了大長時間的話,就會引發ANR對話框,因為你的應用程序並沒有給自己機會來處理輸入事件或者Intent廣播。
因此,運行在主線程里的任何訪求都盡可能少做事情。特別是,activity應該在它的關鍵生命周期方法(onCreate()和onResume())里盡可能少的去作創建操作。潛在的耗時操作,例如網路或資料庫操作,或者高耗時的計算如改變點陣圖尺寸,應該在子線程里(或者以資料庫操作為例,通過非同步請求的方式)來完成。然而,不是說你的主線程阻塞在那裡等待子線程的完成---也不是調用Thread.wait()或者Thread.sleep()。替代的方法是:主線程應該為子線程提供一個Handler,以便完成時能夠提交給主線程。以這種方式設計你的應用程序,將能保證你的主線程保持對輸入的響應性並能避免由5秒輸入事件的超時引發的ANR對話框。這種做法應該在其它顯示UI的線程里效仿,因為它們都受相同的超時影響。
IntentReceiver執行時間的特殊限制意味著它應該做:在後台里做小的、瑣碎的工作,如保存設定或注冊一個Notification。和在主線程里調用的其它方法一樣,應用程序應該避免在BroadcastReceiver里做耗時的操作或計算,但也不是在子線程里做這些任務(因為BroadcastReceiver的生命周期短),替代的是,如果響應Intent廣播需要執行一個耗時的動作的話,應用程序應該啟動一個Service。順便提及一句,你也應該避免在Intent Receiver里啟動一個Activity,因為它會創建一個新的畫面,並從當前用戶正在運行的程序上搶奪焦點。如果你的應用程序在響應Intent廣播時需要向用戶展示什麼,你應該使用Notification Manager來實現。
一般來說,在應用程序里,100到200ms是用戶能感知阻滯的時間閾值,下面總結了一些技巧來避免ANR,並有助於讓你的應用程序看起來有響應性。
如果你的應用程序為響應用戶輸入正在後台工作的話,可以顯示工作的進度(ProgressBar和ProgressDialog對這種情況來說很有用)。特別是游戲,在子線程里做移動的計算。如果你的程序有一個耗時的初始化過程的話,考慮可以顯示一個Splash Screen或者快速顯示主畫面並非同步來填充這些信息。在這兩種情況下,你都應該顯示正在進行的進度,以免用戶認為程序被凍結了。
14.什麼情況會導致Force Close?如何避免?能否捕獲導致其的異常?
答:如空指針等可以導致ForceClose;可以看Logcat,然後找到對應的程序代碼來解決錯誤。
15.橫豎屏切換時候的activity的生命周期:
答:
1) 新建一個activity,並把各個生命周期列印出來
2) 運行activity,得到如下信息:
onCreate()à
onStart()à
onResume()à
3) 按ctrl+F12切換成橫屏時
onSaveInstanceState()à
onPause()à
onStop()à
onDestroy()à
onCreate()à
onStart()à
onRestoreInstanceState()à
onResume()à
4) 再按ctrl+f12切換成豎屏時,發現列印了兩次相同的Log
onSaveInstanceState()à
onPause()à
onStop()à
onDestroyà
onCreate()à
onStart()à
onRestoreInstanceState()à
onResume()à
onSaveInstanceState()à
onPause()à
onStop()à
onDestroyà
onCreate()à
onStart()à
onRestoreInstanceState()à
onResume()à
5) 修改AndroidManifest.xml,把該Activity添加android:configChanges=「orientation」,執行步驟3
onSaveInstanceState()à
onPause()à
onStop()à
onDestroy()à
onCreate()à
onStart()à
onRestoreInstanceState()à
onResume()à
6) 修改AndroidManifest.xml,把該Activity添加android:configChanges=「orientation」,執行步驟4,發現不會再列印相同信息,但多列印了一行onConfigChanged
onSaveInstanceState()à
onPause()à
onStop()à
onDestroy()à
onCreate()à
onStart()à
onRestoreInstanceState()à
onResume()à
onConfigurationChanged()à
7) 把步驟5的android:configChanges=「orientation」改成
android:configChanges=「orientation|keyboradHidden」,執行步驟3,就只列印onConfigChanged
onConfigurationChanged()à
8) 把步驟5的android:configChanges=「orientation」改成
android:configChanges=「orientation|keyboradHidden」,執行步驟4
onConfigurationChanged()à
onConfigurationChanged()à
總結:
1) 不設置activity的android:configChanges時,切屏會重新調用各個生命周期,切橫屏時會執行一次,切豎屏時會執行兩次。
2) 設置activity的android:configChanges=「orientation」時, 切屏會重新調用各個生命周期,切橫屏、豎屏時都只會執行一次,但是豎屏最後多列印一條onConfigurationChanged()
3) 設置activity的android:configChanges=「orientation|keyboardHidden」時,切屏不會重新調用各個生命周期,只會執行onConfigurationChanged(),橫屏一次,豎屏兩次
再總結下整個activity的生命周期:
1) 當前activity產生事件彈出Toast和AlertDialog的時候Activity的生命周期不會有改變
2) Activity運行時按下HOME鍵(跟被完全覆蓋一樣的)
onSavaInstanceStateà
onPauseà
onStopà
onRestartà
onStartà
onResumeà
3) 未被完全覆蓋,只是失去焦點:
onPauseà
onResumeà
16.如何將SQLite資料庫(.db文件)與apk文件一起發布?
答:可以將.db文件復制到Eclipse Android工程中的res aw目錄中。所有在res aw目錄中的文件不會被壓縮,這樣可以直接提取該目錄中的文件。可以將.db文件復制到res aw目錄中
17.如何將打開res aw目錄中的資料庫文件?
答:在Android中不能直接打開res aw目錄中的資料庫文件,而需要在程序第一次啟動時將該文件復制到手機內存或SD卡的某個目錄中,然後再打開該資料庫文件。復制的基本方法是使用getResources().openRawResource方法獲得res aw目錄中資源的 InputStream對象,然後將該InputStream對象中的數據寫入其他的目錄中相應文件中。在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法來打開任意目錄中的SQLite資料庫文件。
18.android 中有哪幾種解析xml的類?官方推薦哪種?以及它們的原理和區別:
答:XML解析主要有三種方式,SAX、DOM、PULL。常規在PC上開發我們使用Dom相對輕鬆些,但一些性能敏感的資料庫或手機上還是主要採用SAX方 式,SAX讀取是單向的,優點:不佔內存空間、解析屬性方便,但缺點就是對於套嵌多個分支來說處理不是很方便。而DOM方式會把整個XML文件載入到內存 中去,這里Android開發網提醒大家該方法在查找方面可以和XPath很好的結合如果數據量不是很大推薦使用,而PULL常常用在J2ME對於節點處 理比較好,類似SAX方式,同樣很節省內存,在J2ME中我們經常使用的KXML庫來解析。
19.DDMS和TraceView的區別?
答:DDMS是一個程序執行查看器,在裡面可以看見線程和堆棧等信息,TraceView是程序性能分析器
20.談談Android的IPC機制:
答:IPC是內部進程通信的簡稱,是共享"命名管道"的資源。Android中的IPC機制是為了讓Activity和Service之間可以隨時的進行交互,故在Android中該機制,只適用於Activity和Service之間的通信,類似於遠程方法調用,類似於C/S模式的訪問。通過定義AIDL介面文件來定義IPC介面。Servier端實現IPC介面,Client端調用IPC介面本地代理。
21.NDK是什麼:
答:NDK是一系列工具的集合
NDK提供了一系列的工具,幫助開發者迅速的開發C/C++的動態庫,並能自動將so和java應用打成apk包
NDK集成了交叉編譯器,並提供了相應的mk文件和隔離cpu,平台等的差異,開發人員只需簡單的修改mk文件就可以創建出so
22.描述一下android的系統架構:
答:android系統架構分從下往上為Linux內核層、運行庫、應用程序框架層和應用程序層。
Linux內核層:負責硬體的驅動程序、網路、電源、系統安全以及內存管理等功能。
運行庫和androidruntion:運行庫:即c/c++函數庫部分,大多數都是開放源代碼的函數庫,例如webkit,該函數庫負責android網頁瀏覽器的運行;例如標準的c函數庫libc、openssl、sqlite等,當然也包括支持游戲開發的2dsgl和3dopengles,在多媒體方面有mediaframework框架來支持各種影音和圖形文件的播放與顯示,如mpeg4、h.264、mp3、aac、amr、jpg和png等眾多的多媒體文件格式。Androidruntion負責解釋和執行生成的dalvik格式的位元組碼
應用軟體架構:java應用程序開發人員主要是使用該層封裝好的api進行快速開發的。
應用程序層:該層是java的應用程序層,android內置的googlemaps、email、IM、瀏覽器等,都處於該層,java開發人員工發的程序也處於該層,而且和內置的應用程序具有平等的地位,可以調用內置的應用程序,也可以替換內置的應用程序
6. android中五大數據存儲有哪些
第一種: 使用SharedPreferences存儲數據
SharedPreferences是Android平台上一個輕量級的存儲類,主要是保存一些常用的配置比如窗口狀態,一般在Activity中 重載窗口狀態onSaveInstanceState保存一般使用SharedPreferences完成,它提供了Android平台常規的Long長 整形、Int整形、String字元串型的保存。
實現SharedPreferences存儲的步驟如下:
一、根據Context獲取SharedPreferences對象
二、利用edit()方法獲取Editor對象。
三、通過Editor對象存儲key-value鍵值對數據。
四、通過commit()方法提交數據。
openFileOutput()方法的第一參數用於指定文件名稱,不能包含路徑分隔符「/」 ,如果文件不存在,Android 會自動創建它。
創建的文件保存在/data/data/<package name>/files目錄,如: /data/data/cn.itcast.action/files/itcast.txt ,通過點擊Eclipse菜單「Window」-「Show View」-「Other」,在對話窗口中展開android文件夾,選擇下面的File Explorer視圖,然後在File Explorer視圖中展開/data/data/<package name>/files目錄就可以看到該文件。
openFileOutput()方法的第二參數用於指定操作模式,有四種模式,分別為:
Context.MODE_PRIVATE = 0
Context.MODE_APPEND = 32768
Context.MODE_WORLD_READABLE = 1
Context.MODE_WORLD_WRITEABLE = 2
Context.MODE_PRIVATE:為默認操作模式,代表該文件是私有數據,只能被應用本身訪問,在該模式下,寫入的內容會覆蓋原文件的內容,如果想把新寫入的內容追加到原文件中。可以使用Context.MODE_APPEND
Context.MODE_APPEND:模式會檢查文件是否存在,存在就往文件追加內容,否則就創建新文件。
Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用來控制其他應用是否有許可權讀寫該文件。
MODE_WORLD_READABLE:表示當前文件可以被其他應用讀取;
MODE_WORLD_WRITEABLE:表示當前文件可以被其他應用寫入。
如果希望文件被其他應用讀和寫,可以傳入: openFileOutput(「itcast.txt」, Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE); android有一套自己的安全模型,當應用程序(.apk)在安裝時系統就會分配給他一個userid,當該應用要去訪問其他資源比如文件的時候,就需要userid匹配。默認情況下,任何應用創建的文件,sharedpreferences,資料庫都應該是私有的(位於/data/data/<package name>/files),其他程序無法訪問。
除非在創建時指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE ,只有這樣其他程序才能正確訪問。
對於私有文件只能被創建該文件的應用訪問,如果希望文件能被其他應用讀和寫,可以在創建文件時,指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE許可權。
Activity還提供了getCacheDir()和getFilesDir()方法: getCacheDir()方法用於獲取/data/data/<package name>/cache目錄 getFilesDir()方法用於獲取/data/data/<package name>/files目錄。
把文件存入SDCard:
使用Activity的openFileOutput()方法保存文件,文件是存放在手機空間上,一般手機的存儲空間不是很大,存放些小文件還行,如果要存放像視頻這樣的大文件,是不可行的。對於像視頻這樣的大文件,我們可以把它存放在SDCard。
SDCard是干什麼的?你可以把它看作是移動硬碟或U盤。 在模擬器中使用SDCard,你需要先創建一張SDCard卡(當然不是真的SDCard,只是鏡像文件)。
創建SDCard可以在Eclipse創建模擬器時隨同創建,也可以使用DOS命令進行創建,如下: 在Dos窗口中進入android SDK安裝路徑的tools目錄,輸入以下命令創建一張容量為2G的SDCard,文件後綴可以隨便取,建議使用.img: mksdcard 2048M D:\AndroidTool\sdcard.img 在程序中訪問SDCard,你需要申請訪問SDCard的許可權。
第三種: SQLite資料庫存儲數據
SQLite是輕量級嵌入式資料庫引擎,它支持 SQL 語言,並且只利用很少的內存就有很好的性能。此外它還是開源的,任何人都可以使用它。許多開源項目((Mozilla, PHP, Python)都使用了 SQLite.SQLite 由以下幾個組件組成:SQL 編譯器、內核、後端以及附件。SQLite 通過利用虛擬機和虛擬資料庫引擎(VDBE),使調試、修改和擴展 SQLite 的內核變得更加方便。
特點:
面向資源有限的設備,
沒有伺服器進程,
所有數據存放在同一文件中跨平台,
可自由復制。
SQLite 內部結構:
SQLite 基本上符合 SQL-92 標准,和其他的主要 SQL 資料庫沒什麼區別。它的優點就是高效,Android 運行時環境包含了完整的 SQLite。
SQLite 和其他資料庫最大的不同就是對數據類型的支持,創建一個表時,可以在 CREATE TABLE 語句中指定某列的數據類型,但是你可以把任何數據類型放入任何列中。當某個值插入資料庫時,SQLite 將檢查它的類型。如果該類型與關聯的列不匹配,則 SQLite 會嘗試將該值轉換成該列的類型。如果不能轉換,則該值將作為其本身具有的類型存儲。比如可以把一個字元串(String)放入 INTEGER 列。SQLite 稱這為「弱類型」(manifest typing.)。 此外,SQLite 不支持一些標準的 SQL 功能,特別是外鍵約束(FOREIGN KEY constrains),嵌套 transcaction 和 RIGHT OUTER JOIN 和 FULL OUTER JOIN, 還有一些 ALTER TABLE 功能。 除了上述功能外,SQLite 是一個完整的 SQL 系統,擁有完整的觸發器,交易等等。
Android 集成了 SQLite 資料庫 Android 在運行時(run-time)集成了 SQLite,所以每個 Android 應用程序都可以使用 SQLite 資料庫。
對於熟悉 SQL 的開發人員來時,在 Android 開發中使用 SQLite 相當簡單。但是,由於 JDBC 會消耗太多的系統資源,所以 JDBC 對於手機這種內存受限設備來說並不合適。因此,Android 提供了一些新的 API 來使用 SQLite 資料庫,Android 開發中,程序員需要學使用這些 API。
資料庫存儲在 data/< 項目文件夾 >/databases/ 下。 Android 開發中使用 SQLite 資料庫 Activites 可以通過 Content Provider 或者 Service 訪問一個資料庫。
下面會詳細講解如果創建資料庫,添加數據和查詢資料庫。 創建資料庫 Android 不自動提供資料庫。在 Android 應用程序中使用 SQLite,必須自己創建資料庫,然後創建表、索引,填充數據。
Android 提供了 SQLiteOpenHelper 幫助你創建一個資料庫,你只要繼承 SQLiteOpenHelper 類,就可以輕松的創建資料庫。SQLiteOpenHelper 類根據開發應用程序的需要,封裝了創建和更新資料庫使用的邏輯。
SQLiteOpenHelper 的子類,至少需要實現三個方法:
1 構造函數,調用父類 SQLiteOpenHelper 的構造函數。這個方法需要四個參數:上下文環境(例如,一個 Activity),資料庫名字,一個可選的游標工廠(通常是 Null),一個代表你正在使用的資料庫模型版本的整數。
2 onCreate()方法,它需要一個 SQLiteDatabase 對象作為參數,根據需要對這個對象填充表和初始化數據。
3 onUpgrage() 方法,它需要三個參數,一個 SQLiteDatabase 對象,一個舊的版本號和一個新的版本號,這樣你就可以清楚如何把一個資料庫從舊的模型轉變到新的模型。
第四種: 使用ContentProvider存儲數據
Android這個系統和其他的操作系統還不太一樣,我們需要記住的是,數據在Android當中是私有的,當然這些數據包括文件數據和資料庫數據以及一些其他類型的數據。那這個時候有讀者就會提出問題,難道兩個程序之間就沒有辦法對於數據進行交換?Android這么優秀的系統不會讓這種情況發生的。解決這個問題主要靠ContentProvider。一個Content Provider類實現了一組標準的方法介面,從而能夠讓其他的應用保存或讀取此Content Provider的各種數據類型。也就是說,一個程序可以通過實現一個Content Provider的抽象介面將自己的數據暴露出去。外界根本看不到,也不用看到這個應用暴露的數據在應用當中是如何存儲的,或者是用資料庫存儲還是用文件存儲,還是通過網上獲得,這些一切都不重要,重要的是外界可以通過這一套標准及統一的介面和程序里的數據打交道,可以讀取程序的數據,也可以刪除程序的數據,當然,中間也會涉及一些許可權的問題。
一個程序可以通過實現一個ContentProvider的抽象介面將自己的數據完全暴露出去,而且ContentProviders是以類似資料庫中表的方式將數據暴露,也就是說ContentProvider就像一個「資料庫」。那麼外界獲取其提供的數據,也就應該與從資料庫中獲取數據的操作基本一樣,只不過是採用URI來表示外界需要訪問的「資料庫」。
Content Provider提供了一種多應用間數據共享的方式,比如:聯系人信息可以被多個應用程序訪問。
Content Provider是個實現了一組用於提供其他應用程序存取數據的標准方法的類。 應用程序可以在Content Provider中執行如下操作: 查詢數據 修改數據 添加數據 刪除數據
標準的Content Provider: Android提供了一些已經在系統中實現的標准Content Provider,比如聯系人信息,圖片庫等等,你可以用這些Content Provider來訪問設備上存儲的聯系人信息,圖片等等。
這樣我們就可以調用insertRecords(name, phoneNo)的方式來向聯系人信息簿中添加聯系人姓名和電話號碼。
刪除記錄:
Content Provider中的getContextResolver.delete()方法可以用來刪除記錄。
下面的記錄用來刪除設備上所有的聯系人信息:
private void deleteRecords() {
Uri uri = People.CONTENT_URI;
getContentResolver().delete(uri, null, null);
}
別忘記了在配置文件中設置訪問網路許可權:
<uses-permission android:name="android.permission.INTERNET" />
7. android中的存儲方式有哪些
Android提供以下四種存儲方式:
1.SharePreference
2.SQLite
3.File
4.ContentProvider
SharedPreference:
SharedPreference是一種輕型的數據存儲方式,實際上是基於XML文件存儲的「key-value」鍵值對數據。通常用來存儲程序的一些配置信息。其存儲在「data/data/程序包名/shared_prefs目錄下。
SharedPreference本身只能獲取數據,不支持存儲和修改。存儲和修改要通過Editor對象來實現。
SQLite:
SQLite是一個輕量級關系型資料庫,既然是關系型資料庫,那操作起來其實跟mysql、sql
server差不多的。
需要注意的一點是,SQLite只有NULL、INTEGER、REAL(浮點數)、TEXT(字元串)和BLOB(大數據)五種類型,不存在BOOLEAN和DATE類型。
File:
常說的文件(I/O)存儲方法,常用語存儲大數量的數據,但是缺點是更新數據將是一件困難的事情。
ContentProvider:
ContentProvider相對於其它的方式比較復雜,當然其功能相對於其它的方式也是革命性的改變。它能夠實現跨應用之間的數據操作。利用ContentResolver對象的delete、update、insert、query等方法去操ContentProvider的對象,讓ContentProvider對象的方法去對數據操作。
8. android提供的數據存儲方式有幾種
對於Android平台來講,它的存儲方式也不外乎這幾種,按方式總體來分,也是文件,資料庫和網路。但從開發者的角度來講它可以分為以下五種方式:
1.SharedPreferences共享偏好
2.Internal Storage內部存儲空間
3.External Storage外部存儲空間
4.SQLite Database資料庫
5.Internet網路
這幾種方式各自有各自的優點和缺點,要根據不同的實際情況來選擇,而無法給出統一的標准。
如果想要了解可以繼續追問,滿意請採納。