Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android學習過程中的一些基礎筆記,android筆記

Android學習過程中的一些基礎筆記,android筆記

編輯:關於android開發

Android學習過程中的一些基礎筆記,android筆記


【Activity】
創建一個Android Activity
http://blog.sina.com.cn/s/blog_4ca9ceef0100yjft.html

 

 



Activity <!-- 在Android中加注釋 -->
================================
* 理解成窗口
* 在窗口中可以設置顯示不同的界面
* 在 Activity 類中,
要編寫代碼,控制界面上控件的交互顯示

* 一般情況下,一個窗口只對應顯示一個界面

* 從一個 Activity 啟動另一個 Activity

1) 寫紙條

Intent intent =
new Intent(
當前窗口對象,
目標窗口類);

2) 傳紙條

startActivity(intent);

Intent intent=getIntent();
PageModule module =(PageModule)intent.getSerializableExtra("module"); //序列化的類


控件大小
width="40dp"
文字大小
textSize="40sp"

監聽器
====================================


布局 //以後改布局時如果有兩個layout,注意要同時改兩個布局的代碼(不然findViewById容易報空)//String和drawable可以自己靈活的尋找,但layout不可以
====================================
* 相對布局 RelativeLayout
* 線性布局 LinearLayout
* 表格布局 TableLayout
* 幀布局 FrameLayout //框架布局
* 網格布局 GridLayout

相對布局 RelativeLayout //退拽操作只支持相對布局
//相對布局如果是放入絕對布局中,相對布局要使用絕對布局的params作為自己在絕對布局中的定位
=================================== //可重合
* 停靠父控件邊界

alignParentTop 最上邊 //="true"
alignParentRight 最右邊
alignParentBottom 最底邊
alignParentLeft 最左邊

* 相對父控件居中

centerInParent 正中間 //="true"
centerHorizental 水平居中 Y軸
centerVertical 垂直居中 X軸

* 停靠周圍控件邊界

above 其他控件上邊 挨著 //="@id/bt4"
below 其他控件下邊
toLeftOf 其他控件左邊
toRightOf 其他控件右邊

* 與周圍控件邊界對齊

alignTop 與其他控件上邊對齊 //="@id/bt5"
alignRight 與其他控件右邊對齊
alignBottom 與其他控件下邊對齊
alignLeft 與其他控件左邊對齊
alignBaseline 與其他控件文本基線對齊

width="wrap_content" //包裹內容
="match_parent" //與父控件相匹配

"alignParentBottom" 最底邊在代碼中的實現方式
RelativeLayout.LayoutParams lp2 = new RelativeLayout.LayoutParams(
LayoutParams.MATCH_PARENT,
LayoutParams.WRAP_CONTENT);
lp2.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);


線性布局 LinearLayout
========================================
<LinearLayout orientation放在布局內> //布局內不重合

* 布局方向 //要麼是垂直方向一個一個擺放,要麼是水平方向一個一個擺放
//默認水平方向,在最上面
orientation= //
horizental //水平在上面
vertical //垂直在左邊

* 按比例分配剩余空間

weight比例= //如果有三個數,一個不變,剩下兩個加weight,它們兩個就會按比例占據剩下的部分
1 //把要設置比例的按鈕的widht設置為0dp
1.5
2.3
5.7
3

*) 垂直布局中,height="0dp" //垂直布局中,每一個部分都只能在自己那一行平移。
*) 水平布局中,width="0dp" //水平布局中,每一個部分都只能在自己那一列上下移動。 //1:37

* layout_gravity
重力引力

top
right
bottom
left
center
center_horizental
center_vertical

*) 垂直布局:
left
right
center_horizental
*) 水平布局:
top
bottom
center_vertical

表格布局 TableLayout
===================================== //布局行數不重合
<TableLayout stretchColumns="1,2"放在布局內> //拉伸相應的列使平均分布
* <TableRow>

表格的行,
在其中,添加其他控件

* 拉伸的列

strechColumns="0" //拉寬第1列
strechColumns="0,2" //拉寬第1和3列
strechColumns="2,3" //拉寬第3和第4列
strechColumns="1,2,3" //拉寬第2第3第4列

在表格布局中按鈕的寬度是默認的匹配父控件,即使設定了android:layout_width="wrap_content"也沒用
設置高度有用

幀布局 FrameLayout
======================================= //可重合
* 可以在控件上,
覆蓋添加其他控件 //比如菜單

* layout_gravity
重力引力

top
right
bottom
left
center
center_horizental
center_vertical

right|center_vertical //右同時垂直居中
bottom|center_horizental //下同時水平居中

marginBottom="-80dp" //外邊距 下面的外邊距-80dp,有一部分在界面外 //控件的下邊距

網格布局 GridLayout //與表格布局相識,但更復雜
==========================================
<GridLayout android:columnCount="4"放在布局內> //布局內不重合

是安卓4.0之後出來的版本才有的控件,不能在安卓2.2,2.3等低版本上使用
會報錯,要在目錄中倒數第四個文件中進行修改成只支持4.0以上版本,切換到代碼頁面進行改寫
把支持的最低版本8(安卓2.3.3)改為14(安卓4.0)
* columnCount //只設置列數
列的數量 //

* column //放在控件內,比如Button內
制定放置的列

column="0" //下標0表示第一列
column="3"

* <Space /> //表示一個空格

* rowSpan="2" //放在控件內 //跨兩行 //fill_vertical //填滿所跨的行
跨行

* columnSpan
跨列

* layout_gravity //使其填滿所跨的行或列

fill
fill_horizental
fill_vertical //填滿所跨的行

* <Space />
添加空白

---------------------------------------------------------------------------------------------------------------------------
【layout】 //分開布局
<ImageView
android:id="@+id/action_favor"

android:src="@drawable/ic_action_favor" />

【values/styles】
<style name="toolbar_action">
<item name="android:gravity">center</item>
<item name="android:layout_gravity">center</item>
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">fill_parent</item>
<item name="android:scaleType">center</item>
<item name="android:minWidth">44.0dip</item>
<item name="android:layout_weight">0.0</item>
</style>

【drawable】 //ic_action_favor.xml
<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:state_pressed="true" android:drawable="@drawable/ic_action_favor_on_pressed" />
<item android:state_selected="true" android:drawable="@drawable/ic_action_favor_on_normal" />
<item android:state_selected="false" android:state_pressed="true" android:drawable="@drawable/ic_action_favor_pressed" />
<item android:drawable="@drawable/ic_action_favor_normal" />
</selector>


---------------------------------------------------------------------------------------------------------------------------





【光標】 // <requestFocus />
<EditText
android:id="@+id/editText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_marginTop="14dp"
android:ems="10"
android:hint="@string/title_1_1" >

<requestFocus />
</EditText>


【航空訂票】
1.在res中導入解壓後的drawable-hdpi文件夾,內面是要用到的各種圖片
2.在libs中導入 ABS_DATASOURCE_v2.jar, 通過Build-Path導入 存著很多賬號密碼信息

【padding】 //內邊距
android:paddingLeft="20dp" //使控件內的文字的左邊的外邊距為20dp 文字的左邊距
【margin】 //外邊距
marginBottom="-80dp" //外邊距 下面的外邊距-80dp,有一部分在界面外 //控件的下邊距

【開始時】
//先設置標題欄 (隱藏標題欄)
//向安卓系統發送請求,請求系統把窗口標題欄隱藏掉
requestWindowFeature(Window.FEATURE_NO_TITLE);
//可以讓背景充滿整個手機屏幕,連電量也遮住,且背景不會變色,依然是白色。
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
//再顯示界面
setContentView(R.layout.activity_main);

//可以讓背景充滿整個手機屏幕,連電量也遮住,不過屏幕會變黑
在AndroidManifest.xml 中Activity定義添加
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

//可以讓背景充滿整個手機屏幕,連電量也遮住,且屏幕不會變黑
在AndroidManifest.xml 中Activity定義添加
android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" >

//請求系統把窗口標題欄隱藏掉
在AndroidManifest.xml 中Activity定義添加
android:theme="@android:style/Theme.Holo.NoActionBar">

//可以讓頁面只顯示中間一小塊設置成小窗口樣式,而且背景還會變成黑色
在AndroidManifest.xml 中Activity定義添加
android:theme="@android:style/Theme.Dialog"

//可以讓屏幕無法橫屏
在AndroidManifest.xml 中Activity定義添加
android:screenOrientation="portrait"

//登入狀態
android:launchMode="standard" //啟動模式 //後面有詳細介紹

//可以讓標題欄變成明亮色
在AndroidManifest.xml 中Activity定義添加
android:theme="@android:style/Theme.Holo.Light"

【獲得控件】
private void setViews() {
bt1=(Button)findViewById(R.id.button1 );
}

【設置監聽器】
【跳轉窗口】 //跳轉頁面
private void setListeners(){
bt1.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
Intent ents=new Intent(MainActivity.this, //當前窗口 //寫紙條
RelativeLayout.class); //目標窗口
startActivity(ents); //傳紙條

}
});
}
*【實現功能】
bt1.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
chaxun();

}
});

 

【吐司】 //一個小的黑色的提示框
Toast.makeText(this, "用戶名或密碼錯誤!\n\t\t登入失敗",
Toast.LENGTH_SHORT).show();

【顏色】
android:background="#0000"
view.setBackgroundColor((int) Long.parseLong("0000000f", 16)); //(int) Long.parseLong("0000000f", 16) 等於15

1.textview.setTextColor((int) Long.parseLong("0000000f", 16)); //(int) Long.parseLong("0000000f", 16) 等於15
2.textview.setTextColor(Color.rgb(255, 255, 255));
3.textview.setTextColor(Color.parseColor("#FFFFFF"));
4.Resources resource = (Resources) getBaseContext().getResources();
ColorStateList csl = (ColorStateList) resource.getColorStateList(R.color.my_color);
if (csl != null) {
tv.setTextColor(csl);
}


【GridView】
九宮格 android:stretchMode="columnWidth",縮放與列寬大小同步

【scale】
android:scaleType="centerCrop" //橫著拉長布滿整個空間 一個細長的圖片控件
例如:
<ImageView
android:id="@+id/ib"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@drawable/shadow"
android:layout_below="@id/bt2"
android:scaleType="centerCrop"
/>
【把數組加到ListView列表控件】
//在lv中顯示cities的數據 //列表控件
ArrayAdapter<String> adapter =new ArrayAdapter<String>(this, //this前面可能會加一個什麼什麼Activity,比如BranchSearchActivity.this
android.R.layout.simple_list_item_1,cities); //android.R.layout.simple_list_item_1系統自帶
lv.setAdapter(adapter);
方法二
stud=new String[]{"關羽","張飛","趙雲","馬超","黃忠"};
int resource=R.layout.listview_item; //listview_item是自己定的列表id
adapter=new ArrayAdapter<String>(this, resource,stud);
lv=(ListView)findViewById(R.id.students );
lv.setAdapter(adapter);

【把數組加到Spinner下拉菜單】
//在sp中顯示cities的數據 //下拉菜單
adapter =new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,cities);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sp.setAdapter(adapter);

getSelectItem() //不知道是不是這個

【AndroidManifest】 //的一些規則 ;文件 ;清單
//寫入到sdcord內存卡中,需要添加權限
在倒數第四個文件AndroidManifest中第三項Permissions添加權限,add第四個User Permission(權限)。
然後再name下選擇要添加的權限android.permission.WRITE_EXTERNAL_STORAGE,
之後把左邊的點一下,就確定了。

DDMS的File Explorer 在mnt內有一個sdcard


/sdcard/ ----虛擬路徑,指向/mnt/sdcard/
/mnt/sdcard/ ----真實路徑


【權限】
需要加權限 //將數據序列化成xml格式的字符序列輸出
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> //訪問網絡狀態,判斷有沒有網

【icon】
換App的應用封面圖片時,調用圖片時,不用加後綴
<application
android:icon="@drawable/goodk"

【menu】
給自己設置的刪除按鈕加圖片時,
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
android:showAsAction="never"
android:title="@string/action_settings"/>
<item
android:id="@+id/delete"
android:orderInCategory="101"
android:showAsAction="always"
android:title="刪除"
android:icon="@drawable/ic_menu_delete"/>
</menu>


【導入API源代碼】
第三個
D:\Android\sdk\sources

【Context】 //環境對象、上下文對象、場景對象
=====================================
* Android 四大組件的父類

Activity //窗口 活動 //顯示界面(顯示的界面都是繼承activity完成的)
Service //服務 //服務(後台運行的,可以理解為沒有界面的activity)
ContentProvider //內容提供者;內容供應商 //數據通信(數據之間通信,同個程序間數據,或者是不同程序間通信)
BroadcastReceiver //廣播接收器; //廣播(做廣播,通知時候用到)

【Application】 應用
當在Application中加載ImageLoader配置參數時,要在AndroidManifest.xml中
<application
android:name="com.tarena.myyself.activity.MyApplication" //添加name屬性,才能加載
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@android:style/Theme.Holo.Light.NoActionBar" >

* 翻譯為: 環境對象、上下文對象、場景對象

* 提供一組與底層 Android 系統通信的方法




【res】 目錄
================================================
* 資源目錄
* 會自動生成資源訪問 id
* 該目錄下的文件會被編譯
* layout 子目錄,界面 xml 文件

View v =
getLayoutInflater().inflate(R.layout.main)

【LayoutInflater】
LayoutInflater inflater = activity.getLayoutInflater();
View layout = inflater.inflate(R.layout.dialog_layout, null);

LayoutInflater inflater = this.getLayoutInflater();
View layout = inflater.inflate(R.layout.dialog_layout_only_enter, null);



【values】 子目錄中,存放一些“值” 包括: 字符串、數組、顏色值...
【設定語言文字】 //要切換到中文輸入法們只需要把安卓系統的語言改成中文就可以了。
在res目錄下新建(Folder)
【values-zh-rCN】-----strings.xml
zh語言 CN中國
en rUK 英國
en rUS 美國
zh rHK 香港

可以有不同語言版本,例如:
values-zh-rCN
values-語言-r地區

Java部分:
tv=(TextView)findViewById(R.id.textView1 );
Resources res =getResources(); //指向res
String s=res.getString(R.string.str1); //獲得字符串
String[] a1=res.getStringArray(R.array.arr1); //獲得字符串數組
int[] a2 =res.getIntArray(R.array.arr2); //獲得整形數組
int c1=res.getColor(R.color.color1); //獲得顏色
int c2=res.getColor(R.color.color2);

tv.setText(s);
tv.append("\n"+Arrays.toString(a1)); //數組轉化為字符串
tv.append("\n"+Arrays.toString(a2));
tv.setBackgroundColor(c1);
tv.setTextColor(c2);
Android部分:
英文 //values
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">day2302_資源目錄</string>
<string name="action_settings">Settings</string>
<string name="hello_world">Hello world!</string>

<string name="str1">My String!</string>
<string-array name="arr1">
<item>aaa</item>
<item>bbb</item>
<item>ccc</item>
</string-array>
<integer-array name="arr2">
<item>222</item>
<item >444</item>
<item >666</item>
</integer-array>
<color name="color1">#fff</color>
<color name="color2">#00f</color>
</resources>


中文 //values-zh-rCN //要切換到中文輸入法們只需要把安卓系統的語言改成中文就可以了。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">23天項目2_資源目錄</string>
<string name="action_settings">Settings</string>
<string name="hello_world">師姐你好!</string>
<string name="str1">我的字符串!</string>
<string-array name="arr1">
<item>嗷嗷嗷</item>
<item>白冰冰</item>
<item>長城長</item>
</string-array>
<integer-array name="arr2">
<item>222</item>
<item >444</item>
<item >666</item>
</integer-array>
<color name="color1">#fff</color>
<color name="color2">#00f</color>
</resources>

【raw】 子目錄下的文件不會編譯,會生成資源訪問 id //文本文檔

in = getResources().openRawResource(R.raw.xxx);
例子:
在res目錄內新建
raw ----abc
raw-ch-rCN ----abc(必須小寫) //R會引用 //改成中文輸入法之後,就會顯示帶-ch-rCN的部分
try {
BufferedReader in=new BufferedReader(new InputStreamReader( //輸入流在中文模式下時指向raw-ch-rCN/abc ;在沒設定模式下指向raw/abc
res.openRawResource(R.raw.abc),"GBK")); //InputStream in=res.openRawResource(R.raw.abc) //res在上面新建的
String line;
while((line=in.readLine())!=null){
tv.append("\n"+line);
}
in.close();
} catch (Exception e) {
e.printStackTrace();
}


【xml】 目錄,會被編譯,會生成資源訪問 id //xml文檔 //解析器和序列化器在Java那邊

XmlPullParser p = getResources().getXml(R.xml.資源id);



getResources() 方法
----------------------------------------------
獲得一個資源訪問對象 Resources

Resources
----------------------------------------------
openRawResource(文件資源id) 創建 raw 文件中的文件流
getString(id) 獲得資源字符串
getColor(id) 獲得顏色值
getStringArray(id) 獲得字符串數組
getIntArray(id) 獲得整數數組

例子:
在res目錄內新建
英文xml ----abc
中文xml-ch-rCN ----abc (必須小寫) //R會引用 //改成中文輸入法之後,就會顯示帶-ch-rCN的部分
try {
XmlPullParser p=res.getXml(R.xml.abc); //解析器在中文模式下時指向xml-ch-rCN/abc ;在沒設定模式下指向xml/abc
int type;
while((type=p.next())!=1){
if(type==XmlPullParser.TEXT){
s=p.getText();
tv.append("\n"+s);
}
}

} catch (Exception e) {
e.printStackTrace();
}
【pull解析】 //類似於pull解析
private void readChatServer() {
XmlResourceParser xmlResourceParser = getResources().getXml(
R.xml.chat_server);
int eventType = xmlResourceParser.getEventType();
while (eventType != XmlResourceParser.END_DOCUMENT) {
if (eventType == XmlResourceParser.START_TAG) {
String tagName = xmlResourceParser.getName();
if ("host".equals(tagName)) {
host = xmlResourceParser.nextText();
}
if ("serviceName".equals(tagName)) {
serviceName = xmlResourceParser.nextText();
}
if ("port".equals(tagName)) {
port = Integer.parseInt(xmlResourceParser.nextText());
}
}
eventType = xmlResourceParser.next();
}
}

 

 



【adb】
在DDMS中的左邊的倒三角型下有一個reset adb


【Assets】 //資產文件 //資產,只能讀取,無法寫入
================================================
* 存放在 項目/assests 文件夾中的文件,
可通過以下方法訪問

* 不生成資源 id

* 任意創建子目錄

getAssets().poen(文件名)

getAssets() 返回 AssetManager 對象

AssetManager - 資產管理對象
----------------------------------
open(String fileName) 創建文件流
list(String path) 列出文件
例子:
可以新建子目錄 目錄abc-文件a和b和c
res無法新建子目錄
例子:
tv=(TextView)findViewById(R.id.textView2 );
try {
AssetManager am =getAssets(); //指向assets
String[] list =am.list("abc"); //收集一個數組
tv.setText("assets/abc目錄列表");
for(String name:list){
tv.append("\n"+name);
}
InputStream in=am.open("abc/a"); //讀abc/a
tv.append("\n文件n的第一個字節");
tv.append("\n"+in.read());
in.close();
} catch (Exception e) {
e.printStackTrace();
}

【透明度】
0到255,0為完全透明,255為不透明

【重心gravity】 //http://blog.csdn.net/aminfo/article/details/7784229
CENTER_HORIZONTAL "gravity": 1,
CENTER_VERTICAL 16
CENTER 17
BOTTOM 80
TOP 48
LEFT 3
RIGHT 5

【Application】
=========================================
* Context的子類

* 在應用啟動時自動創建的一個實例,
一個應用中,只有唯一的一個實例

* 創建實例後,會自動執行它的 onCreate() 方法
這個方法在 Application 類中是一個空方法

* 可以編寫 Application 子類,
來將默認的 Application 類替換掉

* 應用啟動時,要執行一些代碼,
可以繼承 Application 類,
重寫它的 onCreate() 方法,
並在“清單文件”中配置

 


【data】 內部存儲
內部存儲 8個方法
================================================
/data/data/應用包名

getDir(String name, int mode)
--------------------------------
/data/data/應用/app_目錄名

創建或訪問文目錄,返回 File 對象
在此目錄可以創建任意文件、子目錄

訪問權限針對整個目錄而不能針對單個文件

dataDir
--------------------------------
getApplicationContext().getApplicationInfo().dataDir + "/lib/libbd_etts_text.dat.so";
/data/data/com.baidu.tts.sample/lib/libbd_etts_text.dat.so

getFilesDir()
--------------------------------
/data/data/應用/files

獲得表示 files 目錄的 File 對象

getFileStreamPath(String name)
--------------------------------
/data/data/應用/files/文件名

獲得表示 files 目錄中,一個指定文件的 File 對象,
這些文件也可以通過以下方法創建流
openFileInput()
openFileOutput()

openFileInput(String name)
openFileOutput(String name, int mode)
--------------------------------
/data/data/應用/files/文件名

創建文件流

MODE_PRIVATE
MODE_APPEND
MODE_WORLD_READABLE
MODE_WORLD_WRITEABLE

deleteFile(String name)
--------------------------------
/data/data/應用/files/文件名

刪除文件

fileList()
--------------------------------
/data/data/應用/files/

獲得文件列表,返回文件名 String[] 數組

getCacheDir()
--------------------------------
/data/data/應用/cache/

獲得緩存(臨時)目錄,返回表示該目錄的 File 對象。
存儲空間緊張時,系統會自動刪除該目錄中的文件。

你應該嚴格限制此目錄總大小(例如1M),
超出限制時應對文件做清理

getDatabasePath("數據庫文件.db")
例子:
tv=(TextView)findViewById(R.id.textView1 );
try {
//內部存儲/data/data/tarena.day2304/app_mulu1
//還有一個/data/data/tarena.day2304/files
File mulu1dir= getDir("mulu1", MODE_PRIVATE); //創建目錄
tv.setText(mulu1dir.getAbsolutePath()); //顯示絕對路徑 // /data/data/tarena.day2304/app_mulu1 //自動加前綴

File filesdir =getFilesDir(); //創建默認目錄files
tv.append("\n"+filesdir.getAbsolutePath()); // /data/data/tarena.day2304/files

File f1 =getFileStreamPath("wenjian1"); //指向目標
f1.createNewFile(); //創建文件
tv.append("\n"+f1.getAbsolutePath()); // /data/data/tarena.day2304/files/wenjian1

FileOutputStream out =openFileOutput("wenjian2", MODE_PRIVATE);//創建文件,私人模式
out.write("abc".getBytes());
out.close();

FileInputStream in=openFileInput("wenjian2");
tv.append("\n"+in.read()); //97
tv.append("\n"+in.read()); //98
tv.append("\n"+in.read()); //99
in.close();
String[] list =fileList();
for(String s:list){
tv.append("\n"+s); //wenjian1 wenjian2
}
deleteFile("wenjian1");
tv.append("\n wenjian1已刪除");

} catch (Exception e) {
Toast.makeText(this, "出錯,清查看logcat日志異常信息", Toast.LENGTH_SHORT).show();
e.printStackTrace();
}

 

【sdcard】 外部存儲
================================================
Environment.getExternalStorageDirectory()

外部存儲卡路徑 File 對象

/mnt/sdcard
/storage/sdcard
/storage/sdcard0
/storage/sdcard1



-----------------------------------------------------------------------------------------
//mnt/sdcard/tlbs1503/apk
//mnt/sdcard/tlbs1503/image
//mnt/sdcard/tlbs1503/audio
public static final String SDCARD_ROOT=Environment.getExternalStorageDirectory().getAbsolutePath(); //+log.txt
public static final String APK_PATH=SDCARD_ROOT+"/tbls1503/apk";
public static final String IMAGE_PATH=SDCARD_ROOT+"/tbls1503/image";
public static final String AUDIO_PATH=SDCARD_ROOT+"/tbls1503/audio";
----------------------------------------------------------------

以前的Android(4.1之前的版本)中,SDcard跟路徑通過“/sdcard”或者“/mnt/sdcard”來表示存儲卡,而在Jelly Bean系統中修改為了“/storage/sdcard0”,以後可能還會有多個SDcard的情況。
目前為了保持和之前代碼的兼容,sdcard路徑做了link映射。 //http://blog.sina.com.cn/s/blog_5da93c8f0102vcam.html
為了使您的代碼更加健壯並且能夠兼容以後的Android版本和新的設備,請通過Environment.getExternalStorageDirectory().getPath()來獲取sdcard路徑,
如果您需要往sdcard中保存特定類型的內容,可以考慮使用
Environment.getExternalStoragePublicDirectory(String type)函數,該函數可以返回特定類型的目錄,目前支持如下類型:
獲得某種類型文件的標准存儲目錄,Environment.常量 // /mnt/sdcard/Movies
DIRECTORY_ALARMS //警報的鈴聲
DIRECTORY_DCIM //相機拍攝的圖片和視頻保存的位置
DIRECTORY_DOWNLOADS //下載文件保存的位置
DIRECTORY_MOVIES //電影保存的位置, 比如 通過google play下載的電影
DIRECTORY_MUSIC //音樂保存的位置
DIRECTORY_NOTIFICATIONS //通知音保存的位置
DIRECTORY_PICTURES //下載的圖片保存的位置
DIRECTORY_PODCASTS //用於保存podcast(博客)的音頻文件
DIRECTORY_RINGTONES //保存鈴聲的位置

 

 

getExternalCacheDir()//方法可以獲取到 SDCard/Android/data/你的應用包名/cache/目錄,一般存放臨時緩存數據//如果使用上面的方法,當你的應用在被用戶卸載後,SDCard/Android/data/你的應用的包名/ 這個目錄下的所有文件都會被刪除,不會留下垃圾信息。
/sdcard/Android/data/應用/cache/

getExternalFilesDir(Environment.DIRECTORY_MUSIC) // 指向 /mnt/sdcard/Android/data/tarena.day2304/files/Music
Context.getExternalFilesDir()方法可以獲取到 SDCard/Android/data/你的應用的包名/files/ 目錄,一般放一些長時間保存的數據//如果使用上面的方法,當你的應用在被用戶卸載後,SDCard/Android/data/你的應用的包名/ 這個目錄下的所有文件都會被刪除,不會留下垃圾信息。
//比如APP的下載

Environment.getExternalStorageState()

