20169221 2016-2017-2 《移動平臺應用開發實踐》第十一週學習總結

課本學習

第三十九章 偏好

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

  • CheckBoxPreference
  • EditTextPreference
  • ListPreference
  • DialogPreference

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
應用程序運行的進程名,它的默認值爲 元素裏設置的包名,固然每一個組件均可以經過設置該屬性來覆蓋默認值。若是你想兩個應用程序共用一個進程的話,你能夠設置他們的android:process相同,但前提條件是他們共享一個用戶ID及被賦予了相同證書的時候
O、android:restoreAnyVersion
一樣也是android2.2的一個新特性,用來代表應用是否準備嘗試恢復全部的備份,甚至該備份是比當前設備上更要新的版本,默認是false
P、android:taskAffinity
擁有相同的affinity的Activity理論上屬於相同的Task,應用程序默認的affinity的名字是 元素中設定的package名
Q、android:theme
是一個資源的風格,它定義了一個默認的主題風格給全部的activity,固然也能夠在本身的theme裏面去設置它,有點相似style。
瀏覽器

第四十章 操做文件

1.概覽安全

  • 內部存儲:注意內部存儲不是內存。內部存儲位於系統中很特殊的一個位置,若是你想將文件存儲於內部存儲中,那麼文件默認只能被你的應用訪問到,且一個應用所建立的全部文件都在和應用包名相同的目錄下。也就是說應用建立於內部存儲的文件,與這個應用是關聯起來的。當一個應用卸載以後,內部存儲中的這些文件也被刪除。從技術上來說若是你在建立內部存儲文件的時候將文件屬性設置成可讀,其餘app可以訪問本身應用的數據,前提是他知道你這個應用的包名,若是一個文件的屬性是私有(private),那麼即便知道包名其餘應用也沒法訪問。 內部存儲空間十分有限,於是顯得難得,另外,它也是系統自己和系統應用程序主要的數據存儲所在地,一旦內部存儲空間耗盡,手機也就沒法使用了。因此對於內部存儲空間,咱們要儘可能避免使用。Shared Preferences和SQLite數據庫都是存儲在內部存儲空間上的。內部存儲通常用Context來獲取和操做。
  • 外部存儲:2.外部存儲:

最容易混淆的是外部存儲,若是說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目錄中。菜單資源文件必須使用

標籤做爲根節點。除了 標籤外,還有另外兩個標籤用於設置菜單項和分組,這兩個標籤是
標籤沒有任何屬性,但能夠嵌套在 標籤中,表示子菜單的形式。不過 標籤中不能再嵌入 標籤。
1. 標籤的屬性含義以下:
Id:表示菜單項的資源ID
menuCategory:同種菜單項的種類。該屬性可取4個值:Container、system、secondary和alternative。經過menuCategroy屬性能夠控制菜單項的位置。例如將屬性設爲system,表示該菜單項是系統菜單,應放在其餘種類菜單項的後面。
orderInCategor:同種類菜單的排列順序。該屬性須要設置一個整數值。例如menuCategory屬性值都爲system的3個菜單項(item一、item2和item3)。將這3個菜單項的orderInCategory屬性值設爲三、二、1,那麼item3會顯示在最前面,而item1會顯示在最後面。
title:菜單項標題(菜單項顯示的文本)
titleCondensed:菜單項的短標題。當菜單項標題太長時會顯示該屬性值
icon:菜單項圖標資源ID
alphabeticShortcut:菜單項的字母快捷鍵
numericShortcut:菜單項的數字快捷鍵
checkable:表示菜單項是否帶複選框。該屬性可設計爲true或false
checked:若是菜單項帶複選框(checkable屬性爲true),該屬性表示複選框默認狀態是否被選中。可設置的值爲true或false
visible:菜單項默認狀態是否可視
enable:菜單項默認狀態是否被激活
2. 標籤的屬性含義以下:
id:表示菜單組的ID
menuCategory:與 標籤的同名屬性含義相同。只是做用域爲菜單組
orderInCategory:與 標籤的同名屬性含義相同。只是做用域爲菜單組
checkableBehavior:設置該組全部菜單項上顯示的選擇組件(CheckBox或Radio Button)。若是將該屬性值設爲all,顯示CheckBox組件;若是設爲single,顯示Radio Button組件;若是設爲none,顯示正常的菜單項(不顯示任何選擇組件)。要注意的是,Android SDK官方文檔在解釋該屬性時有一個筆誤,原文是:
Whether the items are checkable. Valid values: none, all(exclusive/radiobuttons), single(non-exclusive/checkboxes).
相反了,正確應該是
all(non-exclusive/checkboxes),single(exclusive/radiobuttons).
visible:表示當前組中全部菜單項是否顯示。該屬性可設置的值是true或false
enable:表示當前組中全部菜單項是否被激活。該屬性可設置的值是true或false
3.具體使用
在代碼中使用
public boolenonCreateOptionsMenu(Menu menu){
MenuInflatemenuInflate = getMenuInflate();
menuInflate.inflate(R.menu.option_menu,menu);
returntrue;
}

代碼託管

https://git.oschina.net/sunxing27/java-besti-is-sx

相關文章
相關標籤/搜索