1.SharePreference
android.content.SharePreferences接口提供了用於排序和讀取應用程序設置的方法。
SharedPreferences保存數據,其背後是用xml文件存放數據
一個簡單的存儲代碼以下:java
SharedPreferences sharedPreferences = getSharedPreferences("wujay", Context.MODE_PRIVATE); //私有數據 Editor editor = sharedPreferences.edit();//獲取編輯器 editor.putString("name", "wujaycode"); editor.putInt("age", 4); editor.commit();//提交修改
生成的wujay.xml文件內容以下:android
<?xml version='1.0' encoding='utf-8' standalone='yes' ?> <map> <string name="name">wujaycode</string> <int name="age" value="4" /> </map>
2.Preference API
使用Android Preference API來建立一個用戶界面
主要類android.preference.Preference子類包括:git
3.使用Prefence
Android.Manifest.xml文件
AndroidManifest.xml 是每一個android程序中必須的文件。它位於整個項目的根目錄,描述了package中暴露的組件(activities, services, 等等),他們各自的實現類,各類能被處理的數據和啓動位置。 除了能聲明程序中的Activities, ContentProviders, Services, 和Intent Receivers,還能指定permissions和instrumentation(安全控制和測試)數據庫
元素:在全部的元素中只有
和 編程是必需的,且只能出現一次。若是一個元素包含有其餘子元素,必須經過子元素的屬性來設置其值。處於同一層次的元素,這些元素的說明是沒有順序的。
屬性:按照常理,全部的屬性都是可選的,可是有些屬性是必須設置的。那些真正可選的屬性,即便不存在,其也有默認的數值項說明。除了根元素的屬性,全部其餘元素屬性的名字都是以android:前綴的;
定義類名:全部的元素名都對應其在SDK中的類名,若是你本身定義類名,必須包含類的數據包名,若是類與application處於同一數據包中,能夠直接簡寫爲「.」;
多數值項:若是某個元素有超過一個數值,這個元素必須經過重複的方式來講明其某個屬性具備多個數值項,且不能將多個數值項一次性說明在一個屬性中;
資源項說明:當須要引用某個資源時,其採用以下格式:@[package :]type :name 。 例如 <activity android:icon=」@drawable/icon 」 . . . >
字符串值:相似於其餘語言,若是字符中包含有字符「」,則必須使用轉義字符「\」;
第一層():(屬性)
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.woody.test" android:sharedUserId="string" android:sharedUserLabel="string resource" android:versionCode="integer" android:versionName="string" android:installLocation=["auto" | "internalOnly" | "preferExternal"] > </manifest>
一個AndroidManifest.xml中必須含有一個Application標籤,這個標籤聲明瞭每個應用程序的組件及其屬性(如icon,label,permission等)api
<application android:allowClearUserData=["true" | "false"] android:allowTaskReparenting=["true" | "false"] android:backupAgent="string" android:debuggable=["true" | "false"] android:description="string resource" android:enabled=["true" | "false"] android:hasCode=["true" | "false"] android:icon="drawable resource" android:killAfterRestore=["true" | "false"] android:label="string resource" android:manageSpaceActivity="string" android:name="string" android:permission="string" android:persistent=["true" | "false"] android:process="string" android:restoreAnyVersion=["true" | "false"] android:taskAffinity="string" android:theme="resource or theme" > </application>
A、android:allowClearUserData('true' or 'false')
用戶是否能選擇自行清除數據,默認爲true,程序管理器包含一個選擇容許用戶清除數據。當爲true時,用戶可本身清理用戶數據,反之亦然
B、android:allowTaskReparenting('true' or 'false')
是否容許activity更換從屬的任務,好比從短信息任務切換到瀏覽器任務
C、android:backupAgent
這也是Android2.2中的一個新特性,設置該APP的備份,屬性值應該是一個完整的類名,如com.project.TestCase,此屬性並無默認值,而且類名必須得指定(就是個備份工具,將數據備份到雲端的操做)
D、android:debuggable
這個從字面上就能夠看出是什麼做用的,當設置爲true時,代表該APP在手機上能夠被調試。默認爲false,在false的狀況下調試該APP,就會報如下錯誤:
Device XXX requires that applications explicitely declare themselves as debuggable in their manifest.
Application XXX does not have the attribute 'debuggable' set to TRUE in its manifest and cannot be debugged.
E、android:description/android:label
此兩個屬性都是爲許可提供的,均爲字符串資源,當用戶去看許可列表(android:label)或者某個許可的詳細信息(android:description)時,這些字符串資源就能夠顯示給用戶。label應當儘可能簡短,之須要告知用戶該許但是在保護什麼功能就行。而description能夠用於具體描述獲取該許可的程序能夠作哪些事情,實際上讓用戶能夠知道若是他們贊成程序獲取該權限的話,該程序能夠作什麼。咱們一般用兩句話來描述許可,第一句描述該許可,第二句警告用戶若是批准該權限會可能有什麼很差的事情發生
F、android:enabled
Android系統是否可以實例化該應用程序的組件,若是爲true,每一個組件的enabled屬性決定那個組件是否能夠被 enabled。若是爲false,它覆蓋組件指定的值;全部組件都是disabled。
G、android:hasCode('true' or 'false')
表示此APP是否包含任何的代碼,默認爲true,若爲false,則系統在運行組件時,不會去嘗試加載任何的APP代碼
一個應用程序自身不會含有任何的代碼,除非內置組件類,好比Activity類,此類使用了AliasActivity類,固然這是個罕見的現象
(在Android2.3能夠用標準C來開發應用程序,可在androidManifest.xml中將此屬性設置爲false,由於這個APP自己已經不含有任何的JAVA代碼了)
H、android:icon
這個很簡單,就是聲明整個APP的圖標,圖片通常都放在drawable文件夾下
I、android:killAfterRestore
J、android:manageSpaceActivity
K、android:name
爲應用程序所實現的Application子類的全名。當應用程序進程開始時,該類在全部應用程序組件以前被實例化。
若該類(比方androidMain類)是在聲明的package下,則能夠直接聲明android:name="androidMain",但此類是在package下面的子包的話,就必須聲明爲全路徑或android:name="package名稱.子包名成.androidMain"
L、android:permission
設置許可名,這個屬性若在
M、android:presistent
該應用程序是否應該在任什麼時候候都保持運行狀態,默認爲false。由於應用程序一般不該該設置本標識,持續模式僅僅應該設置給某些系統應用程序纔是有意義的。
N、android:process
應用程序運行的進程名,它的默認值爲
O、android:restoreAnyVersion
一樣也是android2.2的一個新特性,用來代表應用是否準備嘗試恢復全部的備份,甚至該備份是比當前設備上更要新的版本,默認是false
P、android:taskAffinity
擁有相同的affinity的Activity理論上屬於相同的Task,應用程序默認的affinity的名字是
Q、android:theme
是一個資源的風格,它定義了一個默認的主題風格給全部的activity,固然也能夠在本身的theme裏面去設置它,有點相似style。
1.概覽安全
最容易混淆的是外部存儲,若是說pc上也要區分出外部存儲和內部存儲的話,那麼自帶的硬盤算是內部存儲,U盤或者移動硬盤算是外部存儲,所以咱們很容易帶着這樣的理解去看待安卓手機,認爲機身固有存儲是內部存儲,而擴展的T卡是外部存儲。好比咱們任務16GB版本的Nexus 4有16G的內部存儲,普通消費者能夠這樣理解,可是安卓的編程中不能,這16GB仍然是外部存儲。全部的安卓設備都有外部存儲和內部存儲,這兩個名稱來源於安卓的早期設備,那個時候的設備內部存儲確實是固定的,而外部存儲確實是能夠像U盤同樣移動的。可是在後來的設備中,不少中高端機器都將本身的機身存儲擴展到了8G以上,他們將存儲在概念上分紅了"內部internal" 和"外部external" 兩部分,但其實都在手機內部。因此無論安卓手機是否有可移動的sdcard,他們老是有外部存儲和內部存儲。最關鍵的是,咱們都是經過相同的api來訪問可移動的sdcard或者手機自帶的存儲(外部存儲)。app
2.建立一個Notes應用程序
FileDemo1應用程序是一個簡單的應用,用於管理備忘。
有兩個活動MainActivity和AddNoteActivity
應用程序的AndroidManifest.xmldom
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.filedemo1" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="19" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.filedemo1.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <activity android:name="com.example.filedemo1.AddNoteActivity" android:label="@string/title_activity_add_note" > </activity> </application> </manifest>
主活動的活動類MainActvity
package com.example.filedemo1; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.TextView; public class MainActivity extends Activity { private String selectedItem; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView listView = (ListView) findViewById( R.id.listView1); listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); listView.setOnItemClickListener( new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { readNote(position); } }); } @Override public void onResume() { super.onResume(); refreshList(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle presses on the action bar items switch (item.getItemId()) { case R.id.action_add: startActivity(new Intent(this, AddNoteActivity.class)); return true; case R.id.action_delete: deleteNote(); return true; default: return super.onOptionsItemSelected(item); } } private void refreshList() { ListView listView = (ListView) findViewById( R.id.listView1); String[] titles = fileList(); ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>( this, android.R.layout.simple_list_item_activated_1, titles); listView.setAdapter(arrayAdapter); } private void readNote(int position) { String[] titles = fileList(); if (titles.length > position) { selectedItem = titles[position]; File dir = getFilesDir(); File file = new File(dir, selectedItem); FileReader fileReader = null; BufferedReader bufferedReader = null; try { fileReader = new FileReader(file); bufferedReader = new BufferedReader(fileReader); StringBuilder sb = new StringBuilder(); String line = bufferedReader.readLine(); while (line != null) { sb.append(line); line = bufferedReader.readLine(); } ((TextView) findViewById(R.id.textView1)). setText(sb.toString()); } catch (IOException e) { } finally { if (bufferedReader != null) { try { bufferedReader.close(); } catch (IOException e) { } } if (fileReader != null) { try { fileReader.close(); } catch (IOException e) { } } } } private void deleteNote() { if (selectedItem != null) { deleteFile(selectedItem); selectedItem = null; ((TextView) findViewById(R.id.textView1)).setText(""); refreshList(); } } }
可使用一個Cursor來實現ListView的自動刷新
3.訪問公共存儲
KeyValue類:保存了一對字符串,用來將選擇的鍵和Environment類中定義的目錄進行配對
ListView還有一個監聽器,用來監聽其OnltemClick事件,當其中目錄被選中時候調用ListDir方法。
1.Database API
1)SQLiteOpenHelper類:幫助建立數據庫和表
提供構造方法,調用本身的超類,傳入context和數據名稱。
覆蓋OnCreate方法和onUpgrade方法
public SubClassOfSQLiteOpenHelper(Context context) { super(context, "mydatabase", // database name null, 1 // db version ); }
初次訪問一個表必須調用onCreate方法,應該在SQLLiteDatebase上調用exeSQL方法,傳入SQL語句。
2)SQLiteDatabase類
Android提供了一個名爲 SQLiteDatabase的類(SQLiteOpenHelper 類中的 getWritableDatabase()和getReadableDatabase()方法返回這個類的對象)。SQLiteDatabase類封裝了一些操做數據庫的API,使用該類能夠完成對數據進行添加(Create)、查詢(Retrieve)、更新(Update)和刪除(Delete)操做(這些操做簡稱爲CRUD)。
execSQL()方法能夠執行insert、delete、update和CREATE TABLE之類有更改行爲的SQL語句;rawQuery()方法用於執行select語句。
3)Cursor接口
在SQLiteDatabase上調用qyery方法將返回一個Cuesor。提供了對數據庫查詢所返回結果的讀和寫訪問。
將Cursor移動到一個數據行,經過調用Cursor的getInt、getFloat、getLong、getString、getShort或getDouble方法傳入索引,,從一行中讀取列。
查詢Random的時候出現了這種狀況
菜單的使用:使用xml定義Menu
菜單資源文件必須放在res/menu目錄中。菜單資源文件必須使用