獲得存儲卡狀態代碼,Environment.常量
MEDIA_BAD_REMOVAL 正確卸載前已經拔卡
MEDIA_CHECKING 正在檢測
MEDIA_MOUNTED 正確裝載,已准備好讀寫
MEDIA_MOUNTED_READ_ONLY 正確裝載,只讀
MEDIA_NOFS 正確裝載,但不支持文件系統
MEDIA_REMOVED 已移除
MEDIA_SHARED 已經卸載並作為u盤連接電腦
MEDIA_UNMOUNTABLE 無法裝載
MEDIA_UNMOUNTED 存在sd卡,但未裝載


Environment.getRootDirectory() /system
Environment.getDataDirectory() /data
Environment.getDownloadCacheDirectory() /cache
例子:
File sdcard =Environment.getExternalStorageDirectory(); //指向 /mnt/sdcard/
tv.append("\n"+sdcard.getAbsolutePath());
File music =getExternalFilesDir(Environment.DIRECTORY_MUSIC); //指向 /mnt/sdcard/Android/data/tarena.day2304/files/Music
tv.append("\n"+music.getAbsolutePath());
File downloads=Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DOWNLOADS); //指向 /mnt/sdcard/Download
tv.append("\n"+downloads.getAbsolutePath());
if(Environment.getExternalStorageState().equals( //如果外部的存儲狀態等於媒體就緒
Environment.MEDIA_MOUNTED)){
tv.append("\nsd卡可讀寫");
}



【SharedPreferences】 偏好設置
======================================================
/data/data/應用/shared_prefs/文件名.xml

p1 = getSharedPreferences(文件名, MODE_PRIVATE);

自定義文件名

p2 = getPreferences(MODE_PRIVATE);

Activity類名當做文件名
在一個 Activity 中,讀寫自己的偏好設置文件

p3 = PreferenceManager.getDefaultSharedPreferences(this);

包名當做文件名,
在整個應用中,都可以使用這個偏好設置文件

方法
--------------------------------------------------
edit()

contains(String key)
getAll()
getBoolean(String key, boolean defValue)
getFloat(String key, float defValue)
getInt(String key, int defValue)
getLong(String key, long defValue)
getString(String key, String defValue)
getStringSet(String key, Set<String> defValues)
registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener)
unregisterOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener)

SharedPreferences.Editor
--------------------------------------------------
putBoolean(String key, boolean value)
putFloat(String key, float value)
putInt(String key, int value)
putLong(String key, long value)
putString(String key, String value)
putStringSet(String key, Set<String> values)

remove(String key)
clear()

apply()
commit()

【StatFS】
==========================================
* 獲得指定空間的空間使用情況

getBlockCount() 塊的數量
getBlockSize() 塊的大小
getFreeBlocks() 剩余塊數量
getAvailableBlocks() 有權使用的剩余塊數量

 



【終止】
XML是在while((type=p.next())等於1){}時終止 //XmlPullParser.END_DOCUMENT
BufferedReader的readLine()方法是在while((line=in.readLine())等於null){}時終止 //下標會向後移
read()是在while((n=in.read(buf))等於-1){}時終止

 

 

【把TextView控件中的數據輸出到指定文件中去】 //gbk不行
byte[] ss =tv.getText().toString().getBytes("utf-8");
FileOutputStream outsd=new FileOutputStream("/sdcard/str",true);
outsd.write(ss);

byte[] ss =tv.getText().toString().getBytes("utf-8");
//String ss =tv.getText().toString();
FileOutputStream outsd=new FileOutputStream("/sdcard/str",true);
//BufferedWriter outsd =new BufferedWriter(new OutputStreamWriter(new FileOutputStream("/sdcard/str",true),"utf-8"));
// PrintWriter outsd=new PrintWriter
outsd.write(ss);

【單選】
當android:checkMark屬性的值為?android:attr/listChoiceIndicatorSingle時選擇模式為單選

 


【消息模型】
Message ; //消息對象
MessageQueue ; //消息隊列
Looper; //迭代器 //隱藏線程進行迭代 可能是這個隱藏線程mThread = Thread.currentThread();
Handler //發送,處理消息

Day04-2 Android 中的線程應用(重點,難點)

【判斷線程】 Log.i("TAG","---------------"+Thread.currentThread().getName());

1.Android 中線程對象應用機制?

1)所有的UI操作都在主線程(UI線程)執行.
2)所有的耗時操作都在工作線程(自己構建的)。

為什麼?改善用戶體驗。

2.Android 中【線程通訊機制?】

假如在android中主線程要與工作線程之間實現數據的傳遞,那如何實現?

例如:
1)工作線程從網絡中下載一個圖片
2)主線程將下載的圖片更新到頁面上

關鍵是如何實現線程之間的無阻塞數據通訊?

3.Android中線程交互消息模型?

Android 中線程之間的交互通常是借助消息的傳遞實現,如何實現?

要理解其實現過程,首先要理解Android中消息模型四大核心對象。

1)Message (消息對象,數據的載體); //創建對象Message msg=Message.obtain();
2)MessageQueue(消息隊列,存儲多個消息)
3)Looper(迭代器,迭代消息隊列)
4)Handler(發送,處理消息)

四大核心對象偽代碼實現? //模擬

class Message{
Object obj;//借助此變量存儲數據
......
}
class MessageQueue{
Message msg[]=new Message[10];
.....
}
class Looper{
MessageQueue mq;(關聯消息隊列)
public void loop(){//迭代
while(true){
.........
}
}
}
class Handler{//消息處理器
Looper looper;
public void sendMessage(msg){}
public void handleMessage(msg){}
}
程序=數據結構+算法

例如:大象放冰箱?

1)大象
2)冰箱

class Elephant{.......}
class IceBox{
Elephant e[]=new Element[3];
public void open(){}
public void put(Elephant e){}
public void close(){}
}

4.案例:工作線程發消息給主線程

數據結構:
1)主線程(UI線程,由JVM創建)
2)工作線程(由主線程創建)
3)消息(用於存儲數據)
4)關聯對象:MessageQueue,Looper,Handler

【算法實現】:

首先要掌握這樣的一個核心思想:給哪個線程發消息,就獲得與哪個線程的Looper相關聯的Handler.-------------------------------》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

掌握:
1)主線程默認有Looper嗎?
有,此Looper在主線程啟動時,已創建,並關聯的一個消息隊列。

2)工作線程如何獲得主線程的Looper?

Looper.getMainLooper();

3)工作線程中通過主線程的Looper構建Handler?

new Handler(Looper.getMainLooper());

4)Handler中借助sendMessage方法發送消息,借助handleMessage方法處理消息

sendMessage方法運行在哪個線程取決於在哪個線程。
handleMessage方法運行在哪個線程取決於handler關聯的Looper.

5.案例:主線程給工作線程發消息?

例如:現有一個用戶注冊程序,主線程獲得了頁面上的數據以後將數據交給工作線程,
工作線程將數據寫到網絡中服務端。

數據結構:
1)主線程(UI線程,由JVM創建)
2)工作線程(由主線程創建)
3)消息(用於存儲數據)
4)關聯對象:MessageQueue,Looper,Handler


算法:
1)工作線程默認沒有Looper
2)工作線程如何創建Looper




【Android 中線程應用】

1.Android 中線程應用機制?(兩天)
2.Android 中線程之間的通訊模式?
借助消息傳遞,目的是為了盡量降低主線程(UI線程)的阻塞。

3.Android 中線程通訊消息模型?

1)Message
2)MessageQueue
3)Looper
4)Handler


【Handler】對象其它方法應用

1.sendMessage(msg)
2.handleMessage(msg)
3.sendEmptyMessage(int what)
4.postDelay(Runnable r); 底層發送延遲消息
.......
----------------------------------------------

【Message】 對象其它方法

1.obtain(); 首先從消息池獲得消息,
消息池沒有則創建。
Message msg=Message.obtain();
2.obtain(.....) 重載
3.sendToTarget(); 發送消息
Message.obtain(h,5).sendToTarget();
---------------------------------------------

記住:
1)給哪個線程發消息,就要獲得與哪個線程的Looper相關聯的Handler.
2)主線程默認有一個Looper,工作線程默認,需要時需要自己創建。

FAQ?

1)一個線程可以有多個Looper嗎?不可以
2)一個Looper中只有一個消息隊列?正確
3)一個線程可以有多個Handler對象嗎?可以

----------------------------------------------

【HandlerThread】類的應用。 //構建一個工作線程

此類為Android中提供的一個工具類(本質上是一個線程類型,繼承Thread),
借助此類主要是為了簡化工作線程中Looper對象的創建。在此類中封裝了
Looper對象的創建,獲得,銷毀過程。

例子:
package com.example.day04;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.View;

public class MainActivity extends Activity {
private Looper wLooper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
/**點擊Button時主線程發消息給工作線程*/
HandlerThread ht;
public void onClick(View view){
//構建一個工作線程,並啟動工作線程
ht=new HandlerThread("WorkThread");
ht.start();
//說明:一個線程只能有一個Looper
//1.假設此數據從頁面上獲得
String data="Hello Gsd1503!";
//2.將此數據傳給工作線程
//2.1構建消息對象,封裝數據
Message msg=new Message();
msg.obj=data;
//2.2構建Handler對象(關聯工作線程的Looper)
//消息是要存儲在工作線程的消息隊列
Handler h=new Handler(ht.getLooper()){
public void handleMessage(
Message msg) {
Log.i("TAG", (String)msg.obj);
};
};
//2.3發送消息
h.sendMessage(msg);
}
/**當Activity銷毀時會自動調用*/
@Override
protected void onDestroy() {
super.onDestroy();
//.......
ht.quit();
}
}

 


【runOnUiThread】
說明:在工作線程中更新UI可以調用runOnUiThread(Runnable r)方法
runOnUiThread(new Runnable() {
@Override
public void run() {
resultTv.setText("結果為:"+result);
}
});
--------------------------------------
Day05-6
【異步任務對象】(AsyncTask)

Android中提供了一個工具類,封裝了消息的傳遞過程,此類為AsyncTask,
借助此類主要是為了簡化Android消息傳遞過程代碼編寫。

此類中的有些方法運行在主線程,有些方法運行在工作線程,而且有一個先後的順序。

【AsyncTask】 //新建一個子類,部分在主線程,部分在工作線程
package com.example.day05;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

public void onClick(View view){
//構建異步任務對象
DownTask task=new DownTask();
//啟動異步任務(數據會傳給doInBackGround方法)
task.execute("tarena","gsd1503");
}
//下面方法2的參數 //進度條 //下面2的返回值,下面3的參數
class DownTask extends AsyncTask<String,Void,String>{ //第一個字母大寫
/**運行在主線程,通常用於執行一些初始化操作
* 執行的時間點,比doInBackground早*/
@Override
protected void onPreExecute() { //第一個執行
Log.i("TAG", "onPreExecute()");
}
/**此方法運行在工作線程*/
@Override
protected String doInBackground(String... params) { //第二個執行
Log.i("TAG", "doInBackground(..)");
return (params[0]+params[1])
.toUpperCase();
}
/**此方法運行在主線程
* 用於處理doInBackground方法的
* 返回結果
* */
@Override
protected void onPostExecute(String result) { //第三個執行
Log.i("TAG", "onPostExecute");
setTitle(result);
}
}
}

當我們構建異步任務類對象時,通常是構建AsyncTask的子類的對象,並重寫doInBackGround方法,其它方法有選擇性的重寫。

掌握AsyncTask類中的常用方法:
1)onPreExecute()
2)doInBackground()
3)onPostExecute();
4)publishProgress()
5)onProgressUpdate()

 

【繼承特性】:OOP(三大特性)

1)繼承是對象共性的再次抽象。
可以將多個對象的共性提取到父類中,
以實現代碼的復用。
2)繼承的目的是實現代碼的復用。
3)繼承特性在實際應用中要掌握這樣的
一個原則:子類除非要繼承父類所有
的屬性或方法,否則盡量不要使用繼承。

class Rect{代表矩形
private int width;
private int height;
public void setWidth(int width){
this.width=width;
}
public void setHeight(int height){
this.height=height;
}
public int getArea(){
return width*height;
}
}
class Square extends Rect{ 正方形
}
class Test{
public static void main(String args[]){
Square s=new Square();
s.setWidth(100);
s.setHeight(300);
s.getArea();
}
}



【阻塞式隊列】
package day05;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

public class TestBlocking {

public static void main(String[] args)
throws Exception{
//阻塞式隊列,隊列滿了以後,不能繼續再次放入數據
BlockingQueue<String> q01=
//new LinkedBlockingQueue<>(3);
new ArrayBlockingQueue<>(3);
q01.put("A");
q01.put("B");
q01.put("C");
System.out.println("q01="+q01);
//q01.put("D");//滿了會阻塞
//q01.add("D");//滿了會拋出異常
//System.out.println("q01=="+q01);
//取數據
System.out.println(q01.take());
System.out.println(q01.take());
System.out.println(q01.take());
//隊列為空時take方法會等待
//System.out.println(q01.take());
//隊列空時執行remove方法會拋出異常
//System.out.println(q01.remove());
}
}


【遞增遞減】
package day30;
import java.util.concurrent.atomic.AtomicInteger;
public class Test31 {
public static void main(String[] args) {
AtomicInteger at=new AtomicInteger(100);
System.out.println(at.getAndIncrement()); //100
System.out.println(at.getAndDecrement()); //101
System.out.println(at.getAndDecrement()); //100
System.out.println(at.getAndDecrement()); //99

}

}


【線程池】 //AsyncTask
儲存在阻塞式隊列 LinkedBlockingQueue
通過線程工廠創建 sThreadFactory
【任務execute】 //AsyncTask
儲存在final ArrayDeque<Runnable> mTasks = new ArrayDeque<Runnable>();


【webSocket】
webSocket, 是建立在socket基礎上的,只不過是浏覽器支持的,所以就叫websocket。是一個應用層協議,說的是,目前浏覽器實現的一套通信協議,
用來解決之前HTTP,請求響應模型不合適的場合。
websocket是socket的簡約實現,與socket相比,可以節省額外的端口占用,直接使用一個公網域名訪問。另外協議對報文的流量消耗做了優化。

【socket】
socket是套接字,在你的語境下,多指傳輸層網絡接口。

【XMPP】
XMPP,是一個應用層協議,協議基於XML結構設計。xmpp是im的使用比較廣泛的協議,早期的手機端推送為了省事就用的這種協議,
但是後來發現這種協議比較臃腫耗流量,而且對服務器要求比較高,所以就開始轉向其他協議了,

 

-----------------------------------------------
Day06-2
【網絡編程】(Socket編程)

1.何為Socket?

對於一個網絡應用程序而言,網絡客戶端與網絡服務端通過一個雙向的連接通道進
行數據交互,這個雙向的連接通道的一端稱之為socket.

2.Socket 應用的構成?

1)Socket 服務端
2)Socket 客戶端
3)Socket 通訊協議(標准,數據的載體):TCP/IP協議 //通訊協議類似於message的作用

3.Android 中Socket應用的構建步驟

1)編寫Socket 服務端 (Java項目中編寫)
ServerSocket server=
new ServerSocket(9999)
服務端對象構建以後,要在9999這個
端口進行監聽。
while(true){
Socket socket=server.accept();監聽,等待客戶端的連接
}
2)編寫Socket客戶端(Android 項目實現)
構建客戶端對象
Socket socket=new Socket();
連接服務端
socket.connect(new InetSocketAddress("172.16.7.17",9999),5000);//5000為等待時間
socket.connect(new InetSocketAddress(getResources().getString(R.string.ip),
Integer.parseInt(getResources().getString(R.string.port))),5000);

連接服務端時要制定IP,PORT;
IP:網絡中計算機的唯一標識。
PORT:計算機中應用程序的唯一標識。

3)Socket客戶端與服務端進行數據交互

客戶端,服務端獲得流對象?

當客戶端向服務端寫數據:借助輸出流
當客戶端從服務端讀數據:借助輸入流
當服務端讀取客戶端數據:借助輸入流
當服務端向客戶端寫數據:借助輸出流

具體方式:可以借助通道
socket.getInputStream();
socket.getOutputStream();
例子:
1)客戶端給服務端寫入消息
out=new DataOutputStream(socket.getOutputStream()); //輸出流
out.writeUTF(params[0]+"/"+params[1]);
out.flush();
2)服務端讀取客戶端發過來的消息
in = new DataInputStream(socket.getInputStream()); //輸入流
String s = in.readUTF();
3)服務端把讀取的消息寫入到服務器的文件中
out=new PrintWriter(new OutputStreamWriter(new FileOutputStream("d:\\dd.txt",true),"UTF-8"),true); //輸出流
out.println(s+"/"+sdf.format(new Date()));

備注:android應用程序中通過socket訪問網絡時需要注意兩點:
1) 添加訪問網絡的權限(AndroidManifest.xml)
android.permission.INTERNET
要加權限,倒數第四個第三項
<uses-permission android:name="android.permission.INTERNET"/>
2) 訪問網絡的動作在工作線程執行。

---------------------------------------------


 

Day07-1
【反射】
反射的應用(基礎):了解
---------------------------------------------

1.FAQ?

1)Button,TextView等是對象嗎? //是
這些對象是如何創建的?

2)Activity是對象嗎?此對象是如何創建的? //是

這些對象都可以由底層框架(Framework)借助
反射構建.

2.何為反射?

反射是Java中的一種應用機制,主要應用於底層框架編程,是通用的編程的一種手段,
對應了一組API,借助這組API可以在對象運行時,獲得其屬性,方法等,並可以
通過某種手段改變屬性的值,調用相關方法。

3.反射的作用?

1)簡化代碼的編寫。
2)從底層操作對象。

3.反射應用的起點? //類對象的獲取(類對象是反射的起點)

在Java應用中有兩種對象:
類對象和類的對象


此類的類對象:Point.class,其類型為Class
此類的類的對象:new Point();其類型為Point
類對象在內存中只有一份,在類加載時構建。
類的對象在內存中可以有多份,一般通過new關鍵字構建。

類對象的獲取方式:
1)類名.class
2)類的對象.getClass()
3)Class.forName("包名.類名");

4.通過類對象構建類的對象

1)調用類對象的newInstance方法
前提:此類必須有一個可訪問的無參構造函數

Class.forName("").newInstance();

2)借助類對象獲得構造方法對象,借助構造方法對象構建類的對象。

Constructor<?> c=c0.getDeclaredConstructor(String.class)
c0.getConstructors()
c0.getDeclaredConstructors();
Student s=(Student)c.newInstance("gsd1503");

例如


【通過類對象創建類的對象】 //通過構造方法對象創建類的對象 //通過類的對象創建類對象
package day0506;
import java.lang.reflect.Constructor;
class Point{
int x,y;
}
class Student{ //沒有無參構造的要用類對象創建類的對象要用下面的第二種方法
private String s;
private Student(String s){
this.s=s;
}
@Override
public String toString() {
return " s=" + s;
}

}
//類對象的獲取(類對象是反射的起點)
public class ReflectDemo {
public static void main(String[] args) throws Exception {
Point p1=new Point();//類的對象
Class<?> c1=Point.class; //類對象

Class<?> c2=p1.getClass();//獲得類對象
Class<?> c3=Class.forName("day0506.Point");
System.out.println(c1==c2); //true
System.out.println(c2==c3); //true
creatObjectByClass();
}
private static void creatObjectByClass()throws Exception{
//第一種方法:
/* //類對象
Class<?> c0=Class.forName("day0506.Point");
//通過類對象創建類的對象
Object obj=c0.newInstance(); //Point類中必須包含無參的構造函數
System.out.println(obj); //day0506.Point@c17164
if(obj instanceof Point){
Point p=(Point)obj;
System.out.println(p); //day0506.Point@c17164
}*/

//第二種方法:
Class<?> c0=Class.forName("day0506.Student");
//通過類對象獲得構造方法對象
//public Student(String s){}
//獲得參數類型String類型的構造方法
Constructor<?> c=c0.getDeclaredConstructor(String.class);//Declared任意訪問修飾符都可以

//假如構造方法私有化了,可以設置可
c.setAccessible(true);//設置可訪問

//通過構造方法對象創建類的對象
Student s=(Student)c.newInstance("gsd1503");
System.out.println(s); // s=gsd1503
}
}

此類的類對象:Point.class,其類型為Class
此類的類的對象:new Point();其類型為Point


【建新按鈕】 //MyButton
package com.example.day07;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.Button;
public class MyButton extends Button{
public MyButton(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
}

 


5.通過類對象獲得方法對象,執行方法對象?

Method m=c.getDeclaredMethod(Class<T> ...paramTypes)
c.getDeclaredMethods();

執行方法

m.invoke(類的對象,實際參數);

6.通過類對象獲得類中的屬性對象?

Field f=c.getDeclaredField(String name);
Field fs[]=c.getDeclaredFields()

//給屬性賦值

f.set(類的對象,實際參數)

7.反射API總結

1)Class //類對象
2)Constructor //構造方法
3)Method //方法
4)Field //成員變量

 


【要跑到D盤】
進入D盤正確操作如下: // D:
cd是改變路徑,一般在同一盤符下切換
cd\ 直接回到C 盤
cd/d D:\Java\test\src\test 跳出C盤,直接進入D:\Java\test\src\test

-------------------------------------------


Day07-2
【MySQL】 //數據庫 本機IP地址172.16.4.165

1.MySQL 是什麼?

1) 是一個軟件(工具),數據庫管理系統(DBMS)
2) 基於C/S架構(客戶端,服務端)
3) 由MySQL AB 公司研發,現歸甲骨文所有。
4) 開放平台(並非完全開源)

市場上類似產品:Oracle,DB2,SQLServer,....

2.MySQL 用於做什麼?

1)更好的存儲數據
2)更好的管理數據

3.MySQL 應用場合?

電子商務
網上銀行
.......

4.MySQL 的安裝的卸載?

4.1 安裝 //確保系統內只有一個數據庫軟件mysql,如果已經有一個,把之前的刪除掉

1) 解壓到C盤根目錄
C:\mysql-5.5.11-win32
2) 啟動dos窗口(以管理員身份啟動)
3) 切換到C:\mysql-5.5.11-win32\bin
3.1) 切換到根目錄

cd / //cd \
3.2) 切換到mysql的bin目錄

cd C:\mysql-5.5.11-win32\bin

4) 安裝mysql 服務
mysqld -nt-install mysql

5) 啟動mysql 服務
net start mysql

4.2 卸載

1) 先停服務
net stop mysql
2)卸載

在dos窗口的這個C:\mysql-5.5.11-win32\bin
目錄執行
mysqld -remove mysql

5.MySQl登陸,退出 //mysql -u lipeineng -h 172.16.7.17 -p lpn
登入mysql
登陸: mysql -u root -p //mysql //給系統環境變量加一個C:\mysql-5.5.11-win32\bin;就可以直接用mysql登入,不然就必須進入到C:\mysql-5.5.11-win32\bin;目錄下登入。
退出:\q // \c 回退 或 ctrl+c 退出

6.MySQL 常用操作

1)status (查看mysql狀態信息)
2)show databases;(查看當前系統有哪些數據庫)
3)select user();(查看當前登陸用戶)
4)select now();(查看當前時間)
5)? functions;(查看系統函數,?等價於help)
6).....

7.MySQL 中的SQL? (重點)

SQL是一個標准,是客戶端與服務端
進行數據交互的橋梁。

SQL分類:

1)DDL :數據定義語言(create,alter,drop,...)
2)DML: 數據操縱語言(insert,update,delete,select)
3)DCL : 數據控制語言(grant,revoke,commit,rollback)

-----------------------------------------------
Day07-3 MySQL中數據庫的操作(DDL)

【數據庫】(DataBase):存儲數據一個倉庫

1.創建數據庫: create

語法: ? create database
例如:
create database tarena;
create database if not exists gsd1503 character set utf8;


查看當前用戶有哪些數據庫:
show databases;

查看數據庫的創建過程:
show create database tarena;

2.修改數據庫(alert)

語法: ? alter database
例如:修改數據庫的編碼
alter database tarena character set utf8;

3.刪除數據庫 //刪數據庫
語法: ? drop database

例如:
drop database tarena;
drop database if exists gsd1503;

4.打開數據庫

當使用數據庫之前需要先打開數據

use 數據庫名

例如: use tarena;

查看當前正在使用的數據庫:
select database();
----------------------------------------------
Day07-4 數據庫中表的操作(DDL)

【表】(Table)是數據庫中的最基本存儲單元,
由行和列組成,通常將行理解為記錄,將
列理解為字段或數據項。

1.【表的創建】

語法: ? create table

create table 表名(
列名 類型 [約束] [默認值],...);

例如:
創建表之前先打開數據庫: use tarena;

create table employee(
id int primary key, //id就是key值,方便查找
name varchar(100) not null,
gender enum('M','F') default 'M',
salary decimal(10,2), //10表示總位數 //2表示小數位數
email varchar(50) unique,
birthday datetime not null
);

主鍵: 為key //用來尋找定位
1)表中的一個或多個字段
2)它的值不允許為空,且必須唯一。
3)借助primary key 修飾

【查看】 //查詢數據庫 //查看數據庫
查看當前用戶有哪些數據庫: show databases;
查看數據庫的創建過程:show create database tarena;
當使用數據庫之前需要先打開數據庫:use 數據庫名
查看當前正在使用的數據庫:select database();
查看當前數據庫的表: show tables;
顯示表結構: desc employee;
簡單查詢表中數據: select * from customer; //select * from customer where id>0;
查詢所有的用戶 use mysql // select * from user;
//select Host,User,Password from user;
返回 \c

創建表時常用類型:

1) 整數類型(int,bigint,...)
2) 浮點類型(decimal,numeric,...)
3) 字符類型(char,varchar)
4) 日期類型(date,datetime,timestamp,...)
5) 其它(enum,set,blob,....)

創建表時常用約束:

1) 主鍵約束(primary key) // 為key //用來尋找定位 //1)表中的一個或多個字段 2)它的值不允許為空,且必須唯一。 3)借助primary key 修飾
2) 非空約束(not null) //不能為空
3) 唯一約束(unique) //可以沒有但有的話必須唯一
4) 外鍵約束(先不講)

例如:
create table product1(
id bigint auto_increment,
price numeric(10,2) default 0,
sex enum('M','Y','N') default 'N',
primary key (id)
) engine=InnoDB character set utf8;
//engine=InnoDB是引擎

auto_increment 表示此字段的值是可以遞增的 //自增


2.【表的修改】(了解): alter

例如,現有一張表
create table student( id int primary key);
1) 向表中添加一個字段
alter table student add name varchar(20) not null;

alter table customer modify birthday date not null;
2) 修改表中字段name為lastName
alter table student change name lastName varchar(20) not null;
3) 修改表中字段lastName的類型為varchar(100)
alter table student modify lastName varchar(100) not null;

alter table customer modify money decimal(7,2) not null;
4) 刪除表中的列(字段)
alter table student drop lastName;


3.【刪除表】 drop //刪表

語法: ? drop table

例如: drop table student;
----------------------------------------------
Day07-5 表中數據的操作(DML)
以如下表為例:
create table customer(
id int primary key auto_increment,
name varchar(100) not null,
phone varchar(20) not null unique,
email varchar(50) unique
);

1.【向表中寫入數據】(insert)

insert into customer(id,name,phone,email)
values (null,'A','139','[email protected]');

insert into customer
values (null,'B','138','[email protected]');

insert into customer
values ('A','139','[email protected]'); 錯誤

insert into customer(id,name,email)
values (null,'B','[email protected]');錯誤 phone必須給值

insert into customer(id,name,phone)
values (null,'B','133');
同時插入多條數據
insert into customer values
(null,'E','133','[email protected]'),
(null,'F','139','[email protected]');


insert into customer values
(12,'E','133','[email protected]',400.154),
(13,'F','139','[email protected]',100.12315);

2.【修改表中數據】(update)
update customer set name='AA' where id=1;

update customer set money=131215.12654 where id=1259;

update customer set name='AA',email='[email protected]'
where id=1;

3.【刪除表中數據】(delete) //刪數據

delete from customer where id=1;
delete from customer where email is null;

delete from customer;

4.【簡單查詢表中數據】(select)
select * from customer;

--------------------------------------------


mysql的編碼設置
set character_set_filesystem=utf8;
set character_set_server=utf8;
set character_set_client=utf8;


【連接數據庫】 //mysql -u lipeineng -h 172.16.7.17 -p 369
package util;
public class Config {
public static final String DRIVER="com.mysql.jdbc.Driver";
public static final String URL="jdbc:mysql://172.16.7.17:3306/test";
public static final String USER="lipeineng";
public static final String PWD="369";
}

package util;
import java.sql.Connection;
import java.sql.DriverManager;
public class JDBCUtil {
public static Connection getConnection()
throws Exception{
Class.forName(Config.DRIVER);
return DriverManager.getConnection(
Config.URL,Config.USER, Config.PWD);
}
}

Day10-5 MySQL 中的用戶管理?(了解)
【創建用戶】
1.創建用戶?(具備創建用戶的權限) //新建用戶

1)本機用戶(裝有數據庫的這台計算機登陸)

create user 'tarena'@'localhost'
identified by 'tarena123'; //tarena123是密碼

此用戶創建以後會存儲在user表中。

登陸: mysql -u tarena -h localhost -p

2)遠程用戶(可以在其它機器上訪問本機數據庫)

create user 'gsd1503'@'%'
identified by 'gsd1503';

登陸:
mysql -u gsd1503 -h 172.16.7.17 -p

2.給用戶權限?(通過root用戶登陸)
grant all on hr.* to 'gsd1503'@'%';

3.撤銷權限?(通過root用戶登陸)
revoke all on hr.* from 'gsd1503'@'%';

4.刪除用戶?(通過root用戶登陸)
drop user 'gsd1503'@'%';

5.設置root的密碼 //除了創建時可以連用戶名加密碼一起創建外,也可以後面加密碼
用root進入mysql後
方法一:
mysql>set password=password('你的密碼');
mysql>flush privileges; //沒測試過

方法二:
mysql>grant all on *.* to 'root'@'localhost' identified by '你的密碼' with grant option;
mysql>flush privileges; //沒測試過

方法三:
mysql>use mysql;
mysql>update user set password=password('你的密碼')where user='root';
mysql>flush privileges; //可以用來改其他用戶名的密碼

 


----------------------------------------------
Day10-6 MySQL 其它客戶端應用(了解)

1.Eclipse
2.MySQL Front //Host 填localhost
3.........
-----------------------------------------------

【eclipse】
eclipse快捷鍵失效錯誤;
原來是在eclipse的文本編輯器下的文本編輯模式,诶,改過來啦,到eclipse的java編輯模式,一切O了!在網上查了半天,都沒搞定的問題就是這麼細致的一個錯誤...

 

------------------------------------------------
【事務操作】
Day09-2 MySQL 中的事務操作

1.何為事務(Transaction)?

1)事務是一個不可分割的邏輯業務。
2)此業務中的所有操作是捆綁在一起的。
3)這些操作在執行時要麼都成功要麼都失敗。

2.事務的作用?
保證操作的原子性,一致性,隔離性,持久性。
即事務的四大特性:ACID

1)原子性:不可分割性,例如轉賬操作。
2)一致性:操作前後數據是一致的。(例如取錢)
3)隔離性:事務之間互不影響。
4)持久性:事務一旦提交可以持久性保存在數據庫

3.MySQL中的事務操作?

MySQL默認事務控制是自動提交方式,當執行
完一個DML語句以後事務會自動提交。

MySQL中的事務控制語句:

開啟事務:
set autocommit=0;
其中0表示手動控制事務,默認為1;

insert ...
update....

提交事務(提交以後會自動結束)
commit;

當需要撤銷某個事務時,不是執行commit,
而是執行rollback(回滾),但無論是commit,
還是rollback整個事務都會結束。


set autocommit=0;

insert ...
insert ....

rollback; (回滾,撤銷事務,這兩個insert都不會
寫到數據庫)

當需要撤銷一部分操作時,通常要在
事務中設置回滾點

set autocommit=0; (off)與其對應的就是on

insert 1
insert 2

savepoint p1; (回滾點)

insert 3,
insert 4

rollback to p1; (撤銷insert3,4操作)

commit; (insert 1,insert2 會寫到數據庫)


在實際應用中事務與業務緊密聯系在一起,
事務的控制應該在程序業務層。
-----------------------------------------------

 

【表的設計】
Day09-3 表的設計(重點,難點,了解)

1.表的設計關系
2.表的設計范式

-----------------------------------------------
Day09-4 表的關系設計

在實際應用中表關系通常有如下三種設計:
1)one2many
2)one2one
3)many2many

1.
【one2many】 (一對多)

1) 一個用戶有多個訂單。
2) 一個部門可以有很多雇員。
3) 一個國家可以有很多省份。

這樣的關系在表中如何實現?

例如:部門和雇員

create table department(
id int primary key auto_increment,
name varchar(100) not null
);
create table employee(
id int primary key auto_increment,
name varchar(100) not null,
salary int default 0,
dept_id int
);
關系的建立:

alter table employee
add foreign key(dept_id)
references department(id);

通常將這樣的一個字段稱之為外鍵.
外鍵:
1)表中的一個或多個字段
2)它的類型,值參考關系中主鍵的類型和值

向表中寫入數據:

insert department values (null,'A');
insert department values (null,'B');
insert employee values (null,'EA',100,1);
insert employee values (null,'EB',100,2);
insert employee values (null,'EC',100,1);
insert employee values (null,'EC',100,3); 錯的,沒有3

當刪除department表中數據時應首先將關系表Employee中相關聯的記錄的
外鍵設置為null,或者先刪除關聯記錄。

update employee set dept_id=null
where dept_id=1;
delete from department where id=1;

假如想刪除部門表,需要先刪除關系表
Employee中的外鍵約束

alter table employee
drop foreign key 約束名;

約束名可以采用
show create table employee
方式查看

當刪除"部門表"中數據時級聯刪除關系表"雇員表"中關聯數據,添加 //刪除用的少;
外鍵約束時,可以采用如下方式:

alter table employee
add foreign key (dept_id)
references department(id)
on delete cascade;

當刪除"部門表"中數據時級聯置空關系表"雇員表"中外鍵的值,添加 //設置為null用的比較多
外鍵約束時,可以采用如下方式:

alter table employee
add foreign key (dept_id)
references department(id)
on delete set null;

總結:對於one2many關系的實現通常要在
many的一端添加一個外鍵(FK).


2.
【one2one】 關系

一個公司只能發行一種類型股票
在達內一個學生一台電腦
.....................

one2one是一個特殊的one2many
我們只要限制one2many中的many
將其添加一個唯一約束就可以了

例如

create table company(
id int primary key,
name varchar(100) not null
);
create table stock(
id int primary key,
code varchar(50) not null unique,
cid int unique
);
alter table stock add foreign key (cid)
references company (id);

對於one2one的實現通常是:FK+UK

對於one2one關系的實現,外鍵設置在
哪一端取決於具體業務。

例如:在達內一個學生(student)
一台電腦(Computer).

create table student(
id int primary key,
name varchar(20)
);
create table computer(
id int primary key,
code varchar(20),
sid int unique
);
alter table computer add foreign key(sid)
references student (id);

3.
【Many2Many】 (多對多)

老師<-->學生
學生<-->課程
角色<-->權限

對於多對多的實現通常要借助中間表實現

學生課程關系:

create table student(
phone varchar(20) primary key,
name varchar(20) not null
);
create table course(
id int primary key,
name varchar(30) not null
);
借助中間表實現關系
create table scoretab(
sid varchar(20),
cid int,
score int,
primary key (sid,cid)
);
復合主鍵:由多個字段組成,其值的組合不能出現重復。

添加外鍵約束:
alter table scoretab add foreign key (sid)
references student (phone);

alter table scoretab add foreign key (cid)
references course (id);

總結表關系實現:
1)one2many: FK
2)one2one: FK+UK
3)many2many: 中間表

----------------------------------------------

----------------------------------------------
Day09-4 表的設計范式(重點,難點,了解)

所謂范式一般指的是設計表的應遵循的一些規則

第一范式:屬性(字段)不可再分;
例如
create table employee(
id int primary key,
name varchar(200) not null,
phone varchar(20) not null
);
假如phone表示公司電話,自己手機號,以上表的設計就不滿足第一范式。
create table employee(
id int primary key,
name varchar(200) not null,
jobPhone varchar(20),
myPhone varchar(20) not null
);
第二范式:非主屬性不能部分依賴主屬性(字段)
例如:成績表
create table scoretab(
sid int,
cid int,
score int,
cname varchar(100),
primary key (sid,cid)
);
以上表的設計是否滿足第二范式?不滿足,
cname(課程名)依賴於CID(課程ID)但不依賴於SID(學生id),應該將cname放到課程表。

第三范式:非主屬性不能依賴於非主屬性

例如:學生表
create table student(
id int primary key,
name varchar(100) not null,
schoolName varchar(200) not null,
schoolPhone varchar(20) not null
);
以上表是否滿足第三范式的設計?不滿足
存在非主屬性schoolPhone依賴於非主屬性schoolName.修改如下:

create table student(
id int primary key,
name varchar(100) not null,
schoolId int
);
create table school(
id int primary key
schoolName varchar(200) not null,
schoolPhone varchar(20) not null
);

alter table student
add foreign key(schoolId)
references school(id)
----------------------------------------------
Day09-5 深入MySQL中的查詢(重點)

准備工作:導入一些表和數據

source d:\hr_mysql.sql

以上語句表示執行某個sql文件中的sql語句

MySQL 中的查詢類型:

1) 基本查詢
2) 限制查詢
3) 排序查詢
4) 分組查詢
5) 嵌套查詢
6) 多表查詢
---------------------------------------------
Day09-1 SQL查詢(簡單查詢)

1.查詢當前日期?
select now();
其中now()為系統函數

2.查詢當前登陸用戶?
select user();
3.查詢當前正在使用的數據庫?
select database();

查看系統函數的方式: ? functions

4.查詢部門表中所有部門信息?

select * from departments;
其中"*"代表所有列。

5.查詢部門表中的部門id,部門名稱?

select id,department_name
from departments;

6.查詢雇員的名字,薪水,入職日期?
select first_name as name,salary,hire_date
from employees;

其中"name"為first_name的別名,"as"可以省略

7. 查詢每個雇員的薪水加300的值?

select employee_id,salary+300
from employees;

8. 查詢所有人的薪水總和?
select sum(salary) from employees;
其中sum函數用於求和

9.查詢公司總計有多少雇員
select count(*) from employees;
其中count函數用於統計個數。

10.查詢所有雇員的平均薪水?
select avg(salary)
from employees;
其中"avg"函數表示求平均薪水

11.查詢雇員的最高和最低薪水?
select max(salary),min(salary)
from employees;
---------------------------------------------
Day09-2 SQL查詢(限制查詢)

1.查詢薪水大於10000的雇員的名字?

select first_name,salary
from employees
where salary>10000;

2.查詢薪水大於等於10000
小於等於20000的雇員的名字,薪水?

select first_name,salary
from employees
where salary>=10000&&salary<=20000;

或者

select first_name,salary
from employees
where salary between 10000 and 20000;

3.查詢薪水等於10000或者
等於20000的雇員的名字,薪水?

select first_name,salary
from employees
where salary=10000||salary=20000;

或者

select first_name,salary
from employees
where salary in (10000,20000,30000);

4.查詢1999年入職的雇員的名字,入職日期?

select first_name,hire_date
from employees
where year(hire_date)='1999';

或者

select first_name,hire_date
from employees
where hire_date like '1999%';

其中"%"代表任意的0個或多個字符

5.查詢名字中第二個字母為A的雇員的名字

select first_name,hire_date
from employees
where first_name like '_a%';

其中"_"代表任意的一個字符。

6.查詢提成為null的雇員的名字,薪水?

select first_name,salary
from employees
where commission_pct is null;

7.查詢提成不為null的雇員的名字,薪水?

select first_name,salary
from employees
where commission_pct is not null;

8.查詢雇員表中前5條記錄中的雇員名字和薪水。

select first_name,salary
from employees
limit 5;

9.查詢雇員表中第3條到第5條記錄中的
雇員名字和薪水。

select first_name,salary
from employees
limit 2,3;

表示從>2開始取,取3條

假設現有10條記錄,每頁最多顯示3條,
總計可以分為4頁,現取第三頁:

select first_name,salary
from employees
limit 6,3;

以上這個語句經常用於分頁查詢

總頁數的計算方法:
10%3==0?10/3:10/3+1

總結:
where 子句用於設置查詢條件,一定
要寫在from子句之後,
“limit”子句用於限制返回的記錄函數,
假如出現limit要放在所有子句最後。

10.練習

1) 查詢2000年入職的員工的人數?
select year(hire_date),count(*)
from employees
where year(hire_date)='2000';
2) 計算2月份入職的員工的薪水總和?
select month(hire_date), sum(salary)
from employees
where month(hire_date)='02';

或者

select month(hire_date), sum(salary)
from employees
where hire_date like '%-02-%';

查函數: ? functions

3) 顯示傭金為空的前5條記錄中的
雇員名字,入職日期,傭金?

select first_name,hire_date,commission_pct
from employees
where commission_pct is null
limit 5;
----------------------------------------------
Day09-3 排序查詢(order by , asc|desc)

1.按入職日期升序顯示雇員的名字和薪水,入職日期相同,則薪水降序排序。

select first_name,hire_date,salary
from employees
order by hire_date asc,salary desc;

其中"asc"表示升序(可以省略),"desc"表示降序。

或者

select first_name,hire_date,salary
from employees
order by 2,3 desc
limit 10;

其中"2"和"3"表示select列表中列的序號

對於order by子句的應用上,假如沒有limit子句,它放在所有子句的最後,
且是最後執行。

2. 查詢雇員的薪水加300以後的值,並新的薪水降序排序。

select first_name,salary+300 newSalary
from employees
order by newSalary desc;

-----------------------------------------------

Day09-4 分組查詢 (group by ,having)

1.求每個部門的平均薪水?
select department_id,avg(salary)
from employees
where department_id is not null
group by department_id;
其中"group"子句用於分組

2.求每個工種的人數?
select job_id,count(*)
from employees
group by job_id;

3.求每年入職的人數?

select year(hire_date),count(*)
from employees
group by year(hire_date);

4.求部門薪水總和大於50000的部門
id和薪水總和,並按總和薪水降序排序。

select department_id,sum(salary)
from employees
where department_id is not null
group by department_id
having sum(salary)>50000
order by 2 desc;

其中"having"子句用於限制分組以後的
結果。

5.求每個部門的薪水總和,平均薪水,最大
薪水,最小薪水,人數。

select department_id,sum(salary),
avg(salary),
max(salary),min(salary),count(*)
from employees
where department_id is not null
group by department_id;
-----------------------------------------------
作業
1.總結表的設計,查詢
2.實踐練習?

1) 查詢工種的人數,平均工資。
2) 查詢1999年2月份入職的員工的名字,薪水,
並按降序排序。
3) 求平均薪水最高的那個部門的部門id?
4) 求傭金不為空的雇員的名字薪水,按傭金
降序排序。

3.預習嵌套查詢,多表查詢。
----------------------------------------------

 

 

Day10-2 MySQL 查詢(嵌套查詢)

【嵌套查詢】
1.查詢比雇員201的薪水還要高的雇員編號,
薪水。

select employee_id,salary
from employees
where salary>(
select salary
from employees
where employee_id=201);

2.求比部門50平均薪水還要高的部門平均薪水?

select department_id,avg(salary)
from employees
where department_id is not null
group by department_id
having avg(salary)>(
select avg(salary)
from employees
where department_id=50);

--------------------------------------------
Day10-3 MySQL 查詢(多表查詢)

當我們需要的數據來自多張表時可以執行
多表查詢。

1.求雇員201所在的部門的部門名稱?

select employee_id,e.department_id,department_name
from employees e,departments d
where e.department_id=d.department_id
and e.employee_id=201;

或者

select employee_id,e.department_id,department_name
from employees e inner join departments d
on e.department_id=d.department_id
where e.employee_id=201;

其中"inner join"表示內連接,"inner"可以省略,
on後寫連接條件。

2.求雇員201所在的部門的部門名稱,以及這個
部門所在城市?

select employee_id,e.department_id,department_name,city
from employees e join departments d join locations l
on e.department_id=d.department_id and
d.location_id=l.location_id
where e.employee_id=201;

3.求比本部門平均薪水還要高的雇員名字,薪水。

select first_name, e1.department_id,salary
from employees e1 join
(select department_id,avg(salary) avg_sal
from employees
where department_id is not null
group by department_id)e2
on e1.department_id=e2.department_id
where e1.salary>e2.avg_sal;

當需要將子查詢看成是一張表時,一定要給
這個表起個別名。

select first_name, e1.department_id,salary
from employees e1
where e1.salary>(
select avg(salary)
from employees e2
where e2.department_id=
e1.department_id
);

4.查詢每個雇員及這個雇員所在的部門信息?

select employee_id,e.department_id,department_name
from employees e left outer join departments d
on e.department_id=d.department_id

其中"left outer join"表示左外連接,outer
可以省略,對於左邊表而言,滿足on條件的
要顯示,不滿足on條件的也要顯示。

5.查詢每個部門及這個部門的雇員信息?

select employee_id,e.department_id,department_name
from employees e right outer join departments d
on e.department_id=d.department_id

其中"right outer join"表示右外連接,outer
可以省略,對於右邊表而言,滿足on條件的
要顯示,不滿足on條件的也要顯示。

6.笛卡爾積

select employee_id,department_name
from employees,departments

通長可以借助此數據作為測試用。

create table mytemp
as
select employee_id,department_name
from employees,departments;

-------------------------------------------
Day10-4 MySQL 中的視圖(了解)

【視圖(View)】
1.視圖(View)是什麼?
1)數據庫中的一個對象
2)虛擬的表(基於表構建,但不存儲數據)
3)對外的窗口

2.視圖的作用?

1)提高系統數據的安全。
2)簡化程序中SQL語句的編寫。

3.視圖的創建

應用1:
create view empv2
as
select first_name,salary
from employees;

執行查詢 : select * from empv2;

應用2:視圖創建以後存儲在數據庫中

create view empv3
as
select department_id,avg(salary) avg_sal
from employees
group by department_id;

執行如下查詢:

select first_name, e1.department_id,salary
from employees e1 join empv3 e2
on e1.department_id=e2.department_id
where e1.salary>e2.avg_sal;

3.視圖的刪除

drop view empv2;
----------------------------------------------
Day10-5 MySQL 中的索引(了解)

【索引(index)】
1.何為索引?(index)

假如將一張表理解為一本書,那麼書的大綱就
是表中的索引。

2.使用索引的目的?

提高查詢的速度。

3.何時使用索引?

1)經常查詢表中數據時,以某個字段作為查詢條件。
例如: select employee_id salary
from employees where first_name like '%A%'
2)表中數據量比較大,而我們需要的數據非常
少時。

4.索引的創建?
create index fname on employees(first_name);
索引創建以後在查詢時假如查詢條件中
使用到了first_name,此時會自動使用索
引。

5.索引的刪除?
drop index fname on employees;
----------------------------------------------

Day10-5 JDBC 基礎

1.JDBC 是什麼?

【JDBC】
1) Java DataBase Connectivity
2) 一組訪問數據庫的標准(API)

2.JDBC 的作用?

在Java應用程序中訪問數據庫

3.JDBC 的應用架構?

Java應用
-------------
JDBC (API)
|--->面向Java程序員(標准,java.sql.*)
|--->面向數據庫廠商(驅動程序)
--------------
MySQL,Oracle,DB2,...

4. JDBC 應用的構建步驟

1) 加載驅動程序(由廠商提供)
2) 建立連接(借助驅動程序)
3) 創建Statement(借助此對象發送SQL)
4) 發送SQL
5) 處理結果
6) 釋放資源(先打開的後關閉)

5.JDBC 中CRUD操作的實現?

1)添加記錄(C)
2)查詢記錄(R)
3)更新記錄(U)
4)刪除記錄(D)

6.JDBC中PreparedStatement對象的應用

PreparedStatement繼承Statement,
此接口的對象支持在SQL語句中使用
占位符"?"(代替SQL語句中的某字段的個值)
借助此Statement主要是為了簡化SQL
語句的編寫,防止SQL注入,提高系統安全。

說明:假如在sql語句中需要動態傳值,建
議使用PreparedStatement.

7.JDBC 中常用API?

1)DriverManager
2)Connection
3)Statement (execute,executeUpdate,executeQuery)
4)PreparedStatement
5)ResultSet //類型與Cursor相似
6).......

8.JDBC中連接對象的封裝

1)對重復編寫代碼進行提取,以簡化代碼編寫。
2)提高代碼的可維護性性。
----------------------------------------------
作業
1.總結
2.改寫留言本,將數據寫到服務端的數據庫中。
3.嘗試一個在activity直接訪問mysql數據庫的
案例。
-----------------------------------------------

 


import static util.Config.*; //導入靜態的

 

-----------------------------------------------
Day11-2 JDBC 進階 //JDBCmysql

1.JDBC 操作數據庫中的Blob字段 【修改mysql編碼方式】

在數據庫中可以借助Blob類型的字段存儲二進制數據。

1).停止mysql 服務 : net stop mysql
2).修改mysql配置文件: my.ini
將其編碼方式改為utf8;

default-character-set=utf8
character-set-server=utf8

3).重啟服務: net start mysql
4).檢測編碼: 登陸mysql以後status
5).在數據庫中創建表:(保證數據庫和表的編碼都是utf8)
use test;
create table imgtab(
id int primary key,
img longblob
)character set utf8;

2.Jdbc中元數據?

描述數據的數據。

<name>張傑</name>

其中:
張傑稱之為數據
name為描述數據的標簽:元數據


id name salary (元數據)
10 A 100000 (數據)

在JDBC中元數據對象:

1)DatabaseMetaData (通過Connection獲得)
2)ResultSetMetaData (通過ResultSet獲得)

借助元數據可以實現通用編程

-----------------------------------------------
作業
1.總結
2.完成Blob字段的讀取
3.了解元數據的應用
4.預習Android中SQLite的應用

 

【SQLite】
Day12-1 SQLite數據在Android中的應用
---------------------------------------------
1.SQLite 是什麼?

1) DBMS (數據庫管理系統)
2) 開源(輕量級)
3) 沒有獨立的進程,需要工作在用戶進程
4) 無需啟動服務
5) 通常應用在移動式電子設備中

2.SQLite 在Android中的應用?

例如:聯系人信息,記事本(便簽)

如何使用Android中的SQLite數據庫?

SQLite存儲是Android內部存儲的一種實現方式。

在Android中要從底層操作SQLite需要借助adb橋先進入Linux系統。

SQLite 需要配置環境變量 Path //D:\Android\sdk\platform-tools;

db.execSQL("CREATE TABLE IF NOT EXISTS milestone(id INTEGER PRIMARY KEY AUTOINCREMENT, distance INTEGER,
longitude DOUBLE, latitude DOUBLE,startlongitude DOUBLE,startlatitude DOUBLE,
orderStartTime DATETIME,orderEndTime DATETIME, //時間 就是以字符串的格式存入
orderID varchar(20) )");

SimpleDateFormat sdFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date nowTime1 = new Date(System.currentTimeMillis());
String startTime = sdFormatter.format(nowTime1);

【功能】
adb shell (進入linux系統) //要先開安卓虛擬機
ls (顯示linux系統當前的目錄結構)
cd (切換到某個目錄)
.exit(退出linux系統)

在android 系統目錄中借助SQLite3命令創建SQLite數據庫

cd data/data/com.example.day051302.databases //記得進入databases數據庫目錄 //要分開一步一步進

【創建或打開數據庫】
sqlite3 test.db (創建或打開test.db數據庫)

【顯示所有的表】
.tables //顯示所有的表

【新建表】
create table test01(
id integer primary key,
content varchar(100));

【插入數據到表中】
insert into test01 values (1,'CA');
insert into note values (20,'CA','2015-5-16 08:16:50');
db.insert("note",null, values);
【查詢表中的數據】
select * from test01;
db.query("userpeople", new String[]{"phone","password"}, "phone=?", new String[]{phoneEt}, null, null, null);
query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy);
public Cursor queryWhere(String content){ // ? 用字符串數組表示,比如new String[]{"%"+content+"%"} //【問號】
//打開數據庫
db=dbHelper.getReadableDatabase();
//執行查詢
String sql= "select _id,content,noteDate from note " + "where content like ? order by noteDate desc ";
return db.rawQuery(sql, new String[]{"%"+content+"%"});
}

//Uri dataUri=Uri.parse("content://com.android.contacts/data");
Uri dataUri=Data.CONTENT_URI;
String[] cols=new String[]{
Data._ID, //0
Data.MIMETYPE, //1
Data.RAW_CONTACT_ID, //2
Data.DATA1, //3
Data.DATA15 //4
};
Cursor c2=r.query(dataUri, cols, Data.RAW_CONTACT_ID+"="+id, null, null);
public final Cursor query(Uri uri, String[] projection,String selection, String[] selectionArgs, String sortOrder)

【Uri】
[scheme:]scheme-specific-part[#fragment]
[scheme:][//authority][path][?query][#fragment]
[scheme:][//host:port][path][?query][#fragment]

http://www.java2s.com:8080/yourpath/fileName.htm?stove=10&path=32&id=4#harvic

scheme: 匹對上面的兩個Uri標准形式,很容易看出在:前的部分是scheme,所以這個Uri字符串的sheme是:http
scheme-specific-part: 很容易看出scheme-specific-part是包含在scheme和fragment之間的部分,也就是包括第二部分的[//authority][path][?query]這幾個小部分,所在這個Uri字符串的scheme-specific-part是://www.java2s.com:8080/yourpath/fileName.htm?stove=10&path=32&id=4 ,注意要帶上//,因為除了[scheme:]和[#fragment]部分全部都是scheme-specific-part,當然包括最前面的//;
fragment: 這個是更容易看出的,因為在最後用#分隔的部分就是fragment,所以這個Uri的fragment是:harvic
下面就是對scheme-specific-part進行拆分了;
scheme-specific-part中, 最前端的部分就是authority,?後面的部分是query,中間的部分就是path
authority: 很容易看出scheme-specific-part最新端的部分是:www.java2s.com:8080
query: 在scheme-specific-part中,?後的部分為:stove=10&path=32&id=4
path: 在**query:**在scheme-specific-part中,除了authority和query其余都是path的部分:/yourpath/fileName.htm
又由於authority又一步可以劃分為host:port形式,其中host:port用冒號分隔,冒號前的是host,冒號後的是port,所以:
host: www.java2s.com
port: 8080

代碼提取
getScheme() :獲取Uri中的scheme字符串部分,在這裡即,http
getSchemeSpecificPart():獲取Uri中的scheme-specific-part:部分,這裡是://www.java2s.com:8080/yourpath/fileName.htm?
getFragment():獲取Uri中的Fragment部分,即harvic
getAuthority():獲取Uri中Authority部分,即www.java2s.com:8080
getPath():獲取Uri中path部分,即/yourpath/fileName.htm
getQuery():獲取Uri中的query部分,即stove=10&path=32&id=4
getHost():獲取Authority中的Host字符串,即www.java2s.com
getPost():獲取Authority中的Port字符串,即8080

另外還有兩個常用的:
List< String> getPathSegments():上面我們的getPath()是把path部分整個獲取下來:/yourpath/fileName.htm,getPathSegments()的作用就是依次提取出Path的各個部分的字符串,以字符串數組的形式輸出。以上面的Uri為例:
[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
String mUriStr = "http://www.java2s.com:8080/yourpath/fileName.htm?stove=10&path=32&id=4#harvic";
Uri mUri = Uri.parse(mUriStr);
List<String> pathSegList = mUri.getPathSegments();
for (String pathItem:pathSegList){
Log.d("qijian","pathSegItem:"+pathItem);
}
打出來的列表為:
pathSegItem:yourpath
pathSegItem:fileName.htm

getQueryParameter(String key):在上面我們通過getQuery()獲取整個query字段:stove=10&path=32&id=4,getQueryParameter(String key)作用就是通過傳進去path中某個Key的字符串,返回他對應的值。
[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
String mUriStr = "http://www.java2s.com:8080/yourpath/fileName.htm?stove=10&path=32&id#harvic";
mUri = Uri.parse(mUriStr);
Log.d(tag,"getQueryParameter(\"stove\"):"+mUri.getQueryParameter("stove"));
Log.d(tag,"getQueryParameter(\"id\"):"+mUri.getQueryParameter("id"));
注意注意,我稍微更改了下字符串,把query中id的值去掉了!!!!!然後看看通過getQueryParameter("id")獲取它的值會得到什麼!
結果如下:
getQueryParameter("stove"):10
getQueryParameter("id"):
可以看到,在path中,即使針對某一個KEY不對它賦值是允許的,但在利用getQueryParameter()獲取該KEY對應的值時,獲取到的是null;

 

 

 

 

 


【退出】
.exit(退出SQLite)

SQLite
【刪除數據庫】
在安卓中 //主體中
this.deleteDatabase("lipei.db");
在安卓中 //不在主體內,要有context才行
context.deleteDatabase("neng.db");
在dos命令中 //不要進入(sqlite3 test.db)數據庫內,在數據庫外進行刪除 cd data/data/com.example.day051302.databases
rm ****.db

【查表結構】
pragma table_info('note'); //note是表的名字

【修改表中數據】
通用方法
db.execSQL(" update note set _id=4 where _id=12");
專用
db.update("note", cv, "_id=?", new String[]{"2"});
源代碼
update(String table, ContentValues values, String whereClause, String[] whereArgs)
表名字 鍵值對(可添加多個) 當什麼時候引起 什麼時候
cv.put("content", ettext);

【刪除表中的數據】
public void delete(String id){
//打開數據庫
db=dbHelper.getWritableDatabase();
//刪除數據
db.delete("note", "_id=?", new String[]{id} );

//String sql="delete from note where _id=?";
//db.execSQL(sql, new Object[]{id});
//關閉數據庫
db.close();

}

3.在Android中使用SQLite常用API
1)SQLiteDatabase (數據庫對象)
|--->此對象如何獲得?
2)SQLiteOpenHelper (工具類)
|--->此類如何應用?
-----------------------------------------------

【數據庫可視化】
SQLiteSpy.exe

 

new Android layout XML File


【UI簡介】
Day13-Android UI簡介
----------------------------------------------
1.何為UI?

User Interface (用戶接口)

對於接口這個概念,在it行業有兩個層面的意思?

1)用戶與系統之間的接口(User Interface)
2)系統與系統之間的接口(interface IA{})

在Android中負責與用戶進行交互的UI,通常可以理解為View.

何為View 呢?

Android 中所有看的到一切組件對象都是
view.

2.Android 中的UI?

Android中的UI主要是借助View及View的子類實現。

View 的分類:
1)基礎View(TextView,EditText,Button,ImageView,....)
2)容器View(繼承ViewGroup)
|-->LinearLayout,RelativeLayout
|-->GridLayout,FrameLayout,TableLayout
|-->ListView,GridView,Spinner,.......

3.Android中ListView(列表視圖)組件的應用?
1) ListView 是什麼?
a) 是一個ViewGroup(特殊的view)?
b) 是一個列表組件(以列表的形式顯示數據)?

2)ListView 的應用場合?
a)天貓商品列表
b)微信好友列表
c)新聞列表

3)ListView 構成分析?

a) ListView 容器
b) Item 列表項目(item布局+數據)
c) Adapter(適配器)

4)ListView 是實現原理?

ListView在顯示數據時主要是借助Adpater將數據源中的數據以及item布局構建成Item
對象,然後將item對象放到ListView中顯示。

5)ListView應用的實現?
a)基本步驟
b)添加監聽器
c)設置選擇模式(3種)
d)刪除ListView中的選項?


Day14-1 內容回顧
----------------------------------------------
1.ListView 是什麼?
2.ListView 的應用場合?
3.ListView 的構成分析?(基本構成要素)
4.ListView 的實現原理分析?
5.ListView 應用的構建?
1)基本構建過程
2)事件處理
3)選擇模式設置
4)刪除ListView內容
5)ListView的更新(調用adapter的notify....)
6)擴展(選項菜單 Menu)
7).............................
6.常用Adapter分析
1)ArrayAdapter (數組或List<T>)
2)SimpleAdapter (數據源List<Map<String,Object>>)
3)SimpleCursorAdapter (數據源 Cursor)
4)BaseAdapter(基類,抽象類)
當官方提供的adapter不能滿足我們的數據
要求是我們可以自己定義adapter,
-----------------------------------------------


1)數據庫(SQLite)
2)Cursor
3)ListView (SimpleCursorAdapter)

--------------------------------------------
作業
1.總結
2.實現一個自定義Adapter,顯示List<Contacts>
集合中的數據?(Day14_listview_6(BaseAdapter))
3.航空列表頁面排序操作實現?
-------------------------------------------


【ListView優化】
Day15-1 ListView優化
-----------------------------------------------
1.重用適配器getView方法中的ConvertView參數對象

covertView對象是被移出的item對象(列表項目)。

if(convertView==null){
convertView=構建view item;
}

2.減少適配器getView方法中findViewById的執行
次數?

添加ViewHolder對象,借助此對象保存convertView
對象中子元素對象的地址。

3.按需加載數據(分頁加載)
1)每頁只加載一頁數據(工作線程)
|-->何時去加載?
2)每次加載都需更新ListView

4.緩存數據(尤其是圖片);

1)第一次讀取網絡中圖片
2)將圖片緩存到本地SDCARD(寫)
3)下一次讀取圖片先讀sdcard
-----------------------------------------

 

 

 

--------------------------------------------
【分塊顯示】
Day16-2 Listview 分塊顯示

1.場合?
1)數據量比較小
2)數據一次加載完成

2.實現?

1) 讓adapter實現接口SectionIndexer
2) 重寫相關方法
a)getPositionForSection(int sec)
b)getSectionForPosition(int pos)
c)getSections

案例:

position key section
0 A 65
1 A 65
2 B 66
3 C 67
4 C 67
getPositionForSection(66)=2
getPositionForSection(67)=3
getSectionForPosition(0)=65
getSectionForPosition(1)=65

----------------------------------------------
Day16-2 Listview 右邊導航顯示

1.思路?

1)在右側再添加一個ListView
2)在ListView中添加監聽器,當
點擊某個key時定位到聯系人列表的某個位置。

2.實現?

1) key是有序的嗎?是
2) key允許重復嗎?不允許

Key的獲得方式?
1) 個數不固定(key由聯系人的名字獲得)
2) 個數固定(將26個字母全部放置在listview中)
-----------------------------------------------
Day16-3 ListActivity 的應用

在此Activity中默認提供了一個ListView,在編寫Activity時可以繼承ListActivity,
直接使用其中的ListView,可以簡化簡單listview應用的編寫。

class MainActivity extends ListActivity{

}
---------------------------------------------
Day16-4 ExpandableListView 的應用(作業)

ExpandableListView 是一個特殊ListView可以對ListView中的內容實現分組顯示,
顯示效果類似手風琴。其實現原理類似ListView.

具體實現:
仿照官方API demos中view包下的
ExpandableList1.java
ExpandableList2.java
ExpandableList3.java
-------------------------------------------
作業
1.自己實現ExpandableListView 的實現
2.自己實現一個AutoCompleteTextView?
3.自己實現一個Spinner?(下拉列表)
4.自己實現一個GridView(網格視圖)

學會看:APIDemos
--------------------------------------------


Day18-1 內容回顧(類似ListView組件的應用)
-----------------------------------------------
1.ExpandableListView (擴展ListView)
2.AutocompleteTextView(自動完成)
3.Spinner (下拉列表)
4.GridView(網格視圖)

擴展:圖片壓縮顯示,Bitmap位圖對象
-----------------------------------------------
Day18-2 滾動視圖的應用

1.垂直滾動(ScrollView)
2.水平滾動(HorizontalScrollView)

【bitmap】
//把bitmap轉成byte[],返回一個地圖的String模式,發送地圖的String,
btnSend.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
if (mapView.getVisibility() == View.VISIBLE) {// 發地圖
baiduMap.snapshot(new SnapshotReadyCallback() {
@Override
public void onSnapshotReady(Bitmap bitmap) {
try {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
bitmap.compress(CompressFormat.PNG, 30,
byteArrayOutputStream);
body = ChatUtil
.addImageTag(byteArrayOutputStream
.toByteArray());
sendMessage(body);
mapView.setVisibility(View.GONE);
} catch (Exception e) {
// TODO: handle exception
}
}
});
} else {// 發文本
body = etBody.getText().toString();
etBody.getText().clear();
sendMessage(body);
}
} catch (Exception e) {
ExceptionUtil.handleException(e);
}
}
});

Day18-1 內容回顧(類似ListView組件的應用)
-----------------------------------------------
1.ExpandableListView (擴展ListView)
2.AutocompleteTextView(自動完成)
3.Spinner (下拉列表)
4.GridView(網格視圖)

擴展:圖片壓縮顯示,Bitmap位圖對象
-----------------------------------------------
Day18-2 滾動視圖的應用

1.垂直滾動(ScrollView)

2.水平滾動(HorizontalScrollView)

-----------------------------------------------
Day19-3 選擇框視圖對象

1.CheckBox (復選框)
2.RadioButton(單選框):通常放到RadioGroup中

1)實現單選
2)實現底部菜單

擴展:狀態選擇器(selector)-->
對應drawable目錄中的xml文件

<RadioButton
android:textColor="@drawable/selector...."
android:drawableRight="@drawable/selector...">

selector中的item可以是自己繪制的圖形(shape),
圖形可以對應一個xml文件(根標簽是shape)

Selector

View--->Sector.xml(聲明狀態)--->shape.xml(繪制圖形)
-----------------------------------------------

 


Day19-1 內容回顧
----------------------------------------
1.滾動視圖
1)垂直(ScrollView)
2)水平 (HorizontalScrollView)
2.選擇視圖
1)單選 (RadioButton,RadioGroup)
2)復選 (CheckBox)
3.選擇器(xml)的應用
1)Selector (設定item狀態)
2)Shape (繪圖)
選擇器可以使view對象在不同狀態顯示不同
效果。

記住:對於一個view而言我們在學習時主要
從如下幾個方面著手:
1)此View 是什麼?
2)表現形式是怎樣的?
3)應用場合?
4)此View對象如何構建?(屬性,方法)
5)此View對象上的常用監聽器?
---------------------------------------------
Day19-2 菜單的應用?


【菜單】
1.選項菜單(Option Menu)

1)重寫onCreateOptionsMenu創建選項菜單
2)重寫onOptionsItemSelected處理菜單項
點擊事件

2.子菜單(SubMenu)
Java實現:調用Menu.addSubMenu方法。

3.上下文菜單(Context Menu)
此類型菜單的實現需要在view對象上進行注冊
,一般是長按某個view時,彈出菜單。

1)重寫此方法onCreateContextMenu
2)注冊上下文菜單:registerForContextMenu(view)
3)重寫activity中的onContextItemSelected
方法,處理上下文菜單項的點擊事件

4.彈出式菜單(PopuMenu):

參考APIDemos

所有的菜單都是Menu,在Menu中可以放
item(菜單項),此菜單項對象的構建有兩
種方式,一種是由底層框架解析xml,通
過反射構建,一種形式是我們自己通過Java
代碼構建。
--------------------------------------------


Day20-2 對話框的應用

【對話框】
1.AlertDialog(提示對話框)
2.ProgressDialog(進度對話框)
|-->ProgressBar
SeekBar,
RatingBar
3.DatePickerDialog(日期對話框)
4.TimePickerDialog(時間對話框)

------------------------------------------------
Day20-3 自定義view
【自定義view】

當官方給的view不能完全滿足我們需求時,
我們可以自己定義一些view,我們自己定義
的view都會直接或間接的繼承View類,需
要重寫view中的onDraw方法?

Android中UI實現?
1.Android view組件
2.HTML5

自定義View:
class MyView extends View{}
class MyView extends EditText{}
class MyView extends LinearLayout{}

-----------------------------------------------
【在onClick時不匹配時報錯,邊框變色】
textview.setBackgroundResource(R.drawable.ic_l); //自己新建selector和shape

 

 

 


Day21-1內容回顧
----------------------------------------------
1.對話框(Dialog)

1)AlertDialog //對話框例子 http://www.cnblogs.com/Gaojiecai/archive/2011/12/10/2283156.html
2)ProgressDialog
a)ProgressBar
b)SeekBar
c)RatingBar
3)DatePickerDialog
a)DatePicker
b)TextClock
4)TimePickerDialog
b)TimePicker

2.自定義的View

自定義view直接或間接的繼承view
,重寫onDraw方法。

class CircleView extends View{}

class MyEditText extends EditText{}

----------------------------------------------
Day21-2 ViewPager 組件的應用
【ViewPager】
ViewPager的實現原理類似ListView.

可以將ViewPager理解為一個容器(Container)
,此容器中可以存儲多個item,每個item對象
的構建需要借助Adapter對象(PagerAdapter)。

ViewPager定義在
android.support.v4.view 包中。

 

 


【刪除view】
layout.removeView(viewPager);

 

【讓banner條自動滾動】
private boolean isScroller=true;
public void setBannerScroller(){
final Handler h=new Handler();
h.postDelayed(new Runnable() {
@Override
public void run() {
if(viewPager.getCurrentItem()==imgs.length){
viewPager.setCurrentItem(0);
if(!isScroller)return;
h.postDelayed(this, 3000);
}else{
viewPager.setCurrentItem(viewPager.getCurrentItem()+1);
if(!isScroller)return;
if(viewPager.getCurrentItem()==imgs.length){
h.postDelayed(this, 1);
}else {
h.postDelayed(this, 3000);
}
}
}
}, 5000);
}

 


Day22-1 Activity
---------------------------------------------
1.Activity 是什麼?

1)Android 四大核心組件之一,作為組件的表現是它的生命周期方法(例如onCreate,onDestory)

2)Android 中的控制器(Controller)
例如記事本:

View
----------------------
Activity (setContentView)
|-->接收view中的數據
|-->對view中的數據進行驗證
|-->將數據交給業務model(DBcontext)
----------------------
DBContext(借助此類訪問數據庫)
----------------------
DB(數據庫)

以上模型為MVC架構模式的一種體現
V:View (負責顯示邏輯)
C:Controller (負責控制邏輯)
M:Model (負責業務邏輯的處理)

3)Android中的Context(上下文對象),作為Context的一種表現是具備強大的資源訪問
能力。(例如SDCARD,項目中資源)

context.getResources().....

4)不是Android中的view.

Activity中包含一個window對象(PhoneWindow),在此窗口中可放一些其它的view對象。

2.Acitivity 類的編寫及對象的創建

1)編寫
class BaseActivity extends Activity{}
class MainActivity extends BaseActivity{}

2)注冊

我們每個Activity都需要在AndroidManifest.xml文件中進行注冊。

<activity android:name="包名.類名"/>

3).對象的構建

Activity對象的構建由底層框架(AF)構建?
1)解析AndroidManifest.xml
2)通過反射構建Activity的對象。
Class.forName("包名.類名").newInstance()
說明:在我們寫的activity中要提供一個無參的構造函數。

Android 官方:Google(提供AF,標准)
Android 廠商:企業(提供APP,標准的實現)

3.Activity對象的生命周期?

Activity對象的生命周期指的是對象從創建,初始化,服務,銷毀這個過程所經歷的幾個階段。

Activity對象從創建到銷毀每個狀態都有其對應的生命周期方法,在生命周期
方法中我們可以根據業務的不同,執行不同的業務處理。

1)onCreate()
2)onStart()
3)onRestart()
4)onResume()
5)onPause()
6)onStop()
7)onDestory()

onFinishInflate() 當View中所有的子控件均被映射成xml後觸發
onMeasure(int, int) 確定所有子元素的大小
onLayout(boolean, int, int, int, int) 當View分配所有的子元素的大小和位置時觸發
onSizeChanged(int, int, int, int) 當view的大小發生變化時觸發
onDraw(Canvas) view渲染內容的細節
onKeyDown(int, KeyEvent) 有按鍵按下後觸發
onKeyUp(int, KeyEvent) 有按鍵按下後彈起時觸發
onTrackballEvent(MotionEvent) 軌跡球事件
onTouchEvent(MotionEvent) 觸屏事件
onFocusChanged(boolean, int, Rect) 當View獲取或失去焦點時觸發
onWindowFocusChanged(boolean) 當窗口包含的view獲取或失去焦點時觸發
onAttachedToWindow() 當view被附著到一個窗口時觸發
onDetachedFromWindow() 當view離開附著的窗口時觸發,Android123提示該方法和 onAttachedToWindow() 是相反的。
onWindowVisibilityChanged(int) 當窗口中內容的可視性在 GONE 、 INVISIBLE 和 VISIBLE 之間變更時調用

【onTouchEvent】
//onTouchListener的onTouch方法優先級比onTouchEvent高,會先觸發。
//假如onTouch方法返回false會接著觸發onTouchEvent,反之onTouchEvent方法不會被調用。
//內置諸如click事件的實現等等都基於onTouchEvent,假如onTouch返回true,這些事件將不會被觸發。

onTouchEvent中要處理的最常用的3個事件就是:ACTION_DOWN、ACTION_MOVE、ACTION_UP。
這三個事件標識出了最基本的用戶觸摸屏幕的操作,含義也很清楚。雖然大家天天都在用它們,但是有一點請留意,ACTION_DOWN事件作為起始事件,它的重要性是要超過ACTION_MOVE和ACTION_UP的,如果發生了ACTION_MOVE或者ACTION_UP,那麼一定曾經發生了ACTION_DOWN。
從Android的源代碼中能看到基於這種不同重要性的理解而實現的一些交互機制,SDK中也有明確的提及,例如在ViewGroup的onInterceptTouchEvent方法中,如果在ACTION_DOWN事件中返回了true,那麼後續的事件將直接發給onTouchEvent,而不是繼續發給onInterceptTouchEvent。

一次完整的事件流程處理: //Intercept 攔截 //dispatch 分派
android系統中的每個View的子類都具有下面三個和TouchEvent處理密切相關的方法:
1)public boolean dispatchTouchEvent(MotionEvent ev) 這個方法用來分發TouchEvent
2)public boolean onInterceptTouchEvent(MotionEvent ev)這個方法用來攔截TouchEvent
...只有ViewGroup才有onInterceptTouchEvent()方法,因為最小單位的View不具備再往下派發事件的能力,它只會直接調用自己的onTouch()和onTouchEvent()方法。
3)public boolean onTouchEvent(MotionEvent ev)這個方法用來處理TouchEvent
當TouchEvent發生時,首先Activity將TouchEvent傳遞給最頂層的View,
TouchEvent最先到達最頂層 view的 dispatchTouchEvent,然後由 dispatchTouchEvent方法進行分發,
如果dispatchTouchEvent返回true,則交給這個view的onTouchEvent處理,
如果 dispatchTouchEvent返回 false,則交給這個 view的 interceptTouchEvent方法來決定是否要攔截這個事件,
如果 interceptTouchEvent返回 true,也就是攔截掉了,則交給它的onTouchEvent來處理,
如果 interceptTouchEvent返回 false,那麼就傳遞給子 view,由子 view 的dispatchTouchEvent再來開始這個事件的分發。
如果事件傳遞到某一層的子 view的 onTouchEvent上了,這個方法返回了 false,那麼這個事件會從這個 view往上傳遞,都是onTouchEvent來接收。
如果事件傳遞到某一層的子view的onTouchEvent上了,這個方法返回true,那麼這個事件將不會向上傳遞了,又這個view攔截處理.
而如果傳遞到最上面的 onTouchEvent也返回 false的話,這個事件就會“消失”,而且接收不到下一次事件
在沒有重寫onInterceptTouchEvent()和onTouchEvent()的情況下(他們的返回值都是false), 對上面這個布局,MotionEvent事件的傳遞順序如下:
當某個控件的onInterceptTouchEvent()返回值為true時,就會發生截斷,事件被傳到當前控件的onTouchEvent()。
如我們將LayoutView2的onInterceptTouchEvent()返回值為true,則傳遞流程變成:
如果我們同時將LayoutView2的onInterceptTouchEvent()和onTouchEvent()設置成true,那麼LayoutView2將消費被傳遞的事件,
同時後續事件(如跟著ACTION_DOWN的ACTION_MOVE或者ACTION_UP)會直接傳給LayoutView2的onTouchEvent(),不傳給其他
任何控件的任何函數。同時傳遞給子空間一個ACTION_CANCEL事件。傳遞流程變成(圖中沒有畫出ACTION_CANCEL事件):


【啟動模式】
4.Activity 對象的啟動模式(四種)

其中模式的配置一般在AndroidManifest.xml
中的activity標簽中進行配置。

android:launchMode="模式"

1)standard (每次都會創建一個新的activity)//這種啟動模式,退出時直接退出,不會黑屏

啟動:
ActivityA--->ActivityB--->ActivityA
任務棧:
ActivityA
ActivityB
ActivityA

2)singleTop(當activity處於棧頂時不再創建Activity)

啟動:
ActivityA--->ActivityB-->ActivityB
任務棧:
ActivityB
ActivityA

3)singleTask(一個任務棧只能有一個Activity)
啟動:
ActivityA--->ActivityB-->ActivityC-->ActivityA
任務棧
ActivityC 銷毀
ActivityB 銷毀
ActivityA 啟動
一般會將首頁設置為SingleTask模式
還有一般的浏覽器也會設置為此模式

4)singleInstance(此activity獨占一個任務棧) //這種啟動模式,退出時會黑屏

啟動:
ActivityA--->ActivityB(singleInstance)

任務棧A: ActivityA
任務棧B: ActivityB (獨立的占有一個任務棧)

例如:撥號程序應該是一個SingleInstance

5.Activity 狀態信息保存

保存的位置:內存,外存
保存的時機:Activity正在離開可視范圍。
保存的方法:onSaveInstance
|-->保存到bundle對象中
|-->保存到文件(SharedPreferences)或者sqlite數據庫
恢復的方法:onCreate或者onRestoreInstanceState

6.Activity 之間數據的傳遞?

一般要借助intent對象。

Intent intent=new Intent(this,XXXActivity.class);
intent.putExtra(.....)
startActivity(intent);
//=====
假設需要從被啟動的Activity回傳數據

startActivityForResult(.....) //setResult在什麼時候調用?

在startActivityForResult搜索啟動一個activity的時候調用。
比如A activity以startActivityForResult方式啟動一個B activity。當B activity setResult的時候,A activity 的onActivityResult()
回調函數就會響應該事件。不知是否明白,不明白再繼續追問。也可以百度一下startActivityForResult用法
在本Activity重寫onActivityResult接收回傳的數據

 

----------------------------------------------
Day22-2 Fragment (碎片,片段)

【Fragment】
1.Fragment是什麼?(Android3.0)

Fragment是Activity中模塊化組件,其生命周期
依托於Activity.一般用於動態的更新Activity中的
內容.

2.Frament類的編寫及應用?

1)所有的Fragment都直接或間接的繼承Fragment
2)編寫好的Fragment無需到清單配置文件注冊,
但需要添加到Activity中顯示。

3.預習Fragment對象
-----------------------------------------------

 

Day23-1 項目概要
---------------------------------------------
1.功能需求?
1) 歡迎頁面
2) 新手指導
3) 系統主頁
4) 航班查詢
5) 航班列表
6) 航班動態
7) 個人信息
8) ......

2.系統架構

1)整體架構:C/S架構 (服務端數據聚合數據)
2)局部架構:MVC

3.代碼約束

包的定義: //包的命名規則

1)所有的activity存儲在:
com.company.gars.activity 包中
2)所有的業務相關定義在
com.company.gars.model包中
3)所有的自定義view定義在
com.company.gars.view包中
4).所有的工具類都定義在
com.company.gars.util包中

類名的定義:

1)Activity: XXXActivity
2)View: XXXView
3)Model: XXXService
4)util:XXXUtil
5)Adapter:XXXAdapter
.....

變量名,常量名,方法名等都要遵循標識符的定義

項目名稱:GSD1503GARS01

4.代碼實現
-----------------------------------------------
Day23-2 歡迎頁面

1.功能需求?

1)系統啟動第一個頁面,啟動模式為標准模式,
默認停留5秒。
2)此頁面全屏顯示,且豎屏顯示。
3)5秒以後,根據系統使用狀態進入下
一個頁面。不能返回。
4)顯示系統版本信息。(參考GARSV02)
5)頁面上添加一個滾動條(無進度顯示),
表示頁面正在加載。也可選擇添加
動畫。
6)圖片顯示時,是經過壓縮處理的,
壓縮比例應該適配屏幕尺寸。
圖片應該來自網絡(先不實現)
7)圖片上添加點擊事件。
8)檢測版本更新(聯網狀態)

2.代碼實現????????


----------------------------------------------
Day23-3 新手指導頁面

1.功能需求
1) 第一次使用系統,進入此頁面,屏蔽回退操作。
2) 此頁面豎屏,全屏顯示,啟動模式為標准模式
3) 頁面可以分頁顯示,頁面上要有頁面指示器
4) 最後一頁要有按鈕,點擊按鈕進入主頁
5) 進入主頁以後不能返回(關閉當前頁面)
6) ........

2.代碼實現?

技術要求:ViewPager+fragment


【so文件】【jar包】【預設】
預置的app系統不會給你安裝so文件,如果你的app需要用到so文件,需要自己打包到/system/lib/目錄;
非預置的app系統會提取到你應用的私有目錄的lib目錄下。
至於jar文件,並不存在安裝到哪裡這一說法,要麼是已經打包在apk裡面,要麼在/system/framework目錄
/system/framework目錄的都是系統預置的,你不用管
你eclipse導入jar包時(Build Path-&gt;Configure Build Path...-&gt;Order And Export)那一頁,
要是打勾就包含在apk裡,否則不包含
編譯好的Apk內有so文件,但是沒有jar包。jar包應該是已經編譯進代碼中了

提問::::當初我做一個項目,海爾電視,使用了對方提供的jar包之後,這兒(Order And Export)也沒有勾選,但是也可以調用對方的方法,為什麼?
我自己的答案:應該是因為海爾電視本地/system/framework就有這個jar包,所以即使我們的app內沒有這個jar包也可以調用海爾電視的方法。

提問::::系統預設了movie之後,我再手動安裝了一個movie更新,系統會從apk內提取了so文件,但是這個so文件還是以前的,
為什麼還是可以解析電影(只有system/lib目錄中最新的的so文件才可以解析),難道system/lib中的so文件的優先度比較高?
答:只有在系統預設了movie之後,才會優先使用system/lib目錄的so文件,
在系統沒有預設movie的情況下,系統會優先使用data目錄中的so文件

 

【設置版本信息】 //設置APP版本信息
private void setVersionCode(){
//獲得PackageManager,
//可以借助此對象讀取配置文件(AndroidManifest.xml)
//中的版本信息。
PackageManager pm=getPackageManager();
try{
PackageInfo pi=
pm.getPackageInfo(getPackageName(),0); //填0就可以了
TextView tv=
(TextView)findViewById(R.id.versionText);
tv.setTextColor(Color.RED);
tv.setText("版本:"+pi.versionName);
Log.i("TAG", "pi.versionName="+pi.versionName);
}catch(Exception e){
e.printStackTrace();
}
}

【設置返回按鈕】
<activity
android:name="com.company.gars.activity.BookTicketActivity"
android:label="@string/title_activity_book_ticket"
android:parentActivityName="com.company.gars.activity.MainActivity" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.company.gars.activity.MainActivity" />
</activity>

 

 


【ViewPager】
用了ViewPager,就要用support.v4,沒用就可以用app.

【跳轉到百度】
// Intent intent = new Intent();
// intent.setAction("android.intent.action.VIEW");
// Uri uri = Uri.parse("http://www.baidu.com");
// intent.setData(uri);
// startActivity(intent);


------------------------------------
【第三位老師】
徐銘
[email protected]
15201603213


【TOMCAT】
【tomcat】
導入mysql的鏈接驅動時,直接放在lib裡,不用新建libs,也不用進行build path

tomcat的目錄結構
bin: 存放tomcat運行時需要的可執行程序。
startup.sh
startup.bat
shutdown.sh
shutdown.bat

conf: tomcat運行時所需要的一些配置文件。
注意: server.xml 可以設置tomcat的端口號。

lib: tomcat運行時所需要的jar包。

logs: tomcat運行時輸出的日志信息。

webapps:
tomcat的應用程序部署目錄。所有的web
服務應用都在這個文件夾下(默認)


通過網絡如何訪問tomcat管理的web服務端應用?
1> 在本地啟動tomcat服務
192.168.188.40:8080
配置JAVA_HOME環境變量
避免8080端口沒有被占用

2> 打開浏覽器,輸入請求地址,格式如下:
http://192.168.188.40:8080/應用名稱/訪問路徑

http://192.168.188.40:8080/docs/index.html
http://localhost:8080/docs/index.html


鸬絫omcat/webapps中。
3> 啟動tomcat,打開浏覽器訪問相應地址。

http://localhost:8080/downloads/lml.zip


如何編寫一個動態的服務端程序?(帶有業務邏輯)


服務端JSP文件的執行流程:
1>浏覽器發送Http請求,訪問一張jsp頁面:
http://localhost:8080/day01/index.jsp
2>tomcat接收該請求,尋找是否含有相同名稱的jsp如果沒有,則404.
3>如果找到該jsp文件,tomcat會尋找該jsp文件生成的.java文件,並且自動運行該類中的_jspService方法。
4>service方法裡,tomcat將會把我們寫在jsp裡的文本內容使用out.write方法輸出。
5>tomcat將會把這些需要輸出的內容封裝http響應數據包返回給客戶端。
6>浏覽器接收該響應數據包後,解析響應數據並且呈現頁面。


JSP的組成部分:
1>JSP指令
<%@page language="java"
contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
contentType:
向客戶端指明jsp返回的數據格式與編碼。
pageEncoding:
tomcat生成.java文件時所使用的編碼。

2>Java代碼片段
JSP的本質就是一個Java類,所以我們可以在jsp文件中編寫java代碼。
<%%>
在<%%>中的代碼,tomcat將會原封不動的輸出到
.java類文件中,這樣我們可以在jsp文件中輸出一些
動態的數據,非常方便。

3>普通的文本
tomcat將會通過out.write方法把這些字符串輸出給客戶端。

4>JSP表達式 (用於輸出java變量)
<%=%>
tomcat將會在相應的位置輸出這些變量的值。


模擬返回XML:
<flights>
<flight id="">
<name></name>
<startDate></startDate>
</flight>
</flights>

【導出】
把eclipse中的web服務端應用打包。
右鍵項目--->export --> 搜索war--->選擇目標目錄 --> ok

把war包部署到tomcat的wabapps文件夾中,然後重新啟動tomcat,重新訪問。


【mysql中】
【為了讓名字可以顯示的不是亂碼】
set names gbk;

【web文件】
老師給的web文件,我們的電腦配置不一樣,所以無法使用,要把老師的web文件中的WebContent和src文件復制到我們新建的同名web文件中,再自己導出,才不會出現配置錯誤的現象。

【第一次建Web】
選擇Apache Tomcat v6.0

day02
----------------------------------------------------
【HTTP協議詳解】 //httpget
【GET】、【POST】請求類型
如何使用HttpClient相關API讓Android發送請求
JSON


HTTP協議詳解:
HTTP協議定義了客戶端與服務端之間的通訊過程
及數據包的格式。

Http協議的通訊過程:
HTTP協議是一款基於短連接的協議。 //網頁
短連接的特點:
節省服務器資源。但是沒有辦法實時同步數據。
長連接的特點:
可以維護數據的實時性。

socket(長連接) //游戲

HTTP協議數據包的結構:
HTTP請求數據包:
1>請求行
GET /day01/index.jsp HTTP/1.1
GET: 請求方式
/day01/index.jsp: 請求資源路徑
HTTP/1.1: 協議的類型與版本

2>請求消息頭
Content-Type: text/html
key: value
key: value
這些key: value鍵值對用於描述客戶端發送請求數據包
中數據的一些狀態及客戶端的一些狀態信息。

3>請求實體
主要在POST請求方式時存放請求參數


HTTP響應數據包:
1>狀態行
HTTP/1.1 200 ok
協議的類型與版本
響應狀態碼
響應狀態碼的描述

2>響應消息頭
key: value
用於描述服務端的狀態及服務端返回數據的狀態信息。

3>響應實體
用於存放返回給客戶端的數據

GET、POST請求類型
HTTP請求的類型有很多種:PUT DELETE .....

GET/POST的區別:
1>請求參數的存放位置
GET: 參數存放在請求資源路徑後面用?拼接。
http://ip:port/day01/x.jsp?name=zs&pwd=1234
String name=request.getParameter("name");
String pwd=request.getParameter("pwd");
POST: 參數存放在請求數據包的實體部分。

2>安全性
GET:相對不安全
POST:相對安全
3>是否適合傳遞中文參數
GET:不適合
POST:適合
4>是否適合大數據量提交
GET:不適合
POST:適合

 

如何使用HttpClient相關API讓Android發送請求
如何發送get請求
如何發送post請求
如何解析HTTP響應

如何發送get請求
HttpClient client=new DefaultHttpClient();
String uri="http://localhost:8080/day01/loadEmps.jsp";
HttpGet get=new HttpGet(uri);
HttpResponse resp=client.execute(get);
HttpEntity entity=resp.getEntity();
String json=EntityUtils.toString(entity);

JSONObject obj=new JSONObject(json);
String result=obj.getString("result");
if("ok".equals(result)){
JSONArray ary=obj.getJSONArray("data");
List<Music> musics=parseJSON(ary);
return musics;
}

部署服務端項目ems:
部署成功後訪問:
http://localhost:8080/ems/addEmp.html
看到添加員工頁面,輸入信息後添加成功。


開發客戶端程序:
查詢員工列表
添加員工信息
注冊業務
登錄業務


查詢員工列表
當MainActivity打開時,看到ListView裡面顯示所有的
員工數據。


什麼是JSON?
json是一款輕量級的數據交換語言。

json的常見格式:
json對象:
{ "id": 1,
"name":"zs",
"aihao":[ "吃","吃","吃" ],
"married":true,
"dept": { "name":"cwb", "loc":"bj" }
}

json數組:
[ "吃",100, true, { } ]


解析json:
{"result":"ok",
"data": [
{"id":1,
"name":"zhangsan",
"salary":12345.0,
"age":12,
"gender":"m"},
{"id":2,
"name":"zhangsan",
"salary":12345.0,
"age":12,
"gender":"m"}
]
}


如何解析json對象及json數組:
str={ "id": 1,
"name":"zs",
"aihao":[ "吃","吃","吃" ],
"married":true,
"dept": { "name":"cwb", "loc":"bj" }
}

JSONObject obj=new JSONObject(str);
obj.getInt("id");
obj.getString("name");
obj.getJSONObject("dept").getString("loc");
obj.getJSONArray("aihao");


str=[ "吃", "吃", "吃", "吃"]
JSONArray ary=new JSONArray(str);
for(int i=0; i<ary.length(); i++){
String ele=ary.getString(i);
}
ary.getInt(index)
ary.getJSONObject(index)
ary.getJSONArray(index)
ary.getXXX(index)


如何發送POST類型的請求?
HttpClient client=new DefaultHttpClient();
String uri="http://xxxxxxxxx/addEmp";
HttpPost post=new HttpPost(uri);
//如果要傳遞參數
List<NameValuePair> list=new ArrayList<NameValuePair>();
list.add(new BasicNameValuePair("name", "zs"));
list.add(new BasicNameValuePair("name", "zs"));
HttpEntity entity=new UrlEncodedFormEntity(list, "utf-8");
post.setEntity(entity);
//設置post對象的Content-Type消息頭:
post.setHeader("Content-Type","application/x-www-form-urlencoded");
//發送請求
HttpResponse resp=client.execute(post);


完善添加員工業務:

 

 

day03
----------------------------------------------------
HTTPClient相關API:
HttpClient
DefaultHttpClient
HttpUriRequest
HttpGet
HttpPost
setHeader()
setEntity()
client.execute(HttpUriRequest)
HttpEntity
UrlEncodedFormEntity( list, "utf-8" )
NameValuePair
BasicNameValuePair
name=zs&pwd=1234&age=20

HttpResponse
getStatusLine()
getAllHeaders()
getEntity()
StatusLine 用於描述狀態行
getProtocalVersion();
getStatusCode() 獲取狀態碼
Header 用於描述消息頭

EntityUtils
toString()
toByteArray()

-----------------------------------------------------
HTTP協議的狀態管理
HTTP協議是一款基於短連接的協議。所以基於HTTP協議
的請求是無狀態的。

什麼是HTTP的狀態管理?
HTTP狀態管理應該由服務端與客戶端協同管理,才
可以實現把同一個客戶端發送的多次請求當成一個
整體來看待,把同一個客戶端的多次請求中涉及
到的數據保存下來。

實現狀態管理的方式:
Cookie機制
Session機制

Cookie機制的實現原理:
當發送第一個請求時,服務端將會在返回的響應數據包
中設置Set-Cookie消息頭。
Set-Cookie: key=value
當發送後續請求時,客戶端需要在請求數據包中添加
如下消息頭:
Cookie: key=value


Session機制 (把數據存入了服務端)
僅僅了解原理。

 

音樂播放器的列表展現:
http://192.168.188.68:8080/musicsonline/loadMusics.jsp


【設計客戶端架構:】
com.tarena.musicclient
activity 存放activity
MainActivity
entity 存放實體類
Music
util 存放工具類
HttpUtils 用於發送http請求的工具類
adapter 存放適配器
MusicAdapter
biz 存放業務類 AsyncTask
MusicBiz extends AsyncTask
List<Music>


使用單線程輪詢任務隊列的機制異步批量加載圖片


day04
------------------------------------------------
【圖片的壓縮:】

public static Bitmap loadBitmap(byte[] bytes, int width, int height){
Options opt=new Options();
//是否僅僅加載圖片的邊界屬性
opt.inJustDecodeBounds=true;
BitmapFactory.decodeByteArray(bytes, 0, bytes.length, opt);
//獲取圖片的原始寬度和高度
int w=opt.outWidth/width;
int h=opt.outHeight/height;
int scale=w>h ? w : h;
//設置圖片的壓縮比例
opt.inSampleSize=scale;
opt.inJustDecodeBounds=false;
return BitmapFactory.decodeByteArray(bytes, 0, bytes.length, opt);
}

 

Android中的內存洩露:
堆內存中含有一些對象,這些對象在創建後忘了銷毀(C),或GC無法銷毀(Java),那麼這些對象就是內存中的
垃圾對象,占用著內存,我們稱這種現象為內存洩露。

為何在Java 的 GC環境下還會出現內存洩露?
場景1:
new Thread(){
run(){ ... }
}.start();
如果run方法沒有執行完畢,那麼該thread對象就會永遠持有外部類對象的引用,導致外部類對象沒有
辦法被GC回收。導致後續對象都沒有辦法回收。這些對象在java內存中就會成為垃圾對象。


Android中的圖片緩存:

HashMap<String, Bitmap> maps=new HashMap<String, Bitmap>();
maps.put("images/a.jpg", bitmap);
maps.put("images/b.jpg", bitmap);
maps.put("images/c.jpg", bitmap);
Bitmap bitmap=maps.get("images/b.jpg");
這種方法會出現OOM 內存溢出


Java中的引用:
強引用:strong References
軟引用:soft References

SoftReference sof=new SoftReference(bitmap);

弱引用:weak References
虛引用:

【軟引用】
使用軟引用實現圖片緩存: //存在變量HashMap中,而不是sd卡中
HashMap<String, SoftReference<Bitmap>> cache =new HashMap();
存入緩存:
cache.put("path", new SoftReference(bitmap));
cache.put("path", new SoftReference(bitmap));
cache.put("path", new SoftReference(bitmap));
從緩存中讀取:
SoftReference sof=cache.get(path);
Bitmap bitmap=sof.get();


【Exception】
java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification.
Make sure the content of your adapter is not modified from a background thread, but only from the UI thread.
[in ListView(2131230721, class android.widget.ListView) with Adapter(class android.widget.HeaderViewListAdapter)]
改成這樣了,不保證有效
new Thread() {
public void run() {
//加載10個item
first.addAll(getContacts(pager));
runOnUiThread(new Runnable() {
@Override
public void run() {
if (currentPager == totalPagers) {
lv.removeFooterView(progressBar);
lv.addFooterView(tv);
}
// 刷新listview
adapter.notifyDataSetChanged();

}
});

};
}.start();


day05
------------------------------------------------


實現圖片文件緩存:

BitmapUtils{
loadBitmap(String path){
從某一個路徑中加載出一個Bitmap對象
}
save(File targetFile, Bitmap bitmap){

}
}


音樂文件的下載:

【進程優先級】
Android中的進程:
理論上說啟動一個Android App,系統將會為該App
分配一條進程。
Android中會為每一條進程分配相應的進程優先級。
大致有5中進程優先級:

【前台進程優先級】
1.包含有交互狀態的activity實例的進程。
2.包含有正在執行生命周期方法的組件的實例的進程。
3.包含有與交互狀態activity綁定在一起的service實例
的進程。
4.包含有執行了setForground(true)方法的service實例
的進程。


【可見進程優先級】
1.包含有暫停狀態的activity實例的進程。
2.包含有與暫停狀態activity綁定在一起的service實例的進程。

【服務進程優先級】
1.包含有正在運行service實例的進程。

【後台進程優先級】
包含有停止狀態activity實例的進程。

【空進程】
不包含任何組件的進程。用於當android需要開辟
新進程時,可以直接使用這些空進程,不需要現用
現創建。 優先級最低。

Android四大組件之----
【Service】

什麼是Service?
1.service是android中四大組件之一
2.service本質上是後台運行的程序。沒有activity那樣
的用戶界面。
3.service是Context類的子類。
4.service適合用於長時間後台運行的場合。
5.service具有較高的進程優先級---服務進程。
6.service運行時全局單例。

容器與組件:
組件是需要在容器的管理下運行的。
組件的創建由容器管理。
組件的生命周期方法的執行也是由容器管理的。
我們僅僅需要在組件響應的生命周期方法中編寫
相關代碼即可。容器就會自動調用。

服務的生命周期
服務的生命周期跟啟動服務的方法有關:
當采用Context.startService()方法啟動服務,與之有關的生命周期方法
onCreate()? onStartCommand() ? onDestroy()
onCreate()該方法在服務被創建時調用,該方法只會被調用一次,無論調用多少次startService()或bindService()方法,服務也只被創建一次。
onStartCommand() 只有采用Context.startService()方法啟動服務時才會回調該方法。該方法在服務開始運行時被調用。
多次調用startService()方法盡管不會多次創建服務,但onStartCommand() 方法會被多次調用。
onDestroy()該方法在服務被終止時調用。

當采用Context.bindService()方法啟動服務,與之有關的生命周期方法
onCreate()? onBind() ? onUnbind() ? onDestroy()
onBind()只有采用Context.bindService()方法啟動服務時才會回調該方法。該方法在調用者與服務綁定時被調用,
當調用者與服務已經綁定,多次調用Context.bindService()方法並不會導致該方法被多次調用。
onUnbind()只有采用Context.bindService()方法啟動服務時才會回調該方法。該方法在調用者與服務解除綁定時被調用。
如果先采用startService()方法啟動服務,然後調用bindService()方法綁定到服務,再調用unbindService()方法解除綁定,
最後調用bindService()方法再次綁定到服務,觸發的生命周期方法如下:
onCreate() onStartCommand()?onBind()?onUnbind()[重載後的方法需返回true]?onRebind()
利用bindservice()調用服務裡面的方法:
開啟服務 (startservice)
服務一旦開啟與調用者沒有任何的關系 , 調用著的activity 即便是退出了 不會影響。後台的service的運行.在activity裡面 不能去調用服務裡面的方法 .

通過綁定方式開啟服務(bindservice)
服務跟調用者不求同生 ,但求同死.如果調用者(activity)退出了 那他綁定的服務呢 也會跟著退出.我們可以在activity裡面調用服務裡面的方法.
利用 serviceSonnection 接口 返回一個ibinder對象 , 拿著ibinder對象獲取到服務裡面方法的引用(自定義了一個接口信息) ,調用服務裡面的方法 。

讓activity可以調用service中的方法。
Service中
public class LocalBinder extends Binder {
ServiceLocation getService() {
// Return this instance of LocalService so clients can call public
// methods
return ServiceLocation.this;
}
}
在ACtivity中
private ServiceConnection mConnection = new ServiceConnection() {

@Override
public void onServiceConnected(ComponentName className, IBinder service) {
// We've bound to LocalService, cast the IBinder and get
// LocalService instance
LocalBinder binder = (LocalBinder) service;
mService = binder.getService();
mBound = true;
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
mBound = false;
}
};

【onStartCommand】
* 每次調用startService(不是bindService)的時候,都會調用該Service對象的onStartCommand(Intent,int,int)方法,然後在onStartCommand方法中做一些處理。
* 返回START_STICKY:如果service進程被kill掉,保留service的狀態為開始狀態,但不保留遞送的intent對象。隨後系統會嘗試重新創建service,
* 由於服務狀態為開始狀態,所以創建服務後一定會調用onStartCommand(Intent,int,int)方法。
* 如果在此期間沒有任何啟動命令被傳遞到service,那麼參數Intent將為null。(non-Javadoc)
* @see android.app.Service#onStartCommand(android.content.Intent, int, int)
*/
public int onStartCommand(Intent intent, int flags, int startId) {
log("onStartCommand(" + intent + "," + flags + "," + startId + ")");
chkAlarm(intent, startId);

return START_STICKY;
};


【存圖片時,沒用權限,下載音樂時,加了write權限】

 

day06
---------------------------------------------
Android中的通知:Notification
【Notification】
什麼是通知?
通知是Android中的一個常用的系統服務。
我們可以使用通知更方便更友好的告知用戶一些程序的
運行狀態。


在Android中如何發送一個通知:
1.創建NotificationManager對象。
2.創建通知Notification對象,該對象中保存著通知中
的基本信息。
3.調用NotificationManager.notify方法發送通知。

修改通知內容:
再次發送一個相同id的通知即可。(不會有滾動消息)

如何清除通知:
manager.cancel(id);

如何實現通知信息常駐通知欄?
notification.flags=Notification.FLAG_NO_CLEAR;

如何設置通知的點擊意圖?
Intent intent=new Intent(this, MainActivity.class);
PendingIntent pi=PendingIntent.getActivity(this, 0, intent, 0);
builder.setContentIntent(pi);

【PendingIntent】
三種不同方式來得到一個PendingIntent實例。
getBroadcast——通過該函數獲得的PendingIntent將會扮演一個廣播的功能,就像調用 Context.sendBroadcast()函數一樣。
當系統通過它要發送一個intent時要采用廣播的形式,並且在該intent中會包含相應的 intent接收對象,
當然這個對象我們可以在創建PendingIntent的時候指定,也可以通過ACTION 和CATEGORY等描述讓系統自動找到該行為處理對象。
getActivity——通過該函數獲得的PendingIntent可以直接啟動新的activity, 就像調用 Context.startActivity(Intent)一樣.
不過值得注意的是要想這個新的Activity不再是當前進程存在的Activity 時。我們在intent中必須使用Intent.FLAG_ACTIVITY_NEW_TASK.
getService——通過該函數獲得的PengdingIntent可以直接啟動新的Service,就像調用Context.startService()一樣。







實現音樂文件的下載操作:

 

Android中四大組件之 ---- ContentProvider
【ContentProvider】
什麼是ContentProvider?
1>ContentProvider是android四大組件之一。
2>ContentProvider提供了android中跨進程數據共享
的規范。
3>ContentProvider是一個抽象類。

數據持久化


什麼時候需要編寫ContentProvider?
當app需要把私有數據的訪問方法開放給外部應用
時。
什麼時候需要訪問ContentProvider?
當需要訪問外部應用程序的私有數據時,需要訪問
外部應用程序開放出來的ContentProvider。


如何編寫一個ContentProvider?
1>編寫一個Java類,必須繼承ContentProvider.
2>實現相關的抽象方法。
3>在清單文件中注冊。


如何訪問ContentProvider?
使用ContentResolver r訪問ContentProvider。
ContentResolver r=context.getContentResolver();
r.query()
r.delete()
r.xxxxx


什麼是Uri?
統一資源標識符
http://localhost:8080/musiconline/xxx.mp3
file:///xxx/xxx/xxx.jpg?xxx=xxx&xx=xx

http://localhost:80/musiconline/musics/gongtong.mp3?name=zs&pwd=1234#segment
scheme http
host localhost
port 80
authority localhost:80
path musiconline/musics/gongtong.mp3
query name=zs&pwd=1234
segment segment


uri:
content://com.tarena.provider.WORD/

刪除:
content://com.tarena.provider.WORD/
content://com.tarena.provider.WORD/words/2
content://com.tarena.provider.WORD/user/2


UriMatcher
matcher=new UriMatcher(UriMatcher.NO_MATCH);
matcher.addUri(....., 1);
matcher.addUri(....., 2);
matcher.addUri(....., 3);
int code=matcher.match(uri);

ContentUris
ContentUris.parseId();
ContentUris.withAppendedId(uri, 30);

 

day07
-------------------------------------------------------
聯系人數據庫相關操作

系統自帶聯系人數據庫的存放位置

contacts
_id
raw_contact_id
photo_id
data
_id
mimetype_id
raw_contact_id
data1
data15
mimetype
_id
mimetype
raw_contacts
_id
display_name


如何查詢所有的聯系人數據:
先查詢contacts表
獲取每個聯系人的Id與photo_id
再通過id查詢data表
獲取每一個聯系人的具體數據


ContentResolver r=xx;
uri="content://com.android.providers.contacts/contacts";
r.query(uri, .......);


day08
------------------------------------------------
【Intent】詳解
顯示意圖與隱式意圖

Intent對象的6大屬性

ComponentName
Bundle
flags
action
category
data

ComponentName 組件名對象
封裝了Context與目標組件的類對象。可以描述
Android中的一個具體的組件。如果一個intent對象
中包含完整的ComponentName屬性,那麼我們
可以說這個intent對象是一個顯式意圖.
Intent i=new Intent(context, xxx.class);
Intent i=new Intent();
i.setCompnentName(new ComponentName(xxx, xx));


Bundle屬性
主要用於組件之間參數的傳遞。
intent.putExtra();
intent.putExtra("music",new Music());
class Music implements Serializable{ }


隱式意圖相關屬性:
action 用於描述目標組件可以執行的動作
category 用於描述目標組件所屬分類
data 用於描述目標組件處理的數據類型


action 用於描述目標組件可以執行的動作
Android系統中常見的action:
Intent.ACTION_CALL;
Intent.ACTION_DIAL;
Intent.ACTION_VIEW;

我們可以為某一個Activity定義該Activity可以執行的
動作,那麼當用戶發送隱式意圖時將有可能啟動我們
寫的Activity。

Intent對象對action的測試規則:
1>Intent對象中只能含有1個action
2>intent-filter中可以配置多個action
3>如果intent對象中的action在intent-filter的action
列表范圍內,那麼action匹配成功。
4>如果intent-filter中沒有聲明action,拒絕所有的action
的測試。
5>如果intent對象中未包含action,則默認通過
所有的action測試。

startActivity(new Intent("eos.intent.action.ALLACTIVITY")); //值是在androidManifest中加的


category 用於描述目標組件所屬分類

Intent對象對category的匹配規則:
1>intent對象中可以包含多個category
2>intent-filter中可以聲明多個category
3>如果intent對象中的category是intent-filter中聲明
category集合的子集,那麼category匹配成功。
4>如果intent對象中不包含任何category,則默認
可以通過所有的category的測試。
5>所有被傳入startActivity方法的intent對象都會被
添加一個默認的category:
android.intent.category.DEFAULT

系統中常見的category:
Intent.CATEGORY_APP_BROWSER;
Intent.CATEGORY_APP_CALENDAR;
Intent.CATEGORY_APP_CONTACTS;
Intent.CATEGORY_APP_MAPS;
Intent.CATEGORY_APP_MUSIC;


data 用於描述目標組件可以處理的數據類型。

scheme
host
port
path
mimetype

1>intent對象中包含一個具體的Data(Uri對象)
2>intent-filter中聲明當前組件支持的uri的數據格式。
scheme/host/port/path
3>如果intent中的data的格式符合intent-filter聲明
的格式的要求,則data匹配成功。
4>如果intent-filter中有data的聲明,則intent對象中
必須包含一個具體的Data才可以執行。
5>intent-filter中可以聲明data的mimetype,如果
聲明可具體的mimetype,則intent對象中必須含有
mimetype屬性:
intent.setType("type");
intent.setDataAndType(uri, "type");

Android中的廣播機制
Android中的廣播接收器

什麼是Android中的廣播?
廣播是Android中實現跨進程數據通信的一種機制。

廣播接收器是Android四大組件之一。
【BroadcastReceiver】

我們將會編寫廣播接收器接收外部發送來的廣播,獲取
廣播內所攜帶的一些數據,處理相關業務邏輯。


廣播的分類:
系統廣播
由系統程序發送的廣播。常見的有:
Intent.ACTION_BATTERY_LOW;
Intent.ACTION_MEDIA_MOUNTED;
Intent.ACTION_POWER_CONNECTED;
Intent.ACTION_POWER_DISCONNECTED;
Intent.ACTION_SCREEN_OFF;
Intent.ACTION_SCREEN_ON;
Intent.ACTION_BOOT_COMPLETED;


自定義廣播
1>普通廣播
發送普通廣播後,所有的廣播接收器接收的動作是
異步的,互相沒有關系。
2>有序廣播
發送有序廣播後,android將會按照廣播接收器事先
定義好的優先級,順序執行每個廣播接收器的相關
方法。
3>駐留廣播
發送駐留廣播後,android將會判斷容器中是否含有
可以接收該廣播的接收器,如果沒有,則該廣播不會
立即消失,將會在android容器中駐留,當在這個過程
中注冊了一個接收器,那麼也會執行接收器相關方法
處理這個廣播。


【普通廣播】
如何發送一個普通廣播?
intent=new Intent("xxxxx");
context.sendBroadcast(intent);

如何編寫廣播接收器接收普通廣播?
1>編寫一個Java類,繼承BroadcastReceiver
2>重寫相關抽象方法。
onReceive(Context context, Intent intent)
3>注冊廣播接收器。
清單文件注冊:
<intent-filter>
<action name=""/>
</intent-filter>
代碼注冊:
receiver2=new UpdateProgressReceiver();
IntentFilter filter2=new IntentFilter();
filter2.addAction("UPDATE_PROGRESS");
this.registerReceiver(receiver2, filter2);
//context.registerReceiver(receiver, filter);

this.unregisterReceiver(receiver2);
//context.unregisterReceiver(receiver);


案例:
模擬音樂播放器播放過程中的界面展現。

2>【有序廣播】
發送有序廣播後,android將會按照廣播接收器事先
定義好的優先級,順序執行每個廣播接收器的相關
方法。
廣播接收器之間可以傳遞數據。
我們可以終止廣播接收器的繼續傳播。

發送有序廣播:
context.sendOrderedBroadcast();
如何接受有序廣播:
接受方式與普通廣播一致。 但是需要配置優先級。

intentfilter.setPriority(number);
number [-1000~1000]
number越大優先級越高,越先執行。
在廣播的過程中可以終止廣播的繼續傳播:
this.abortBroadcast();


3>駐留廣播
context.sendStickyBroadcast();
發送駐留廣播需要在清單文件中聲明權限。

 


day09
--------------------------------------------------------
【媒體提供程序】 ContentProvider

什麼是媒體提供程序?
Android操作系統提供了一個媒體數據庫用於存儲
當前手機內外部存儲中所含有的媒體文件相關的基本
信息。並且使用ContentProvider提供給用戶。

當系統接收到相關的廣播後,將會啟動一個系統服務,
該系統服務會掃描內外部存儲設備獲取媒體文件相關
屬性,並且把文件的基本信息更新到媒體數據庫中。
Intent.ACTION_BOOT_COMPLETED
Intent.ACTION_MEDIA_MOUNTED

媒體相關數據庫:
com.android.providers.media
databases

如何訪問媒體提供程序?

查詢外部存儲中所有的圖片文件:
ContentResolver r=context.getxxx();
uri=Images.Media.EXTERNAL_CONTENT_URI;
uri=Audio.Media.EXTERNAL_CONTENT_URI;
uri=Video.Media.EXTERNAL_CONTENT_URI;
Cursor c=r.query(uri, null, xxxxxx);


實現音樂播放器相關業務:
1>點擊音樂列表中的某一項可以跳轉界面並且播放歌曲。
2>音樂播放的過程中更新Activity的播放進度。
進度條/時間TextView
3>下一曲/上一曲/播放/暫停
4>更新音樂信息時更新Activity的界面顯示。 (作業)
5>拖拽進度條實現從當前進度繼續播放。 (作業)
6>播放模式。 (作業)
順序/隨機/單曲循環
7>音樂播放完成後繼續播放 (作業)
player.setOnSeekCompleteListener(listener)

 

day10
---------------------------------------------------------
AppWidget桌面小部件
什麼是AppWidget?

新建的時候是Android xml file 之後在最上面不選layout,選AppWidget來新建

AppWidget是Android中有著良好用戶交互體驗的一個
組件。要求AppWidget必須繼承AppWidgetProvider。

AppWidgetProvider是BroadcastReceiver的一個子類。


如何編寫一個AppWidget?
1>設計桌面小部件的布局界面。
2>定義AppWidget的元數據文件。 (meta-data)
xml:
AppWidget的初始化布局的xml
定義AppWidget的寬度
定義AppWidget的高度
3>創建AppWidget控制器類,要求必須繼承
AppWidgetProvider. 重寫相關生命周期方法。
4>在清單文件中注冊該AppWidget。
(broadcastReceiver的注冊方式)


計算AppWidget大小的公式:
dp = 70n-30 //android:minWidth="250dp" //4*1
//android:minHeight="40dp"

AppWidget的生命周期:

onEnabled
當第一個AppWidget實例被創建時執行。
onUpdate
每當AppWidget實例被創建時執行。
onDeleted
每當把AppWIdget實例移出時執行。
onDisabled
當把最後一個AppWIdget實例移出時執行。


如何修改AppWIdget界面上的信息?
//1.修改AppWidget中TextView的文字
RemoteViews views=new RemoteViews(
context.getPackageName(),
R.layout.appwidget_main);
//2.對views進行修改
views.setTextColor(R.id.textView1, Color.BLUE);
views.setTextViewText(R.id.textView1, "Hello Android!");
//3.調用updateAppWidget修改界面
manager.updateAppWidget(ids, views);

如何給界面上的控件添加點擊意圖?
RemoteViews views=new RemoteViews(
context.getPackageName(),
R.layout.appwidget_main);
views.setOnClickPendingIntent();
manager.updateAppWidget(ids, views);


如何點擊按鈕後修改AppWidget的界面?

//給button2添加點擊意圖
Intent i2=new Intent("CHANGE_COLOR");
PendingIntent pi2=PendingIntent.getBroadcast(context, 0, i2, PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.button2, pi2);
//當用戶點擊後將會發送廣播
//接收廣播


public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
//做自己的工作
String action=intent.getAction();
if(action.equals("CHANGE_COLOR")){
//修改TextView的文字
AppWidgetManager manager =
AppWidgetManager.getInstance(context);
ComponentName provider=
new ComponentName(context,
MyAppWidgetProvider.class);
//創建Views並且更新界面
RemoteViews views=new RemoteViews(context.getPackageName(), R.layout.appwidget_main);
int[] colors={Color.RED, Color.BLACK, Color.BLUE, Color.GREEN, Color.GRAY};
int color=colors[new Random().nextInt(colors.length)];
views.setTextColor(R.id.textView1, color);
manager.updateAppWidget(provider, views);
}
}

【values/colors】
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="logo_background">#FF0000FF</color>

</resources>

 


Android中的動畫
幀動畫: Frame Animation
自己查

補間動畫: Tween Animation
淡入淡出動畫
旋轉動畫
伸縮動畫
平移動畫


淡入淡出動畫
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:fromAlpha="1.0"
android:toAlpha="0.1"
android:duration="500"
android:fillAfter="true"
android:repeatCount="infinite"
android:repeatMode="reverse"
>
</alpha>


旋轉動畫
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromDegrees="0"
android:toDegrees="900"
android:pivotX="100"
android:pivotY="100"
android:duration="2000"
android:fillAfter="true">
</rotate>


伸縮動畫


如何使用代碼的方式設置動畫:
Animation a=new AlphaAnimation(1.0, 0.1);
Animation a=new ScaleAnimation(fx, tx, fy, ty, x, y);
Animation a=new RoateAnimation(fd, td, x, y);
Animation a=new TranslateAnimation(fx, tx, fy, ty);
startAnimation(a);


完成友錄項目中的通話記錄模塊:

 

 


day11
--------------------------------------------------------
如何對Android的電話功能進行操作

Android的電話通信機制
如何撥打電話
如何監聽呼入電話
如何監聽呼出電話
如何攔截呼入電話 (AIDL)


Android的電話通信機制

如何撥打電話
1>創建一個隱式意圖
action=Intent_ACTION_CALL
data=Uri.parse("tel:15555555555");
2>調用startActivity啟動撥號界面。
3>添加撥號的權限
android.permission.CALL_PHONE

如何監聽呼入電話
1>創建一個監聽器類,擴展自PhoneStateListener。
選擇重寫相關監聽方法。
2>獲取系統服務 TelePhonyManager。
getSystemService(.....);
3>調用TelePhonyManager.listen()方法監聽電話狀態。
4>注冊權限。

如何監聽呼出電話
1>創建廣播接收器,用於接收系統廣播。
Intent.ACTION_NEW_OUTGOING_CALL
2>在onReceive中處理廣播。
常見操作,獲取對方電話的電話號碼。
3>在清單文件中注冊該廣播接收器。(代碼注冊)
4>處理呼出電話需要相關的處理權限。


Android中的 AIDL機制
可以實現跨進程訪問第三方Service。

兩個程序:
A : 客戶端訪問者
把服務端的AIDL文件拷貝到客戶端中。
要求包名文件名必須一致。
conn=new ServiceConnection(){
onServiceConnected(xxx, IBinder binder){
AIDL接口類型=Stub.asInterface(binder);
}
};
context.bindService(intent, conn, flags);


B : 服務端service
定義AIDL接口文件,該文件中聲明供客戶端調用的接口方法。
Service{
onBind(){
return new Stub(){
實現AIDL接口中的方法。
};
}
}

 

 

實現撥號界面的功能:
1>觸摸tvTitle彈出軟鍵盤
2>滾動ListView 回彈軟鍵盤
3>點擊號碼鍵盤,在tvTitle中顯示內容。
4>點擊退格鍵 刪掉tvTitle中最後一位數字
5>規范電話號碼顯示的格式
138-8888-8888
6>點擊撥號按鈕,播出電話。
7>當tvTitle中的字符串更新的時候,級聯更新ListView
中的數據。
List<Calllog> allData;
List<Calllog> nowData;
adapter.notifyDataSetChanged();

 

day12
------------------------------------------------
短消息相關操作:
短信發送的基本機制?
如何使用代碼發送短消息?
如何使用代碼接收/攔截短消息?
短消息數據庫相關管理。


如何使用代碼發送短消息?
1>獲取用於發送短信的系統服務:SmsManager
2>調用SmsManager.sendTextMessage();方法發短信
3>發送短信需要注冊權限
android.permission.SEND_SMS


SmsManager.sendTextMessage(n,null,body, p1, p2);
如何提示用戶短信發送成功 (p1)
Intent i1=new Intent("SEND_OK_OR_NOT");
i1.putExtra("number", etNumber.getText().toString());
PendingIntent pi1=PendingIntent.getBroadcast(
this, 0, i1, PendingIntent.FLAG_UPDATE_CURRENT);

如何提示用戶對方已經成功接收短信 (p2)
Intent i2=new Intent("RECEIVE_OK_OR_NOT");
PendingIntent pi2=PendingIntent.getBroadcast(
this, 0, i2, PendingIntent.FLAG_UPDATE_CURRENT);

當短信成功發送或對方接收短信時將會自動的執行
這兩個pendingIntent。


如何使用代碼接收/攔截短消息?
1>編寫一個廣播接收器,接收系統廣播:
android.provider.Telephony.SMS_RECEIVED
2>重寫onReceive方法,在該方法中獲取短信內容。
3>在清單文件中注冊權限。接收短消息的權限。

 

----------------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------------


day13
【Html】
------------------------------------------------------
服務端基礎 tomcat jsp
HttpClient相關API JSON
音樂播放器
復習 優化
通知 service
ContentProvider
聯系人提供程序 友錄
Intent詳解 BroadcastReceiver
媒體提供程序 重構音樂播放器
AppWidget 動畫 友錄
電話模塊
短信模塊


Service
如何編寫Service。
startService 生命周期
bindService 生命周期
IntentService
onHandleIntent(){}

ContentProvider
跨進程數據共享。
如何編寫ContentProvider。
如何訪問ContentProvider。
Uri

BroadcastReceiver
android中的廣播機制。
如何編寫廣播接收器。
廣播的分類。每一類什麼特點。

Activity
界面的組織結構。
activity的生命周期。
activity內部的各種控件。
布局。
activity的啟動模式。


【IntentService】
http://blog.csdn.net/guolin_blog/article/details/42238627
在4月15的那個文件夾中 130 , 169

--------------------------------------------------------
HTML基礎

什麼是HTML?
超文本傳輸標記語言。

HTML用什麼開發? H5Builder
HTML由誰解析並且執行顯示?

浏覽器
google chrome
firefox
ie
Opera

獵豹
360
UC
safari
。。。。。。

浏覽器大戰

NetScape 網景公司
88%

Microsoft 微軟
IE 98%
在windows操作系統中綁定IE。免費


Mozilla基金會
FireFox

-------------------------------------------------------
如何編寫HTML文檔:
HTML的基本結構
<html>
<!-- 主要用於定義當前html文檔的基本信息 -->
<head></head>
<!-- 主要用於定義當前文檔中的各種組件 -->
<body></body>
</html>

如何編寫一篇html?
新建一個html文檔,後綴名必須是 .html


html中的常見標簽:
換行標簽:
<br/>

分隔線標簽:
<hr width="" align=""/>
width: 寬度 單位:px
100px
50% 占用父標記寬度的50%
align: 對齊方式
left / right / center


段落標簽:
<p> 段落的內容 </p>

樣式相關的標簽:
<b></b>
<i></i>
<s></s>


圖片標簽:
<img src="" alt="" title="" />
alt/title: 當鼠標懸停到圖片上時 顯示的提示文本
src: 目標圖片的路徑
width: 圖片的寬度 px
height: 圖片的高度 px

絕對路徑:
基於操作系統的絕對路徑:
windows
以盤符開頭的路徑成為絕對路徑。
c: d: e: f:
linux / unix / MacOs
以根目錄開頭的路徑成為絕對路徑。
/xxxx/xxx/xxxx.jpg
基於網絡的絕對路徑:
以http://開頭的路徑
http://www.baidu.com/images/logo.png
http://tts6.tarena.com.cn/verifyCode/getCode.do

相對路徑: //相對路徑前面不用加“/”
<img src="lyf01.jpg"/>
day13/first.html
day13/lyf01.jpg // file:///E:/workspace_1503/Html/Html_File.html


浏覽器支持的圖片的格式:
1>JPEG 適合做大圖 不支持透明色
2>PNG 顏色鮮艷 支持透明色
3>GIF 動態圖 支持透明色


超鏈接標簽:
<a href="" title="" alt=""> text </a>
text: 鏈接文本
href: 該鏈接指向的目標路徑
# 跳轉到當前頁面中的某個錨點
javascript:;
title/alt: 鼠標懸停後的提示文本

圖片鏈接:
<a href="鏈接的目標地址">
<img src="圖片的路徑"/>
</a>


表格相關標簽
表格的使用場景:
早期我們使用表格做網頁的排版布局。
現在表格常用於呈現二維數據。

表格的基本結構:
<table> 描述一個表格
<tr> 描述一個表格行
<td></td> 描述一個單元格
<td></td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
</table>

表格相關的屬性:
table:
width: 寬度
height: 高度
align: 對齊方式
border: 邊框寬度
cellpadding: 單元格的內邊距
cellspacing: 單元格的外邊距

td:
rowspan: 按行合並單元格
colspan: 按列合並單元格

第二套表格標准:
<table>
<caption></caption> 表格標題
<thead>tr td</thead> 表頭
<tbody>tr td</tbody> 表體
<tfoot>tr td</tfoot> 表腳
</table>


html表單標簽:
什麼是表單?
用於收集用戶輸入的數據,並且在用戶點擊
提交按鈕時,把這些數據進行整理提交給
服務器。

表單標簽:
<form action="url" method="get">
包含多個表單組件
</form>

表單組件:
文本框 <input type="text" />
密碼框 <input type="password" />
單選按鈕 <input type="radio" />
多選框 <input type="checkbox" />
提交按鈕 <input type="submit" value="登錄" />
重置按鈕 <input type="reset" value="重置" />
普通按鈕 <input type="button" value="普通" />

下拉列表框
<select> 描述一個下拉框
<option>河北省</option> 描述一個下拉項
<option>河北省</option> 描述一個下拉項
<option>河北省</option> 描述一個下拉項
</select>

多行文本域
<textarea rows="" cols="" >
</textarea>

 


day14
--------------------------------------------------------
HTML表單提交規則:
只有含有name屬性的表單組件才可以在提交時
傳遞參數。
/webbasic/day14/regist.do?gender=on

向服務器傳遞的參數規則:
參數名:name屬性
參數值:value屬性
/webbasic/day14/regist.do?name=zs&pwd=123456&gender=m&aihao=c&aihao=h&aihao=w&pro=黑龍江省&jj=22222222222222222222222222222
/webbasic/day14/regist.do?name=zs&pwd=1234&gender=f&aihao=c&aihao=l&pro=jl&jj=222

表單組件默認值的規則
<input type="text" value="默認值"/>
單選按鈕的默認選中:
<input type="radio" value="m" checked="checked"/>
多選框的默認選中:
<input type="checkbox" value="m" checked="checked"/>
下拉列表框默認選擇:
<select>
<option selected="selected">---請選擇---</option>
</select>

HTML列表相關標簽

列表標簽的基本結構:
<ul> 用於描述一個列表
<li></li> 用於描述一個列表項
<li></li>
<li></li>
<li></li>
</ul>

----------------------------------------------------
CSS 級聯樣式表
CSS 主要用於控制HTML頁面中的排版與布局。
頁面組件的樣式渲染。

CSS代碼實現了頁面中結構邏輯與顯示邏輯
代碼的分離,便於代碼的維護。

CSS代碼的基本結構:
css選擇器 {
css樣式屬性名:屬性值;
css樣式屬性名:屬性值;
css樣式屬性名:屬性值;
}

CSS選擇器:
可以選出當前頁面中一個或多個標簽。然後
使用css樣式屬性對這些標簽添加樣式。

通配符選擇器:
匹配當前文檔中的所有標簽。
* { color: red; }

如何給html文檔編寫css?
1>編寫外部css文檔。要求後綴名必須是.css
2>在html中用<link> 標簽引入並應用該css文檔。
<link type="text/css" rel="stylesheet"
href=""/>

標簽選擇器:
可以選出當前文檔中符合標簽名稱要求的所有
標簽.
選出當前文檔中所有的p標簽
p { }
li { }
a { }


id選擇器:
選出當前文檔中符合id屬性值要求的一個標簽:
<p id="p1"> </p>
#p1 { .... }


class選擇器(類選擇器)
選出class屬性名符合要求的多個標簽。
我們可以認為這些標簽應用同一類樣式。

定義一類樣式:
.className { ... }
讓一些標簽應用這一類樣式
<div class="className"></div>

分組選擇器
把多個選擇器選出的標簽當成一組,然後
統一添加樣式。
p, .div, span, #id { xxx }

派生選擇器
通過父標簽找到子標簽,然後給子標簽添加
樣式。
<div>
<span></span>
</div>
<span></span>

.div .span { }


CSS的樣式屬性:
布局屬性
css的box模型

外邊距: margin
margin: 10px; 四個方向都設置外邊距為10px
margin: 10px 20px; 上下外10px 左右外20px
margin: 0 auto; 該組件將會基於父容器居中.
margin: 1px 2px 3px 4px; 上右下左
margin-left:
margin-right:
margin-bottom:
margin-top:

內邊距: padding
padding: 10px; 上下左右內邊距
padding: 10px 20px;
padding: 1px 2px 3px 4px; 上右下左
padding-left:
padding-right:
padding-bottom:
padding-top:


背景屬性 background
background-color: 背景顏色
red | blue | green .....
#000000 #ffffff
#aabbcc #abc
background-image: 背景圖片
url("../images/xxx.jpg")
background-repeat: 背景圖片的平鋪方式
repeat: 默認 雙向平鋪
repeat-x: x軸平鋪
repeat-y: y軸平鋪
no-repeat: 不平鋪
background-position: 背景圖像的定位
background-position:-xpx -ypx;


字體屬性 font
font-size 字體大小
font-family 字體 黑體
font-weight 磅值 (粗細)
lighter | normal | bold | bolder
100 ~ 900
font-style
normal: 普通樣式
italic: 斜體字

文本屬性 text
color:
text-align: 文本對齊方式
text-decoration: 文本的裝飾
line-height: 行高

邊框屬性 border
border:1px solid black;
border-width: 邊框寬度 px
border-left-width:
border-right-width:
border-top-width:
border-bottom-width:
border-style: 邊框樣式 solid ....
border-left-style:
border-right-style:
border-top-style:
border-bottom-style:
border-color: 邊框顏色 #aaa
border-left-color:
border-right-color:
border-top-color:
border-bottom-color:

列表屬性
ul li
list-style:none;

css復雜屬性:
display: 用於控制組件的顯示與隱藏
none: 隱藏
block: 把行級標記按塊級標記顯示
只有塊級標記才可以設置width與height。

float: 浮動
可以塊級標記橫向排列。
left 浮動後往左放
right 浮動後往右放

 


day15
----------------------------------------------------------
css樣式之position
position: 用於組件的定位
static
absolute
relative

如果設置一個組件的position=absolute
那麼該組件將會脫離默認的文檔流,形成
一個絕對定位的層。我們可以使用z-index
屬性控制組件的層標。數字大的將會覆蓋
z-index小的組件。
我們可以使用top和left屬性控制組件的位置。
top和left在定位的時候需要有相對參照物,
先尋找父標簽,如果父標簽中有:
position=relative屬性那麼則相對於父標簽。
如果沒有則繼續尋找祖先標記。直到
找到body,則相對參照物為body。

 

-------------------------------------------------------------
Javascript 簡稱 JS
什麼是JS?
javascript是網景公司開發的一款基於浏覽器
運行的弱類型腳本語言。

javascript的作用:
1>網頁中的數據驗證
2>操作網頁實現動態效果。
3>訪問浏覽器的基本屬性信息。
4>實現ajax。
5>與移動端接口進行交互。

js的特點:
1>javascript是一門類c的語言。
2>javscript支持基於對象編程但不是純粹的
面向對象語言。
3>javascript是一門弱類型語言。
var i;
i=2;
i="";
i=true;

javascript的組成部分:
ECMAScript規范
定義js的語法相關規范。(基礎)
DOM
Document Object Model 文檔對象模型
BOM
Browser Object Model 浏覽器對象模型
提供了一些API用於訪問浏覽器的信息。


如何編寫Javascript代碼?
1>編寫外部javascript文檔(*.js),並且在文檔
中編寫javascript代碼。
2>在html頁面中使用<script>標簽引入外部js文檔。
<script src="路徑" type="text/javascript"></script>


JavaScript的基本數據類型
java:
int char long byte short double float boolean
js:
number: 用於描述數字
string: 用於描述字符串
boolean: 用於描述true false
null:
undefined: 未定義

數據類型之間的轉換:
數字與字符串之間的轉換:
數字 -> 字符串:
var num=888;
var str=num.toString();
var str=num+"";

字符串 -> 數字:
var str="8888.88";
var number=parseInt(str);
var number=parseFloat(str);

var str="8888abc";
var number=parseInt(str); --> 8888

boolean類型對其他數據類型的解釋規則:
if(isMarried){
}

js引擎會把非0數字解釋為true,0為false。
把非空字符串解釋為true,""為false。
把null / undefined解釋為false。


運算符
數學運算符
+ - * / % ++ -- += -=
關注:/
var str="88";
alert(str/8);

邏輯運算符
&& || !
if(a && b){ }
if(a && b){ }

比較運算符
> < >= <= != == ===
== :比較兩個變量的內容
str1==str2
===: 先比較兩個變量的類型,如果一致則
再次比較兩個變量的內容。
str1===str2

三元表達式
isMarried ? "" : "";

String str1="abc123";
String str2="abc"+"123";
String str3="abc";
String str4="123";
String str5=str3+str4;
String str6="abc"+123;

str1==str2 true
str1==str5 false
str1==str6 true

條件分支語句
if(){
}else if(){
}else{ }

switch(){
case 0: break;
case 1: break;
default:
}

流程控制語句
while(){
break;
continue;
}

do{
....
}While();

for(i=0; i<ary.length; i++){
break;
contunie;
}

JS的常用API:
Math: 數字相關
String: 字符串相關


案例:
驗證13位條形碼
693335100007 5
1>求出前12位奇數位數字之和 633100=13
2>求出前12位偶數位數字之和 935007=24
3>把 "前12位奇數位數字之和" 與
"偶數位數字之和的3倍" 相加。13+72=85
4>求結果的個位數 5
5>用10減去這個個位數 5
6>再取結果的個位數 5

function check(){ var code="693335100007"; }


JS的Array對象
特點:
js的數組對象長度可變。
js的數組對象中元素的類型可以不一致。

如何聲明數組?
var ary=[100, "hello", true];
var ary=new Array();
如何訪問數組的長度?數組元素?
ary.length 數組的長度
ary[1] 獲取下標為1的元素
如何修改相應index位置的元素?
ary[1]="hello world.";
如何添加元素?
如何刪除元素?
API查去

18位身份證號碼驗證:
12345678901234567 8

 

day16
------------------------------------------------
雙色球案例重構

認識Array相關的API:
Java:
int[] ary;
Arrays.sort(ary, new Comparator<Integer>(){
int compareTo(Integer i1, Integer i2){
return i1-i2;
}
});
List<Integer> list;
Collections.sort(list, new Comparator<Integer>(){
int compareTo(Integer i1, Integer i2){
return i1-i2;
}
});

List<Person> list;

JS的函數:
function name(arg1, arg2, arg3){
alert(arg1);
return arg1;
}
我們也可以使用js中內置的arguments數組接收參數:
check(200, 300);
function check(){
return arguments[0] == arguments[1];
}
add(32,4,4,57,56,3,423,5,35,6757,56,3,45,2);
function add(){
sum;
for(i=0; i<arguments.length; i++){
sum+=arguments[i];
}
return sum;
}

我們也可以使用js中內置的arguments數組接收參數:
argments將會封裝調用傳遞過來的各種參數。
js的函數可以有return。如果沒有return,調用
者獲取的函數的返回值將會是undefined。
js在調用函數的時候僅僅檢測函數名,
如果js中有兩個函數名稱相同的函數,不檢測
參數列表,後一個函數將會有效。


------------------------------------------------------
【DOM】 Document Object Model

對HTML標簽相關操作:
查詢標簽
var eleObj=document.getElementById("id");
var ary=document.getElementsByTagName("div");
修改標簽
<img src=""/>
<div>文本文字</div>
<div ></div> css內聯樣式
<input value=""/>

img.屬性名
div.innerHTML 修改內容文本
div.style.xxxx 修改css樣式
input.value 訪問並且修改input標簽的value

js表單驗證:
用戶在填寫完表單組件後,需要使用js對
表單中的數據格式進行驗證。並且給用戶
提示。
如果表單中有一個表單組件格式不正確,則
點擊提交按鈕時,阻止表單的提交。


[0-9] \d
[a-zA-Z]
[a-zA-Z0-9_] \w

\d{10} 數字字符連續出現10次
\d{1,10}
\d{1, }
\d{, 10}

\d* 0到多次
\d+ 1到多次
\d? 0或1次
/[0-9]+/

阻止表單的提交:
當在點擊提交按鈕時,觸發onsubmit事件。
<form onsubmit="return false;"></form>
表單將阻止提交。

增加標簽
var childNode=document.createElement("span");
fatherNode.appendChild(childNode);
<div>
<span>aaaaaa</span>
<span>aaaaaa</span>
</div>

fatherNode.insertBefore(newNode, refNode);
<div>
<span>old</span>
</div>

刪除標簽
removeChild()
replaceChild()


級聯下拉列表
創建<option>
把<option>追加到<select>標簽的子標簽中

1>監聽省份列表的onchange事件
2>獲取選擇的省份
3>根據省份獲取城市列表
4>把所有的城市構造成option添加到select中。

河北省
山東省
山西省
河南省

var data=[["石家莊","邯鄲","保定","秦皇島"],
["青島","濟南","威海"],
["太原", "長治", "運城", "大同"],
["鄭州", "開封","南陽", "安陽"] ];


【BOM】 浏覽器對象模型

alert()


JS定時器相關API:

每100毫秒執行一次。(周期性執行)
window.setInterval(function(){},100 );

100毫秒後執行一次。(僅執行1次)
window.setTimeout(function(){}, 100);

 


day17
---------------------------------------------------------------
javascript的面向對象基礎
封裝
繼承
多態

如何模擬創建類型?
模擬創建類型:
function Point(){
}
var p=new Point();

如何創建類型的實例?

1>使用模擬類型創建Point對象
function Point(x, y){
this.x=x;
this.y=y;
this.say=function(){ };
}
var p=new Point(10, 20);
alert(p.x);
alert(p.y);
p.say();

2> 使用Object 創建臨時對象:
var obj=new Object();
obj.name="zhangsan";
obj.age=20;
obj.sayHello=function(){ alert("hello!"); };

alert(obj.name);
alert(obj.age);
obj.sayHello();

3>使用json的語法創建js對象:
var obj={ "name":"zs", "age":30,
"aihao":["吃","喝"],
"school":{ "name":"清華", "loc":"北京" } };
alert(obj.name);
alert(obj.aihao[1]);
alert(obj.school.name);


Javascript中的繼承的實現:
prototype chain 原型鏈

function Point(){
}
Point.prototype.x=10;
Point.prototype.y=20;

var p=new Point();

--------------------------------------------------------
HTML5
是HTML的一個新版本。

HTML5新增的主體標簽:
主要用於替代老式頁面中的div。

header 定義頁面中的頭部
footer 定義頁面中的底部
nav 定義頁面中的導航部分
aside
article
section


HTML5新增的非主體標簽:
<meter>
<meter max="200" min="0" value="0"
low="60" high="150" id="meter"
></meter>

<progress>
<progress max="200" value="100" ></progress>

HTML5新增的表單標簽
<form>
</form>

<input type="email" name=""/>
<input type="url" />
<input type="number" />
<input type="range" />
<input type="time" /> 時間相關的表單組件
<input type="week" />
<input type="month" />
<input type="date" />
<input type="datetime" />
<input type="search" />
<input type"color" />

/html5_day17/newtag.html?email=x%40x.com&url=http%3A%2F%2Fwww.baidu.com&number=7&range=15&time=00%3A01&week=2015-W25&month=2015-06&date=2015-06-18&datetime=datetime&search=search&color=%23ff0000


input表單標簽的通用屬性:
placeholder
pattern 匹配的正則表達式
required 如果設置了該屬性,則該input不能為空


Canvas畫布
canvas元素是html5新增的用於在頁面中繪制
圖形圖像的標簽。繪制的方式需要使用js。

如何使用canvas?
<canvas id="canvas"></canvas>
var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");
ctx對象提供了各種繪圖的方法,我們可以調用
這些方法對canvas進行繪制。

ctx.fill; 設置填充時的顏色
ctx.fillRect(x, y, width, height); 填充矩形

設計:
Node 描述一個畫布上的節點
i
j
Worm 描述一個蛇
nodes (Node數組)
step() 向前走一步
Stage 描述一個舞台
width 50
height 50
worm
print() 用於繪制舞台的內容

 


day18
----------------------------------------------------------
HTML5新增媒體相關標簽
視頻:
<video></video>

html5支持的視頻格式:
ogg: video/ogg
mp4: video/mp4
WebM:

video標簽的常見屬性:
autoplay: 自動播放
controls: controls 是否顯示控制欄
loop: 循環
preload: 預加載
src: 數據源
width: video標簽的width
height: video標簽的height


Javasript對video對象的支持
HTML5提供了一些js的api來操作video標簽:
var video=document.getElementById("video");
video.屬性
currentSrc 當前設置的數據源
currentTime 當前播放的時間進度
videoWidth 視頻的寬度
videoHeight 視頻的高度
duration 視頻的時長
volume 視頻的音量
width 標簽的寬度
height 標簽的高度

video.方法()
play() 播放
pause() 暫停


音頻:
<audio></audio>


audio標簽的常用屬性
autoplay: 自動播放
controls: controls 是否顯示控制欄
loop: 循環
preload: 預加載
src: 數據源

html5支持的音頻格式
ogg audio/ogg
mp3 audio/mpeg
wav


JS對audio標簽的支持

 

-----------------------------------------------------------
CSS 3.0

CSS3新增的選擇器

CSS3 邊框屬性
CSS3 背景屬性
CSS3 文本屬性
CSS3 的過渡屬性
CSS3 的變換屬性
CSS3 的動畫


CSS3新增的選擇器
[attribute^=value] a[src^="https"] 選擇其 src 屬性值以 "https" 開頭的每個 <a> 元素。 3
[attribute$=value] a[src$=".pdf"] 選擇其 src 屬性以 ".pdf" 結尾的所有 <a> 元素。 3
[attribute*=value] a[src*="abc"] 選擇其 src 屬性中包含 "abc" 子串的每個 <a> 元素。 3

:empty p:empty 選擇沒有子元素的每個 <p> 元素(包括文本節點)。 3
:target #news:target 選擇當前活動的 #news 元素。 3
:enabled input:enabled 選擇每個啟用的 <input> 元素。 3
:disabled input:disabled 選擇每個禁用的 <input> 元素 3
:checked input:checked 選擇每個被選中的 <input> 元素。 3

CSS3 邊框屬性
border: 1px solid black;
border-radius 用於設置圓角邊框
border-radius: 5px;
border-radius: 50%; 橢圓
box-shadow 用於設置邊框的投影
box-shadow: apx bpx cpx d;
a / b: 定義陰影的偏移位置
c:定義陰影的模糊程度
d: 定義陰影的顏色

CSS3 背景屬性
background-size: 背景圖片的大小
background-size: widthpx heightpx;
background-size: contain;
background-size: cover;
-webkit-background-size: contain;
background-origin:
繪制背景圖片時的起始位置:
border-box
padding-box
content-box

CSS3 文本屬性
text-shadow: 文本的投影
text-shadow: width height px #fff;
width 水平陰影的距離
height 垂直陰影的距離
px 模糊距離
#fff 投影的顏色

CSS3 的過渡屬性 transition
通過css樣式的設置,我可以在不使用flash
和js的情況下把一個控件從一個狀態變為
另外一個狀態。

1>在組件初始化的狀態時定義過渡動畫參數:
transition: all 2s ease 1s;
all: 過渡的屬性
2s: 過渡時的執行時間
ease: 過渡時的動畫時間曲線
1s: 過渡動畫執行的延時

transition-property:
transition-duration:
transition-timing-function:
transition-delay:

以上所有屬性需要根據不同的浏覽器設置相應
的過渡屬性。

CSS3 的變換屬性
transform變換屬性

scale: 伸縮
translate: 平移
rotate: 旋轉

scale: 伸縮
div:hover{
transform: scale(2, 2);
transform: scale(0.5);
}

translate: 平移
div:hover{
transform: translate(x, y);
}

rotate: 旋轉
div:hover{
transform: rotate(720deg);
}

CSS3 的動畫

 

day19
--------------------------------------------------------------
CSS3 動畫
css3的動畫可以使標簽從一個css狀態逐漸
變為另外一種css狀態。
我們可以使用@keyframes規則來實現css3的
動畫效果。

1>使用@keyframes規則定義動畫效果:
@keyframes anim{
from {定義組件開始時的css樣式}
to {定義組件結束時的css樣式}
}
@-webkit-keyframes anim{ ... }
2>給組件設置css樣式,使用並執行anim動畫:
div:hover{
animation: anim 3s;
-webkit-animation: anim 3s;
}


我們還可以使用以下方式定義動畫規則:
@keyframes anim2{
0% {}
25% {background-color: #1E90FF;
transform: rotate(30deg);
margin-left: 0px; }
50% { background-color: forestgreen;
margin-left: 600px;
transform: rotate(0deg); }
100% {
margin-left: 0px;
background-color: coral;
transform: rotate(-360deg);
}
}


CSS3的Media query 響應式設計

設計出的響應式頁面需要適配3類屏幕
480 ~ 600
600 ~ 800
800以上
需要為每一類都制定一套css樣式

<link rel="" href="" type=""
media="screen and (min-width:800px) "/>
<link rel="" href="" type=""
media="screen and (max-width:800px) and (min-width:600px) "/>
<link rel="" href="" type=""
media="screen and (max-width:600px) and (min-width:480px) "/>


Android中的WebView的使用:

WebView是Android手機端的一個控件。內置
webkit內核。

webView.loadUrl("file:///android_asset/www/x.html");

WebSettings: 封裝了webview的基本設置
settings.setJavascriptEnabled(true); //啟用js

WebView的兩大屬性:
WebViewClient
WebChromeClient

//WebViewClient
webView.setWebViewClient(new WebViewClient(){
//重寫父類的url加載方式
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
//WebChromeClient //重寫彈窗 //AlertDialog(提示對話框)
webView.setWebChromeClient(new WebChromeClient(){

});


WebView中js與Android中的程序之間的交互

1>
android程序調用webView中的javascript函數:
int num=100;
webView.loadUrl("javascript:doClick("+num+")");
String str="hello";
webView.loadUrl("javascript:doClick('"+str+"')");

2>
webView中js如何調用Android中的代碼?
html:
window.接口名稱.方法名();
Android:
webView.addJavascriptInterface(
new MyObject(), 接口名稱);
class MyObject{
@JavascriptInterface
public String 方法名(){
return xx;
}
}

 


day20
---------------------------------------------------------
【Jquery框架】
jquery-x.x.x.x.js
jquery是javascript的一款前端框架。

使用jquery的基本步驟:
1>在html頁面中引入jquery.js
<script src="js/jquery.js"/> (路徑問題)
2>jquery的基本使用方式:
<script>
//當文檔加載完畢後執行
//$(document) : 把文檔對象包裝成一個jquery對象
//調用jquery對象的ready方法添加事件監聽。
//ready方法中的匿名函數將會在文檔對象
//加載完畢後執行
$(document).ready(function(){
給頁面中的某個標簽添加事件監聽
$("a").click(function(){
alert("這是一個單純的鏈接");
});
});
</script>

屬性操作:
$("a").attr("href");
$("a").attr("href", "設置");

css樣式操作:
$("a").css("color");
$("a").css("color", "設置顏色值");

內容文本操作:
$("a").text();
$("a").text("設置innerHTML文本");

input的value屬性操作:
$("input").val();
$("input").val("設置input的value值");

 

day21
------------------------------------------------------------
Jquery與Ajax
什麼是ajax?
ajax是網頁中使用javascript異步發送http請求的
方式。基於javascript的XMLHttpRequest對象。

jquery把這些繁雜的原生的ajax代碼做了封裝,
我們可以使用jquery提供的方便的API實現ajax
操作。


微信廣告頁的制作

fullpage.js

fullpage頁面的基本結構:
<link href="fullpage.css">
<script src="jquery.js">
<script src="fullpage.js">
<body>
<div id="fullpage">
<div class="section"></div>
<div class="section"></div>
<div class="section"></div>
</div>
</body>

文檔:
https://github.com/alvarotrigo/fullPage.js#fullpagejs

實例
通過 AJAX 加載一段文本:
jQuery 代碼:
$(document).ready(function(){
$("#b01").click(function(){
htmlobj=$.ajax({url:"/jquery/test1.txt",async:false});
$("#myDiv").html(htmlobj.responseText);
});
});
HTML 代碼:
<div id="myDiv"><h2>Let AJAX change this text</h2></div>
<button id="b01" type="button">Change Content</button>


美一頁項目搭建

服務端:
1>初始化數據庫。 h5page.sql
先執行命令:set names gbk; 防止編碼問題。
2>創建服務端程序 myy_server並且把源碼粘貼進來。
3>打包: myy_server.war
4>部署: tomcat/webapps目錄
5>啟動服務端

客戶端:
1>創建新的客戶端程序 MYY
修改客戶端程序所訪問的BASE_URL的ip地址:
com.tarena.myy.util.GlobalConsts.BASEURL=".......";
2>把源碼復制粘貼到MYY項目中:
res / src / libs / AndroidMenifest.xml
3>安裝應用 運行。



美一頁業務實現:
1>
實現MainActivity的UI
實現右上角+的監聽,點擊後跳轉到ChooseActivity
選擇要使用的模版。
2>
實現ChooseActivity中的顯示模版的主要業務。
數據源: 訪問tomcat:
url:
http://ip:port/myy_server/loadModules.jsp
method:
GET
params:
NULL
return:
[
{"content":"<div class=\"section\"><img src=\"images/module_01.png\" height=\"100%\" style=\"display:block; margin:0 auto;\"/><\/div>","id":1,"name":"圖片單頁","snapshot":"images/module_01.png"},
{"content":"<div class=\"section\"><img src=\"images/module_02.png\" height=\"100%\" style=\"display:block; margin:0 auto;\"/><\/div>","id":2,"name":"圖片單頁","snapshot":"images/module_02.png"},
{"content":"<div class=\"section\"><img src=\"images/module_03.png\" height=\"100%\" style=\"display:block; margin:0 auto;\"/><\/div>","id":3,"name":"圖片單頁","snapshot":"images/module_03.png"},
{"content":"<div class=\"section\"><img src=\"images/module_04.png\" height=\"100%\" style=\"display:block; margin:0 auto;\"/><\/div>","id":4,"name":"圖片單頁","snapshot":"images/module_04.png"}
]

 

業務實現2:
1>選擇其中一個模版,獲取選擇的模版對象,
啟動新的EditActivity。傳遞選中的模版對象。
2>構造EditActivity的界面。
RelativeLayout
ViewPager + Fragment + WebView
3>接收module參數,根據參數module對象構造
Fragment對象,並且更新ViewPager
4>Fragment的寫法:
加載布局,布局中只有一個WebView。
webView加載網頁模版:
http://ip:port/myy_server/module.jsp
調用頁面中的js函數:appendpage(content)
把當前需要加載的模版的content屬性追加
到webView中顯示。
5>點擊EditActivity中的加號添加一個新的模版,
重新跳轉到ChooseActivity。
startActvityForResult()
6>當用戶選擇了某個模版後,調用setResult方法
傳回EditActivity,我們需要把該module追加
到module集合中,更新ViewPager的顯示。

 

業務實現3:
1>點擊左上角的修改圖標修改模版的背景圖片。
使用隱式意圖啟動用於選擇圖片的Activity。
當圖片選擇完成,將會返回該圖片的uri。
2>onActivityResult(){}
接收到選擇的圖片後,根據圖片的uri,
使用隱式意圖啟動用於切割圖片的Activity。
並且傳遞切割圖片時所需要的各種參數。
3>onActivityResult(){}
接收到切割圖片成功的返回結果後,把
切割過後的圖片上傳到服務器:
url:
http://ip:port/myy_server/upload.jsp
method:
post
params:
uploadfile: 文件對象
return:
服務端保存後將會返回:
{result:ok, path:images/xxxxxxxxxxxx.jpg}
4>更新模版中的圖片信息:
更新ViewPager中的內容。


業務實現4:
1>點擊播放大按鈕,生成fullpage頁面的主體
html部分。遍歷所有的模版把所有模版中的
內容都整合在一起。並且提交給服務器保存:
url:
http://ip:port/myy_server/savepage.jsp
method:
post
params:
content: html主體內容
return:
{ result:ok , genId: 生成的fullpage頁面的主鍵id }

2>跳轉界面到ShowH5Activity顯示整張頁面:
在跳轉時需要傳遞頁面id
3>在ShowH5Activity中接收id的參數,然後向
服務端發送請求,獲取相應頁面的返回值:
webView.loadUrl("http://ip:port/myy_server/h5.jsp?id=xxx");

 

【去圖庫中選擇圖片】
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*"); // Or 'image/ jpeg '
startActivityForResult(intent, RESULT_PICK_PHOTO_NORMAL);

 


------------------------------------------------------------------------------------------------------------------------------------------------------------------
【第四個老師】
質量 成本

1.架構師 1
2.設計師 10
3.程序員 100

進入聚合網 數據
www.juhe.cn

Android項目下載
www.javaapk.com

架構模式(mvc,多層)
設計模式(23個設計模式)

 


github:全世界最大的開源網站
open-open.com 最大的中文開源網站


【切換屏幕】 //生命周期不會重起
@Override
public void onConfigurationChanged(Configuration newConfig) {
// TODO Auto-generated method stub
int orientation = newConfig.orientation;
super.onConfigurationChanged(newConfig);
}
<activity
android:name=".view.PrivateChatActivity"
android:label="@string/app_name"
android:configChanges="keyboardHidden|orientation|screenSize">
</activity>
橫豎屏切換時候activity的生命周期?
不設置Activity的android:configChanges時,切屏會重新調用各個生命周期,
設置Activity的android:configChanges="orientation|keyboardHidden"時,
切屏不會重新 調用各個生命周期,只會執行onConfigurationChanged方法


【屏幕尺寸】
int screenWidth = activity.getResources().getDisplayMetrics().widthPixels;

 

【結束進程】
System.exit(0);

 


【UML】 【MyEclipse】
前三
類圖
Class
子類 拉向 父類
接口 拉向 子類

時序圖
Sequence

活動圖
Activity

後四
狀態圖
statechart

用例圖
Use Case

節點圖
Deployment

協助圖
Collaboration

 


【當前版本】
public static String getCurrentVersion(Context context)
throws NameNotFoundException {
PackageManager manager = context.getPackageManager();
String packageName = context.getPackageName();
PackageInfo packageInfo = manager.getPackageInfo(packageName, 0);
return packageInfo.versionName;
}

【安裝App】
private void installApk(String apkPath) {
//用代碼安裝apk
Intent intent=new Intent(Intent.ACTION_VIEW);
Uri data=Uri.fromFile(new File(apkPath));
//type:表示的是文件 類型
//mime,定義文件類型 text/html ,text/xml
String type="application/vnd.android.package-archive";
intent.setDataAndType(data, type);
startActivity(intent);

}

 

 


http://news.sina.com.cn/c/2014-05-05/134230063386.shtml
AA用車:智能短租租車平台
手機騰訊網
07-05 06:46:24

 


【include】
<FrameLayout
android:id="@+id/tool_bar_layout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true" >

<include
android:id="@+id/tool_bar"
layout="@layout/tool_bar" />
</FrameLayout>

//tool_bar.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="40.0dip"
android:background="@color/toolbar_bg"
android:orientation="vertical" >

<View
android:id="@+id/toolbar_divider"
android:layout_width="fill_parent"
android:layout_height="0.5dip"
android:background="@color/detail_divider_day" />

<FrameLayout
android:layout_width="0.0dip"
android:layout_height="fill_parent"
android:layout_weight="1.0" >

<ImageView
android:id="@+id/action_favor"

android:src="@drawable/ic_action_favor" />
</FrameLayout>

</LinearLayout>

【tomcat服務器】
短連接

【OpenFire】
適用於聊天的服務器,長連接

 

【SVN Server】 //使用http協議進行傳送,可以在互聯網上使用,開發項目用
在開始/所有程序那兒打開

xp系統
telnet 172.16.4.165 443 //dos //跳轉到全黑

把插件加入到eclipse目錄內,關閉eclipse,再打開 //features和plugins放入dropins文件,其他的xml文件不要
show view svn資源庫 //svn-1.6.17.zip
http://blog.csdn.net/spring123tt/article/details/6709260
記得要用工具把已經存在的.svn文件(如果存在的話)刪除掉

可以先檢出整個svn內的所有項目作為app目錄,在eclipse中,然後把你自己想導入到svn中的項目放入app目錄中(記得刪除.svn文件)
之後再提交整個app項目,就可以把你想導入svn中的項目導入進去,之後就可以檢出了。

https://172.16.4.165/svn/1503/ //下面的,右上角+

賬號 //在svn中自己建的
密碼

在自己的項目中右鍵,team-->share project-->在大白框中填第一次提交,勾選所有的。


改自己的部分,然後只能提交自己改了的部分進行提交

team更新

如果無法更新,可以先斷開連接,再刪除項目,再重新檢出一次

提取之前的版本可以在“顯示歷史資源記錄”中,右鍵以前的,選第二項“從修訂版創建分支/標記”,然後改一下“到url”的名字如:lipeineng2
這樣會以以前的版本創建一個新的項目,至於在原項目中返回以前的版本我不知道

 

 

【NDK】
路徑不要有中文
NDK插件:用於開發Android NDK的插件,ADT版本在20以上,就能安裝NDK插件,另外NDK集成了CDT插件
Android官網下載最新的NDK,注:NDK版本在r7以上之後就集成了Cygwin,而且還是十分精簡版。
http://www.cnblogs.com/yejiurui/p/3476565.html //NDK環境搭建 這種可以在eclipse中直接通過clean來編譯
http://blog.csdn.net/asmcvc/article/details/9311541 //直接用dos

要注意的有application.mk中的NDK_TOOLCHAIN_VERSION=4.6 的版本號,要看你自己的NDK的android-ndk-r9\toolchains中是不是有這個版本
application.mk中的APP_PLATFORM := android-14,你的AndroidManiFest中的minSdkVersion="14" 兩個最好相等
不用像jdk和sdk那樣在系統環境變量中配置

C:\Users\Administrator>d:
D:\>cd D:\mywork\android-ndk-r8\samples\hello-jni
D:\mywork\android-ndk-r8\samples\hello-jni>D:\mywork\android-ndk-r8\ndk-build.cmd
Gdbserver : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver
Gdbsetup : libs/armeabi/gdb.setup
"Compile thumb : hello-jni <= hello-jni.c
SharedLibrary : libhello-jni.so
Install : libhello-jni.so => libs/armeabi/libhello-jni.so

D:\mywork\android-ndk-r8\samples\hello-jni>


【cygwin】
使用最新ndk,直接拋棄cygwin,以前做Android的項目要用到NDK就必須要下載NDK,
下載安裝Cygwin(模擬Linux環境用的),下載CDT(Eclipse C/C++開發插件),還要配置編譯器,環境變量,特別麻煩,新版就不需要了

和ndk在一個子目錄下,安裝時,第一步選第三項
其他的就是下一步
出現一個警告,不用管
把devel的default改為install,其他默認

進入c盤的安裝後的目錄,發現home空的,點擊後面的Cygwin.bat文件,會在home生成文件

在.bash_profile文件用Editplus打開在最後粘貼上
#NDK=/cygdrive/d/android-ndk-r5c-windows/android-ndk-r5c

之後再加上自己的ndk的目錄(其子目錄要有build) //D:\ndk1503\android-ndk-r5c-windows\android-ndk-r5c //大寫變小寫,不要有空格,斜槓要反過來
NDK=/cygdrive/d/ndk1503/android-ndk-r5c-windows/android-ndk-r5c
export NDK

再點擊Cygwin.bat,輸入 cd $NDK
ls

可以調用c語言

 


【Junit】
測試,單元測試

Junit右上角倒數第二個可以導出xml文件


【證書】 //http://www.jb51.net/article/37103.htm
使用Eclipse導出帶簽名的apk
Location android.keystore smart.keystore
password //密碼 hyhotelservice
confirm //確認 hyhotelservice

alias //別名 androiddebugkey_platform
validity //有效性 1000
first and last name liming
organizational unit 組織單位 HY
organization JD
city or locality SZ
state or province //國家或省份 GD
country code //國家代碼 CN

換到E盤
e:
jarsigner -verify -verbose -certs tsinged.apk

【ant】打包 //失敗 //testAnt2文件路徑不要有中文
環境變量
ANT_HOME
D:\Android\eclipse\plugins\org.apache.ant_1.8.2.v20120109-1030 //ant根路徑

----------------------------------------
sdk.dir=D:\\Android\\sdk
project.dir=E:\\WDJDownload\\testAnt2
------------------------------------------
application.package=com.example.testant2
ant.project.name=testAnt2
key.store=E:/WDJDownload/testAnt2/key.keystore
key.store.password=123456
key.alias=123456
key.alias.password=123456

appStore=uc,qq,360
out.absolute.dir=d:/1503/class
gos.path=d:/1503/apk
java.encoding=utf-8
app_version=1.0.0


【gradle多渠道打包】 //成功
配置環境變量
GRADLE_HOME E:\WDJDownload\gradle-1.10-all\gradle-1.10 //解壓出來的一部分,路徑最好不要有中文
PATH %WPS_HOME%;%JAVA_HONE%\bin;%PATH%;D:\Android\sdk\platform-tools;D:\Android\eclipse\plugins\org.apache.ant_1.8.2.v20120109-1030\bin;%ANT_HOME%\bin;%GRADLE_HOME%\bin;
ANDROID_HOME D:\Android\sdk

Build_tools必須是19以上
D:\Android\sdk\build-tools //Build_tools文件(android-4.4.2)要放在sdk的build-tools目錄中

D:\first_soft\RoBoGuiceTest>gradle build 在dos中進入項目的目錄中,執行gradle build就可以了
生成的文件在build\apk中
需要兩份AndroidManifest,build.gradle,key.keystore


在虛擬機中安裝apk //http://www.apkbus.com/android-123971-1-1.html
1、首先將你要安裝的apk放入android-sdk當中platform-tools的目錄當中(與adb.exe同目錄)
2、window+r輸入cmd之後點擊確定,找到android-sdk的存放目錄(此處已D盤根目錄為例); //d: //cd D:\Android\sdk\platform-tools
3、輸入adb install weixin.apk則安裝成功(前提是模擬器必須打開);(見圖3) //名字不要太長


【百度地圖sdk】 //API控制台
http://lbsyun.baidu.com/
http://developer.baidu.com/map/
先注冊
再創建應用
復制eclipse中preference-->Android-->Build-->SHA1 fingerprint
EF:57:D3:69:01:DA:D0:5D:86:2F:C2:50:0F:67:BB:BA:21:C5:6A:79;com.tarena.tlbs //在eclipse中復制的+包名(就是你Manifest中的包名)
6418840 tlbs baKpSY7NfoacVywMZvjd08lp

eclipse 在64位操作系統時,在eclipse中找不到SHA1 fingerprint
只有通過dos命令行得到
C:\Users\BaseKing-Sunie>cd .android
C:\Users\BaseKing-Sunie\.android>keytool -list -v -keystore debug.keystore //測試的
輸入密鑰庫口令:
密鑰庫類型: JKS
密鑰庫提供方: SUN
您的密鑰庫包含 1 個條目
別名: androiddebugkey
創建日期: 2015-7-27
條目類型: PrivateKeyEntry
證書鏈長度: 1
證書[1]:
所有者: CN=Android Debug, O=Android, C=US
發布者: CN=Android Debug, O=Android, C=US
序列號: 2fbb8517
有效期開始日期: Mon Jul 27 11:14:37 CST 2015, 截止日期: Wed Jul 19 11:14:37 CST
2045
證書指紋:
MD5: F8:49:59:BE:70:A3:7C:2B:B4:CC:D0:80:20:6C:34:E1
SHA1: D9:CB:10:64:1B:A2:2D:0D:4C:3A:FB:ED:49:B5:AC:04:0D:0A:3B:28
SHA256: F8:14:26:85:26:ED:63:CF:66:C4:C3:49:9D:05:5F:BA:92:68:FA:B6:B9:
A3:65:41:53:A7:23:E6:5C:5C:30:4A
簽名算法名稱: SHA256withRSA
版本: 3


【代碼混淆後,百度地圖】
要加上
-libraryjars libs/baidumapapi_v2_1_3.jar //改成自己用的版本
-keep class com.baidu.** { *; }
-keep class vi.com.gdi.bgl.android.**{*;}

保持百度地圖相關類不被混淆,但是地圖仍然出錯(只顯示網格,無法搜索POI等),這是為什麼呢?原因是,混淆前的SHA1和混淆後的SHA1不同,你使用的百度AK依然是混淆前申請的,所以用在混淆後的安裝包裡當然無法使用了,解決辦法就是用混淆時所用的簽名文件中的SHA1重新去百度官網申請AK後再重新打包。
C:\Users\BaseKing-Sunie>cd/d E:\人人打車\簽名文件 //進入簽名文件目錄
E:\人人打車\簽名文件>keytool -v -list -alias renren -keystore keystore_driver //renren是別名 keystore_driver是簽名文件名字
輸入密鑰庫口令: //此處是密碼 //正式的
別名: renren
創建日期: 2014-11-7
條目類型: PrivateKeyEntry
證書鏈長度: 1
證書[1]:
所有者: CN=renren, OU=renren
發布者: CN=renren, OU=renren
序列號: 545c9686
有效期開始日期: Fri Nov 07 17:53:10 CST 2014, 截止日期: Sat Oct 25 17:53:10 CST
2064
證書指紋:
MD5: 41:25:25:09:BA:E6:8C:C1:31:25:23:4C:3B:82:A5:E5
SHA1: FE:5E:66:1A:29:1C:57:47:78:9A:80:80:02:34:79:5F:91:53:0B:D3
SHA256: D9:6F:61:87:8D:88:21:DC:6B:E9:5F:28:B4:BD:12:D8:66:A7:43:48:4E:
46:8E:11:05:F7:A6:06:01:9C:ED:45
簽名算法名稱: SHA1withRSA
版本: 3



【百度語音合成(TTS)SDK使用方法】
http://blog.csdn.net/zpf8861/article/details/32311875
http://yuyin.baidu.com/docs/tts/119
【代碼混淆】
http://blog.csdn.net/binyao02123202/article/details/18940715
【百度語音合成】
Proguard 配置
如果應用配置了代碼混淆,需要在 Proguard 配置
keep class com.baidu.android.**{*;}
keep class com.baidu.speechsynthesizer.**{*;}


【百度地圖使用】
地理編碼指的是將地址信息建立空間坐標關系的過程。有可分為正向地圖編碼和反向地圖編碼。
在線建議查詢是指根據關鍵詞查詢在線建議詞,實現方式如下:
http://developer.baidu.com/map/sdkandev-4.htm

百度定位locSDK_4.1.jar
百度地圖baidumapapi_v2_4_1.jar,
libBaiduMapSDK_v2_4_1.so
百度導航galaxy_mini.jar,
BaiduLBS_Android.jar,
android-support-v4.jar,
android_api_1.1_forsdk.jar,
liblocnaviSDK.so,
libejTTS.so,
libCNPackage.so,
libapp_BaiduNaviApplib_v1_0_0.so

zxing-2.0-core.jar生成二維碼圖片,解析二維碼圖片,google的一個開源項目

galaxy_lite.jar是百度 Android公共基礎庫,如果項目中還集成了其它百度 SDK,如 PushSDK,在打包過程中出現類似如下的錯誤信息:
[2013-10-22 11:02:57 - Dex Loader] Unableto execute dex: Multiple dex files defineLcom/baidu/android/common/logging/Configuration; [2013-10-22 11:02:57 -VoiceRecognitionDemo] Conversion to Dalvik format failed: Unable to executedex: Multiple dex files define Lcom/baidu/android/common/logging/Configuration;
請將此 Jar 包移除。如果 Eclipse ADT版本插件低於 17,需要手工添加依賴庫,添加方法為:Project => Properties => Java Build Path => Libraries => AddJAR... 3


【代碼混淆後,百度語音】
-keep class com.baidu.android.**{*;}
-keep class com.baidu.speechsynthesizer.**{*;}
分正式版和測試版兩個

 


【代碼混淆後,百度導航】
要加上
-keep class com.baidu.navisdk.comapi.tts.** { *; } #【有時候保證不混淆的代碼准確到整個包名,也可以確保不混淆。導航初始化】
-keep interface com.baidu.navisdk.comapi.tts.** { *; }
-dontwarn com.baidu.navisdk.comapi.tts.**

-keep class com.sinovoice.**{*;}
-keep interface com.sinovoice.**{*;}
-dontwarn com.sinovoice.**




【libs中的.jar】
二維碼圖片
zxing-2.0-core.jar生成二維碼圖片,解析二維碼圖片,google的一個開源項目。

百度導航
galaxy_mini.jar,
BaiduLBS_Android.jar,
android-support-v4.jar,
android_api_1.1_forsdk.jar,
liblocnaviSDK.so,
libejTTS.so,
libCNPackage.so,
libapp_BaiduNaviApplib_v1_0_0.so

百度定位
locSDK_4.1.jar


【hprof】【檢查內存洩露】
導出hprof文件後,
在sdk\tools\hprof-conv.exe hprof文件名 導出hprof文件名

memory analayzer tools
1,運行程序 ddms 生成hprof 文件,
2, 轉換 D:\android-sdk-windows\android-sdk-windows\tools\hprof-conv.exe
有的sdk的hprof-conv.exe不在tools中在platforms-tools中

hprof-conv.exe ddms.hprof 0714.hprof
3,解壓內存分析工具
3.1 查看java sdk的版本是32位還是64位
3.2 解壓\projectRes2005-06-06\技術資料\內存優化
3.3 執行MemoryAnalyzer.exe
3.3.1,openfire 選第一個
3.3.2 左邊有個數據庫圖標 overview




【.9.PNG格式】
我不想在這裡過多的討論PNG格式的定義問題。但是.9.PNG確實是標准的PNG格式,
只是在最外面一圈額外增加1px的邊框,這個1px的邊框就是用來定義圖片中可擴展的和靜態不變的區域。
特別說明,left和top邊框中交叉部分是可拉伸部分,未選中部分是靜態區域部分。right和bottom邊框中
交叉部分則是內容部分(變相的相當於定義看一個內邊距,神似padding功能,後面我會單獨介紹一下),這個參數是可選的


【環信SDK】p2p(不經過服務器)支持實時音視頻
注冊之後會有一個應用名字,放在values中


【有米】廣告
加三行代碼


【簡歷】
很簡單啊,在上一家單位的職位上直接寫項目經理,項目經驗,直接寫精通藍牙,精通音視頻解碼,我擦,保證你的電話被爆菊
10:39:24
黃少軍--18060734772 2015-7-6 10:39:24
電話留剛哥的..
李剛~湖北潛江 2015-7-6 10:39:43
然後服務端,直接寫,nginx負載均衡,動靜分離,分布式緩存處理。數據庫分庫,讀寫分離

 

【環境變量】
ANDROID_SDK_HOME D:\Android\sdk
ANT_HOME D:\Android\eclipse\plugins\org.apache.ant_1.8.2.v20120109-1030;
CLASSPATH .
JAVA_HOME C:\Program Files\Java\jdk1.6.0_10
PATH %WPS_HOME%;%JAVA_HONE%\bin;%PATH%;D:\Android\sdk\platform-tools;D:\Android\eclipse\plugins\org.apache.ant_1.8.2.v20120109-1030\bin;%ANT_HOME%\bin;
TEMP %USERPROFILE%\Local Settings\Temp
TMP %USERPROFILE%\Local Settings\Temp
WPS_HOME C:\Documents and Settings\Administrator\Local Settings\Application Data\Kingsoft\WPS Office\9.1.0.5119\office6


【android-support-v7-appcompat】 //刪除Bin 目錄下的文件,重新編譯
android的res目錄是固定的,只能是下面的幾種,如果加了其他的目錄,它會報‘invalid resource directory name'的錯誤,
其實加了其它系統不認的目錄,系統也不能提供相應的象Resources.getDrawable() and Resources.getColor(), Resources.openRawResource() 去引用資源呀。
anim
drawable
layout
values
xml
raw
color
此外,是不是能采用子目錄的方式呢?這樣編輯器是可以通過的,不會報錯
注:采用子目錄的方式可以編譯通過,但是通過R無法找到子目錄和子目錄中的資源


【查看源碼】
Android 如何在Eclipse中查看Android API源碼 及 support包源碼
http://blog.csdn.net/vipzjyno1/article/details/22954775
之後找到你所安裝的SDK所在的目錄,我的SDK目錄路徑是:C:\Users\Administrator\android-sdks
找到各個版本的對應sources文件夾
我們拿4.3來做個例子(android-19 就是對應4.3)
找到目錄路徑
C:\Users\Administrator\android-sdks\sources\android-19
方法1.
直接點擊鏈接,發現無法看源碼之後,點擊那個按鈕,在彈出框中選擇第三個,然後輸入...\sources\android-19這樣的目錄,就可以看源碼了。
或者
方法2.
之後右擊你的項目,選菜單最下方的Properties --- Java Buld Path --- Libraries --- android 4.3 --- android.jar
點擊Edit,
在上圖所示輸入框放入你前面源碼的目錄,之後項目會自動更新,之後便可以查看源碼了。


【源代碼導入方式】 //導入源代碼
android.support.v4.view.ViewPager
的源代碼導入方式

在libs目錄下
新建android-support-v4.jar.properties的file文件,並在file文件內寫入
src=D:/Android/sdk/extras/android/support/v4/src/java
之後close project,再open project,就可以看見源代碼了
(support.v4的源代碼是在sdk中的extras中,不像其他的源代碼是在sources中)

【Dialog】
mProgressDialog.setCanceledOnTouchOutside(false);// 點擊彈窗外的區域是否可取消


ThinkAndroid是包含Android mvc和簡易sqlite orm以及ioc模塊,它封裝了Android httpclitent中的http模塊,
具有快速構建文件緩存功能,無需考慮什麼格式的文件,都可以非常輕松的實現緩存,它實現了圖片緩存,在android中
加載的圖片的時候oom的問題和快速滑動的時候圖片加載位置錯位等問題都可以輕易的解決掉。他還包括了一個手機開發中
經常應用的實用工具類,如日志管理,配置文件管理,android下載器模塊,網絡切換檢測等等工具。
ThinkAndroid的開發宗旨是簡潔,快速的進行Android應用程序的開發


【android:maxlength】
android:maxLength="10"
英文+漢字一共10字符,比如“android開發者” 7個字母+3個漢字。再多的部分就不會顯示了。
【android:ems="10"】
表示長度為10個單位(具體是多長不清楚),再多的就換行顯示
設你輸入的參數為n, 屏幕顯示的數量為m。
值為1-5時,m = n..
6-11時,m = n+1。
12-18時,m = n+2。
再大我就沒測試了,因為屏幕放不下了……………………
基本是符合規律的,對於結果+1和+2,我的猜想是,漢字間是有間隙的,漢字一多,加上間隙,寬度就會增大。也只是猜想,再反過來看看API。
雖然還是不明白ems是什麼,但是這裡有個很重要的詞,wide,寬度范圍,而沒有強調長度,那麼我想應該就是字符在屏幕中所占的寬度了,既然這樣,就和屏幕寬度和字體大小有直接的關系。
本文到此基本能結束了,相信大家也有點了解了,雖然我也不能確定自己的猜想是正確的,但是拿來用應該沒問題了,但是我對這個方法還有點吐槽:
1, GoogleAPI會以漢字為基准嗎?地位一下提高的感覺啊……
2, 對於ems這種英文符號,沒有意義,我們該怎麼猜測。
3, 在android條件下,各種分辨率,各種屏幕標准,山寨手機還喜歡篡改默認字體的情況下用這種空間布局屬性實在不太好適配呀……有較大的局限性
4, 綜上所述,這個屬性和方法不好用……over。

 

 

 

 

 

 


【ThinkAndroid】主要有以下模塊:

MVC模塊:實現視圖與模型的分離。
ioc模塊:android中的ioc模塊,完全注解方式就可以進行UI綁定、res中的資源的讀取、以及對象的初始化。
數據庫模塊:android中的orm框架,使用了線程池對sqlite進行操作。
http模塊:通過httpclient進行封裝http數據請求,支持異步及同步方式加載。
緩存模塊:通過簡單的配置及設計可以很好的實現緩存,對緩存可以隨意的配置
圖片緩存模塊:imageview加載圖片的時候無需考慮圖片加載過程中出現的oom和android容器快速滑動時候出現的圖片錯位等現象。
配置器模塊:可以對簡易的實現配對配置的操作,目前配置文件可以支持Preference、Properties對配置進行存取。
日志打印模塊:可以較快的輕易的是實現日志打印,支持日志打印的擴展,目前支持對sdcard寫入本地打印、以及控制台打印
下載器模塊:可以簡單的實現多線程下載、後台下載、斷點續傳、對下載進行控制、如開始、暫停、刪除等等。
網絡狀態檢測模塊:當網絡狀態改變時,對其進行檢測。


【getSystemService】
getSystemService是Android很重要的一個API,它是Activity的一個方法,根據傳入的NAME來取得對應的Object,然後轉換成相應的服務對象。以下介紹系統相應的服務。
傳入的Name | 返回的對象 | 說明
WINDOW_SERVICE WindowManager 管理打開的窗口程序
LAYOUT_INFLATER_SERVICE LayoutInflater 取得xml裡定義的view
ACTIVITY_SERVICE ActivityManager 管理應用程序的系統狀態
POWER_SERVICE PowerManger 電源的服務
ALARM_SERVICE AlarmManager 鬧鐘的服務
NOTIFICATION_SERVICE NotificationManager 狀態欄的服務
KEYGUARD_SERVICE KeyguardManager 鍵盤鎖的服務
LOCATION_SERVICE LocationManager 位置的服務,如GPS
SEARCH_SERVICE SearchManager 搜索的服務
VEBRATOR_SERVICE Vebrator 手機震動的服務
CONNECTIVITY_SERVICE Connectivity 網絡連接的服務
WIFI_SERVICE WifiManager Wi-Fi服務
TELEPHONY_SERVICE TeleponyManager 電話服務


【更新時間】
Time time = new Time();
time.setToNow();
tvDate.setText(time.format("%Y-%m-%d"));//輸出2015-07-29格式
tvTime.setText(time.format("%H:%M"));


【&0xff】//取後八位
System.out.println(257 & 0xff);//輸出1

【經緯度】Longitude,latitude
經緯度的整數值為1/10000分,要獲得相對應的度,需要除以600000。


【ellipsize】
android:ellipsize=”start”—–省略號顯示在開頭 "...pedia"
android:ellipsize=”end”——省略號顯示在結尾 "encyc..."
android:ellipsize=”middle”—-省略號顯示在中間 "en...dia"
android:ellipsize=”marquee”–以橫向滾動方式顯示(需獲得當前焦點時)

 


【異常】
Project has no default.properties file! Edit the project properties to set one.錯誤解決方案
Project has no project.properties file! Edit the project properties to set one.和上面的解決方法一樣

從外面import項目,可能會出現Project has no default.properties file! Edit the project properties to set one.
錯誤,這是因為default.properties應該是程序自動生成的,但是拷入的項目中存在著default.properties文件,所以就會產生錯誤。

解決方法:
1 刪掉已導入的項目,然後將硬盤上的要拷入的項目中的default.properties文件剪切到別的地方
2 然後將改變後的項目重新拷入,再在導入的項目中新建一個File,名字為default.properties
3 然後用記事本把原來的default.properties打開
4 將裡面的內容拷入項目中的default.properties中,然後選中導入的項目,refresh一下即可解決
http://blog.csdn.net/wwdzwjsw4106/article/details/7230888


【shareduserid】
一。
通過Shared User id,擁有同一個User id的多個APK可以配置成運行在同一個進程中.所以默認就是可以互相訪問任意數據. 同時可以訪問其他APK的數據目錄下的數據庫和文件.就像訪問本程序的數據一樣。
二.
(1)在AndroidManifest.xml中添加android:sharedUserId="android.uid.system"
(2)在Android.mk文件裡面添加LOCAL_CERTIFICATE := platform(使用系統簽名)
(3)在源碼下面進行mm編譯
三.
這樣生成的apk能夠獲取system權限,可以在任意system權限目錄下面進行目錄或者文件的創建,
以及訪問其他apk資源等(注意創建的文件(夾)只有創建者(比如system,root除外)擁有可讀可寫權限-rw-------)。
系統中所有使用android.uid.system作為共享UID的APK,都會首先在manifest節點中增加android:sharedUserId="android.uid.system",然後在Android.mk中增加LOCAL_CERTIFICATE := platform。可以參見Settings等
系統中所有使用android.uid.shared作為共享UID的APK,都會在manifest節點中增加android:sharedUserId="android.uid.shared",然後在Android.mk中增加LOCAL_CERTIFICATE := shared。可以參見Launcher等
系統中所有使用android.media作為共享UID的APK,都會在manifest節點中增加android:sharedUserId="android.media",然後在Android.mk中增加LOCAL_CERTIFICATE := media。可以參見Gallery等。


【字符串部分上色】
TextView tvQuestion = (TextView) layout.findViewById(R.id.tv_question);
String text1 = "乘客已向您賬戶支付元";
String text2 = Utils.formatMoney(order.fee);
String text3 = "元";
tvQuestion.setText(Utils.colorString(text1.length(), text1.length()
+ text2.length(), text1 + text2 + text3, getResources()
.getColor(R.color.money_orange)));

public static SpannableStringBuilder colorString(int start, int end,
String str, int color) {
SpannableStringBuilder spannable = new SpannableStringBuilder(str);// 用於可變字符串
ForegroundColorSpan span = new ForegroundColorSpan(color);
spannable.setSpan(span, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
return spannable;
}

 

【clone()】 //克隆
clone()方法將對象復制了一份並返還給調用者。所謂“復制”的含義與clone()方法是怎麼實現的。一般而言,clone()方法滿足以下的描述:
  (1)對任何的對象x,都有:x.clone()!=x。換言之,克隆對象與原對象不是同一個對象。
  (2)對任何的對象x,都有:x.clone().getClass() == x.getClass(),換言之,克隆對象與原對象的類型一樣。
  (3)如果對象x的equals()方法定義其恰當的話,那麼x.clone().equals(x)應當成立的。
淺克隆字段是值類型的,就好像第一張圖,a把name,age都復制到b,c上了(但是b,c都是一個新對象了,外面我畫了方框)
如果是引用類型的,就好像第二張圖,b,c都直接引用a對象的work對象,而沒有重新創建自己的work對象
深克隆如第三張圖,b,c都創建了一個work對象,然後a把workName,workAge都復制到b,c上了,

 

【imageView/imageButton】
imageView:src的圖片會撐大
imageButton:src的圖片不會撐大

android:background="@drawable/down_bg"

【setTextColor】
btnCancel.setTextColor(Color.rgb(102, 102, 102));

【小米2s】
小米2s(MIUI7.0)手機要連接eclipse,必須進入關於手機,多次點擊MIUI版本啟動開發者模式,
以及在其他高級設置裡的開發者選項中開啟開發者選項,打開USB調試。



【base64】
java實現圖片與base64字符串之間的轉換
package com.zxc.testjava.ant;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
public class TestChangeImage {
public static void main(String[] args) {
String strImg = GetImageStr();
System.out.println(strImg);
GenerateImage(strImg);
}
// 圖片轉化成base64字符串
public static String GetImageStr() {// 將圖片文件轉化為字節數組字符串,並對其進行Base64編碼處理
String imgFile = "C:/Users/Star/Desktop/test.png";// 待處理的圖片
InputStream in = null;
byte[] data = null;
// 讀取圖片字節數組
try {
in = new FileInputStream(imgFile);
data = new byte[in.available()];
in.read(data);
in.close();
} catch (IOException e) {
e.printStackTrace();
}
// 對字節數組Base64編碼
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(data);// 返回Base64編碼過的字節數組字符串
}
// base64字符串轉化成圖片
public static boolean GenerateImage(String imgStr) { // 對字節數組字符串進行Base64解碼並生成圖片
if (imgStr == null) // 圖像數據為空
return false;
BASE64Decoder decoder = new BASE64Decoder();
try {
// Base64解碼
byte[] b = decoder.decodeBuffer(imgStr);
for (int i = 0; i < b.length; ++i) {
if (b[i] < 0) {// 調整異常數據
b[i] += 256;
}
}
// 生成jpeg圖片
String imgFilePath = "C:/Users/Star/Desktop/test22.png";// 新生成的圖片
OutputStream out = new FileOutputStream(imgFilePath);
out.write(b);
out.flush();
out.close();
return true;
} catch (Exception e) {
return false;
}
}
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved