Android筆記

Java
OOP
API(lang包,util包,io包)
包裝類-Integer
數據庫
JDBC--SQLService
WEB
Html(css,js),(JSP/Servlet)css

Android
應用型技術
遊戲-->暫時來講國內沒什麼前途,在技術上來講:圖形
功能-->利用設備來實現應用
應用-->淘寶客戶端,新浪微博客戶端,人人網,優億市場.....html

---------------------------------------------------
環境安裝
Android的介紹(版本)
創建一個Android的工程(瞭解下工程目錄)
模擬器(AVD)java

Android的歷史:
Google在2005年放出消息,要進入移動電話領域
2007年,Google推出Android1.0版(鐵臂阿童木)
2009年,Google聯合HTC推出第一臺Android手機--G1
搭載了Android1.5版
Google爲了推出Android,還作了如下事情:
牽頭成立了一個開放手持設備聯盟,初始參與的廠商有34家
在推出G1以前的半年,舉辦了全球性質的Android開發者大賽,獎金高達100萬美圓
2010年,G1,G2的手機總出貨量已經超越蘋果,接近諾基亞
2011年,僅三星一家的出貨量已經超過蘋果1倍,而諾基亞。。忘掉吧android

法國做家寫了一本小說《將來夏娃》 web

Android1.0版,代號Astro(鐵臂阿童木)
Android1.5版,代號Cupcake(紙杯蛋糕)
Android1.6版,代號Donut(甜甜圈)
Android2.0/2.1版,代號Éclair(鬆餅)
Android2.2版,代號Froyo(凍酸奶)
Android2.3版.代號Gingerbread(薑餅)
Android3.2版,代號Honeycomb(蜂巢)
Android4.0版,代號IceCreamSandwich(冰激凌三明治)
Android4.2版,代號JELLY BEANsql

1.5版是第一個裝機的版本
2.3版本是裝機量最大的版本
3.0版本是第一個平板專用的版本
4.0版本開始平板手機共用的版本
咱們如今主要的開發版本是基於4.0數據庫

Android的環境配置:
Eclipse3.5以上
MyEclipsejson

ADT是Eclipse開發Android的插件
https://dl-ssl.google.com/android/eclipse
經過以上地址,在MyEclipse中更新成最新版(若是未來又有更新,你須要先卸載之前
安裝的,而後再從新下載最新)
下載AndroidSKD,放在全英文的路徑目錄下(我的建議丟在某個盤的根目錄)
在MyEclipse的window菜單的preferences的菜單項中選擇Android,而後在右邊的
SDKLocation中填寫剛纔下載的AndroidSDK目錄根目錄的地址,記得點擊Applywindows

開發Android,編寫第一個Android程序---HelloWorld數組

創建Android Application Project
填寫Application Name
ProjectName
PackageName
其中PackageName必須包含子包(擁有二級包)

選擇Minimum Required SDK
TargetSDK
Compile With
一般狀況下TargetSDK和Compile With是一致的


咱們基本上使用4.0或4.2
next的第二個界面直接再next
在如今呈現的界面中能夠修改圖標樣式和大小
再next後是界面風格的選擇,選擇第一個BlackActivity(標準的Activity)
再再next的界面是Activity的相關配置

Activity是Android中的一種用於,通俗的理解就是界面
1個Activity是1個界面
若是說程序有4個界面,那麼你就須要有4個Activity
Activity的英文本意是活動

ActivityName的命名遵照Java類的命名規則

LayoutName的命名必須全小寫,其餘遵照Java命名規則

------------------------
Android的工程目錄:
src目錄:存放源代碼
可是在Android中源代碼必須存放在src目錄下的包中

gen目錄
是開發工具自動維護的目錄,一般狀況下咱們不要去修改裏面的內容
gen目錄中有一個關鍵文件叫:R.java
R.java是Android全部資源的索引文件
任何在res目錄下的資源都會同步在R.java中生成一個對應的常量,使用res的資源都通
過R.java中生成的常量來訪問
在xml中咱們使用:@xxxx/xxx來獲得res的資源
而java中咱們使用:R.xxxx.xxx來獲得

assets目錄
是資產目錄,用於存放Android程序運行所需的資源,好比視頻,聲音,圖片,數據庫
文件等等

bin目錄
程序產生的apk文件在該目錄中

libs目錄
類庫包,用於存放Android程序所須要的第三方jar文件

res目錄
資源目錄,用於存放Android程序運行所需的資源,好比圖片,界面佈局,常量,動畫
文件等等

res/drawable目錄
用於存放圖片資源

res/layout目錄
用於存放界面佈局文件
在Android搭建界面有兩種方式
1.經過xml制定(相似html寫界面的概念)
2.經過代碼制定
大部分時候咱們是使用第1種,少數狀況下會混合第2種

res/values目錄
用於存放常量文件,好比strings.xml表示字符串常量,colors.xml表示顏色常量等等


AndroidManifest.xml是Android的資源清單和程序配置文件

 


@是引用符號
@string是引用value中的字符串常量
@color是引用value中的顏色常量
@drawable是引用圖片
等等.....

在Android中單位有如下幾種:
px,sp,dip,dp
px是傳統意義上的像素單位
sp是scale-independent pixel(與比例無關的像素)
一般用於指定字體
dp是density-independent pixel(與密度無關的像素)
dip是dp的另外一種寫法

關於密度
密度是指1個像素單位內的dpi值
1dp固定爲160dpi

低密度:120 L
中密度:160 M
高密度:240 H
超高密度:320 XH

假設屏幕爲480*800的Nexus S
4寸屏(寬度2.04寸)
那麼每px的密度是480/2.04=235dpi (寬)
而235接近240,因此被認爲是高密度屏
指定寬度爲100px,實際密度就是23500

而若是使用dp
100dp的密度會這樣計算,因爲這個屏是高密度,因此固定每dp的密度是240
那麼100dp就是100*(240/160)=150像素,實際密度是35250

480的寬意味像素總數爲480*235=112800
使用px佔寬度的20%
使用dp佔寬度的31%

一樣的寬度放入到320*480的屏幕上,設備尺寸爲3.2的HTC Hero(寬度1.77)
那麼每px的密度是320/1.77=180dpi
接近160,認爲是中密度設備
那麼寬度爲100px,實際密度就是18000
而100dp則是100*(160/160)=100像素,實際密度是18000
320的寬意味像素總數爲320*180=57600
使用px做爲單位的寬度佔整個寬度的31%
而dp做爲單位的寬度佔31%

在Android中咱們基本上只使用兩種單位:
大小用dp或dip,隨意
字體用sp

--------------------------------------------
建立Activity的流程
問題:爲何要建立Activity
回答:由於你的程序要有界面,界面就是Activity
Activity至關因而JFrame

1.創建一個Class文件
2.繼承Activity
3.編寫Activity配套的layout佈局文件並關聯
4.在AndroidManifest.xml中註冊Activity(若是有須要還能夠指定啓動的Activity是哪
一個)
在application的標籤內嵌套activity標籤指定activity類的路徑完成註冊
若是要配置成默認啓動的Activity,那麼須要在activity的標籤內再嵌套
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

在Android中全部的控件有兩個屬性是必須存在的:
android:layout_width
android:layout_height
取值能夠是以dp爲單位的任意正整數
也能夠是內部提供的常量:
wrap_content 根據內容大小決定
fill_parent 根據父容器大小決定
match_parent 至關於fill_parent

Dalvik虛擬機
傳統Java程序運行class文件
而Dalvik運行dex文件
dex文件是對class文件進行整合後生成的文件

另外java虛擬機不管運行多少個程序,只有一個虛擬機實例
而Dalvik會爲每一個程序啓動一個單獨的虛擬機,從而隔離每一個程序

最關鍵的是java虛擬機是基於棧的
而Dalvik是基於寄存器
=================================================
DDMS
View

DDMS是Android的調試控制器
Devices 驅動器,顯示當前DDMS鏈接的設備(模擬器,真機)
FileExplorer 文件瀏覽器,經過文件瀏覽器瀏覽設備中的存儲內容(大部分時候是用於
操做模擬器)
LogCat 運行日誌,也能夠理解爲是Android的控制檯
Emulator Control 仿真控制檯,主要是用於模擬器模擬撥打電話,發短信,定位


LogCat是咱們隨時隨刻都會查看的信息框
這個裏面詳細記錄了整個設備以及當前程序的運行過程
異常,咱們自定義的輸出都會在LogCat中顯示

異常發生之後的建議處理方式:
1.深呼吸,而後打開金山詞霸,同時淡定的調整下心態,默默的和本身說:太好了,這是上
天給我一次可貴的累積經驗的機會
2.查看異常類型是什麼(就是那個XxxxxxxxException),必要的話使用金山詞霸翻譯
.而後根據中文含義回想代碼中哪些地方可能會致使這種情況
3.若是還找不到,那麼查看at,從第一個開始,依次向下尋找本身親手編寫的那個類,而那
個類後面所接的行號就是錯誤發生的地點
4.根據錯誤代碼的上下內容解決錯誤

若是須要本人提供幫助,那麼才準備好2個東西:
1.什麼異常(用中文)
2.把錯誤所在的代碼找出來
-------------------------
View
在Android中全部的視圖(控件),都是View

android.view.ViewRoot$CalledFromWrongThreadException: Only the original
thread that created a view hierarchy can touch its views.

--------------------------------------------------------------------
View稱爲控件
在Android中有兩類View:
1.View 能夠理解爲標準控件,好比按鈕,文本等等
2.ViewGroup 能夠理解容器控件,好比佈局,好比List等等

在Android中有5種佈局,和Swing不同,在Android中是強烈要求使用佈局來進行控件的
擺放,由於Android設備不統一,各類分辨率和大小的屏幕都有
1.LinearLayout 線性佈局,相似Swing的流佈局
2.FrameLayout 幀佈局,相似Swing的卡片佈局
3.RelativeLayout 相對佈局,相似Swing的包佈局
4.TableLayout 表格佈局,相似Swing的網格佈局
5.AbsoluteLayout 絕對佈局,被遺棄的佈局,甚至大部分書籍都懶得提它

LinearLayout
是本人使用的最多的佈局,基本上90%都用該佈局來解決問題
線性佈局不會自動換行,超出的控件將不會顯示

layout_weight是LinearLayout特有的屬性,只有屬於LinearLayout的控件才具有該數據
這個屬性用於設置控件的權重(英文直譯,實際意思是控制控件佔用剩餘空間的優先度)
須要注意的是:若是設置了權重屬性,那麼寬度指定任何值都沒有效果,因此一般會指定
爲0dp,另外該控件還會在最後的時候纔會擺放上去
假若有3個控件,A指定爲1,B也指定爲1,C也指定爲1
那麼A佔用的大小是
1/(1+1+1)*100
33%
那麼B佔用的大小是
1/(1+1+1)*100
33%

假設如今分別指定爲1,2,3
那麼A佔用的大小是
1/(1+2+3)*100
16%
B佔用的大小是
2/(1+2+3)*100
33%
C佔用的大小是
3/(1+2+3)*100
50%


在Android中設計界面有兩種方式:
1.代碼編寫
2.xml編寫

在實際編寫過程當中建議使用xml的方式來進行界面設計,而後必要的時候搭配代碼,不建
議徹底使用代碼來編寫(徹底使用代碼編寫的行爲屬於裝X行爲)

注意:xml文件名必須全小寫

關於Intent
Android中的組件訪問經過意圖實現
意圖理解爲想法,你將你的想法告訴Android,Android幫你實現
通俗的理解就是你只須要建立Intent,而後把要的東西的類名給它,剩下的,什麼建立對
象啊,初始化啊等等都不須要你去幹預,由系統自行完成

FrameLayout
幀佈局不多使用,可是用到的時候很是好用
大多時候用於搞一些相似ps的層效果,固然還有後期聊到的TabHost也會使用

RelativeLayout
相對佈局有人特喜歡用,有人幾乎沒怎麼用
我我的一般不用,由於大部分效果均可以靠LinearLayout來實現
可是特有的佈局效果相對佈局更簡單

相對佈局有三組屬性用於幫助定位控件位置
相對其餘控件,取值是相對控件的id
layout_toRightOf
layout_below
layout_toLeftOf
layout_above

相對其餘控件的邊線對齊,取值是相對控件的id
layout_alignBaseline
layout_alignLeft
layout_alignTop
layout_alignRight
layout_alignBottom

相對父容器的某個位置,取值是true/false
layout_centerInParent
layout_centerHorizontal
layout_centerVertical
layout_alignParentLeft
layout_alignParentTop
layout_alignParentRight
layout_alignParentBottom

TableLayout
表格佈局
這個佈局最大的特色就是其包含的控件無需設置高寬
stretchColumns屬性用於拉伸指定的列,讓整個一行的內容佔滿屏幕寬度
值是索引,這些索引是隱藏的,從0開始

------------------------------------------------
基本控件
TextView
EditText
Button
ImageButton
ImageView
RadioButton
CheckBox

TextView是文本控件,可是不接收用戶輸入,相似Swing的JLabel,可是功能更增強大:
容許部分html標籤來制定格式
(font,p,br,a,img)
能自動匹配內容造成動做連接
能自定義內容的動做和樣式
能插入圖片

Android的控件的結構:
View
|
----------------------------------------
| | |
ViewGroup TextView ImageView
| | |
----------------- EditText,Buttn ImageButton
| |
Layout Adapter


建議補充的課外內容:反射


EditText,是TextView的子類,是輸入控件
自動提示完成功能
控制輸入內容
插入圖片

layout_marginXxx 設置控件距離其餘控件(父容器邊框)的距離
paddingXxxx 設置控件內容距離控件邊框的距離
layout_gravity 設置控件在父容器中對齊的方式
gravity 設置控件的內容在控件中對齊的方式


Button
ImageButton
RadioButton
CheckBox

ImageView
(矩陣)
旋轉
縮放

多點觸摸


Http協議(request,response)
JavaWeb(Tomcat,Servlet)

------------------------------------------------
適配器

所謂的容器控件是指控件中能夠存放N個數據項
比較典型的有列表控件,下拉控件,畫廊

對於這類控件的共同點就是數據項須要經過適配器在控件中顯示
是典型MVC:
model 數據源,形式上多是數組,也多是集合
view 控件自己,好比ListView
control 適配器,充當數據和控件之間的橋樑,簡單點說,數據以什麼形式,樣式顯
示出來,由適配器決定

在Android中適配器有四種:
ArrayAdapter 用於單數據顯示,好比自動完成的輸入文本框的提示內容
SimpleAdapter 用於複雜數據顯示
SimpleCursorAdapter 用於顯示來自Cursor的數據
BaseAdapter 自定義適配器,我的基本上99%都使用自定義的形式

在Android常見的適配器控件:
ListView
Spinner
GridView
Gallery
-----------------------------------------------
WEB概念
web簡單的認爲就是基於互聯網的應用程序
一般客戶端是瀏覽器

Http協議規範了互聯網應用中請求方(客戶端)和響應方(服務器)遵照的一種標準,格式
請求格式:


響應格式:

 

 

本身創建一個web應用,提供給Java的客戶端使用(提交或是獲取數據功能)
tomcat服務器軟件的使用

首先肯定一個小概念:服務器不是機器,而是軟件
只是咱們一般將安裝了服務器軟件的機器叫服務器
Tomcat是JAVA領域中使用面最廣的服務器軟件:
歷史悠久
免費開源
安全
個性化
性能出衆

安裝過程一路next
須要注意若是沒有自動或是錯誤的指定jre目錄,那麼就手動給它(jre或jdk均可以)

安裝完畢後去到安裝後的目錄中找到bin目錄
找到tomcat6w.exe文件,雙擊
將啓動模式(startup type)更改成手動(Manual)
將服務設置爲中止狀態(Service Status更改成Stopped)

創建服務工程:
new-->web project

在javaweb程序中提供服務的文件被稱爲Servlet
Servlet本質上是一個Java類
和Swing同樣,因爲繼承了某些東西,改變了本身的用途


第一個窗口指定好包名,類名,而後鉤上doGet和doPost,其餘的都去掉

第二個窗口中修改Servlet/JSP Mapping URL一項,這一項表示屆時客戶端的請求路徑
,好比當前web程序名字叫hello,而後這個url被設置爲world.html,那麼客戶端就須要
經過以下地址:
http://192.168.1.26:8080/hello/world.html
而後還須要注意的是無論改爲什麼,都須要/開頭

http://192.168.43.64:8080/JSDX/hello_web.do
a3ffa85273ad
http://192.168.43.64:8080/00913Ajax/index.jsp
---------------------------------------------
Android的網絡訪問
訪問的方式
傳輸純文本內容
傳輸xml格式內容
傳輸json格式內容
傳輸圖片,文件等格式內容(下載)

Android的網絡訪問有三種:
1.HttpClient
第三方提供的基於Http協議的網絡訪問API
已經被集成到Android中
2.3版本之前是推薦的鏈接和訪問方式
可是2.3版本之後,這個第三方宣佈再也不更新和維護,因此後來的版本慢慢的再也不使用,加
上下面那種鏈接方式的崛起,這種HttpClient的方式已通過時了

2.HttpURLConnection
這是Java自己提供的,和Android不要緊
在2.3版本之後HttpClient的沒落,以及自身的增強(好比提供了更多的支持,如壓縮格式
等等),因此如今是推薦的Android網絡訪問方式

3.Socket
正常狀況下基於HTTP的網絡鏈接不會考慮這種方式,緣由參考上週咱們聊的

只有在非正常狀況下:好比廣告推送等這類須要持續鏈接的環境下才會使用Socket
其實如今QQ,微信也是用Socket來實現即時聊天的功能


關於XML和JSON
以上兩種都是數據的一種存儲方式
xml經過標籤來組織和結構化數據
而後xml自己又是純文本格式
因此xml被大量用在網絡中進行數據的傳輸
也被大量應用在軟件中做爲系統參數和配置文件
好比咱們要存放一個班級的學生:
<class>
<student name="張三" sex="男">
<subject name="語文" score="98"/>
<subject name="數學" score="89"/>
<subject name="外語" score="77"/>
</student>
<student name="李四" sex="女">
<subject name="語文" score="98"/>
<subject name="數學" score="89"/>
<subject name="外語" score="77"/>
</student>
<student name="王五" sex="男">
<subject name="語文" score="98"/>
<subject name="數學" score="89"/>
<subject name="外語" score="77"/>
</student>
</class>

json是最近幾年出現的一個新玩藝
最開始是應用在Ajax技術中,在web頁面和服務器交互數據時提升效率和操做性(之前
Ajax的數據傳輸是經過xml,大量的標籤佔用了流量,而且JavaScript解析xml也不是很人
性化)

比較典型的json格式:
{name="張三",sex="男",{name="語文",score=98,name="數學",score=89},name="李四
",sex="女",{name="語文",score=88,name="數學",score=77}}

 

java.net.SocketException: socket failed: EACCES (Permission denied)

android.os.NetworkOnMainThreadException

網絡須要聲明權限
<uses-permission android:name="android.permission.INTERNET"/>

在3.0版本以前網絡操做能夠在任意地方編寫
而3.0後,Google爲了防止網絡操做致使界面被阻塞,因此要求網絡操做必須在非UI線程
中處理

java.lang.RuntimeException: Can't create handler inside thread that has not
called Looper.prepare()

網絡訪問是個永恆的糾結問題,從未中止過
在Android中糾結更上一層樓:
一段代碼,你要考慮哪些部分要放在非UI線程中處理,哪些部分要放在UI線程中處理
糾結的地方在這個考慮不是你願意不肯意,性能好很差的問題,是不這麼幹就不行的問題
說白了,Android的線程沒法避免的會涉及到一個線程和線程之間調度的問題

AsyncTask線程類能夠完美的解決線程以及調度問題(誰用誰知道)
AsyncTask是Android自身提供的一個封裝了線程的類
咱們要作的就是new出來
而後實現doInBackground方法(這個方法是必須實現的)
AsyncTask經過其實例的execute方法啓動任務
這個方法的參數類型由泛型的第一個參數決定
execute方法被調用後會自動調用doInBackground方法
將接收的參數同時傳遞給doInBackground方法

doInBackground方法顧名思義是後臺方法,這個方法是個標準的線程方法,至關於Thread
的run方法,有本身的獨立運行空間
doInBackground方法執行完畢後會調用onPostExecute方法
onPostExecute須要咱們本身手動覆蓋(這個方法的覆蓋是可選的)
其參數就是doInBackground方法的返回值,這個類型由泛型的第三個參數決定
onPostExecute方法和doInBackground方法最大的不一樣點在於該方法是屬於UI線程調度
的,也就是說在這個方法中能夠進行任意的界面更新操做

xml可擴展標記語言
特色:文本形式(不受防火牆攔截),經過標籤組織數據(能夠傳遞複雜數據和結構數據),
可讀性很是高(不須要藉助第三方工具,人類能夠直接閱讀)

web程序中添加jar包的路徑:
WebRoot/WEB-INF/lib目錄

JSON
爲何叫JSON,其實我也不知道
可是JSON倒是如今最煊赫一時的數據傳輸解決方案
--------------------------------------
Gallery 畫廊控件

數據在傳輸中永遠都是以字節形式傳遞
byte
在形式上任何數據在傳輸的時候都是String格式


本週:
下載圖片(多圖片下載)
下載文件(對話框,進度條,通知欄,服務,SD卡)


Android中有如下幾種消息的提示方式:
1.Toast
2.對話框
a.Activity模擬的對話框,這種對話框靈活度最高
b.標準對話框,用於顯示信息,最多隻提供三個按鈕
c.帶進度條的對話框(除此以外其實還有帶時間或日期的對話框)
d.自定義對話框,只支持有限的幾個控件,靈活度沒有Activity模擬的對話框好,可是
基本上大部分時候咱們都是使用自定義對話框而非Activity模擬的對話框,緣由後面提
到Activity的生命週期時細聊
3.通知

 

服務
通知

下週預告:
利用服務+通知解決文件下載
Activity的生命週期初探


服務Service和Activity同樣屬於Android的組件之一
Android有四大組件:
服務 Service
活動 Activity
廣播 Broadcast
內容提供者 ContentProvide
任何Android應用程序一定由以上1-4種組件組成

Service是一個看不見的Activity,不能和用戶進行交互,在後臺運行本身的程序

通知欄因爲每次更新數據以後都要從新發布,因此若是過於頻繁的更新通知欄數據會導
致系統反映緩慢(甚至進入假死狀態)

Activity,或者說Android的系統和咱們windows系統有個很是大的差異:
在咱們使用電腦的時候總有一種習慣:
若是什麼程序不用了,那麼咱們就要關閉它,甚至於在任務管理器中強制結束,簡單的說
就是對於windows的程序咱們若是不用了,就巴不得把這個程序銷燬的乾乾淨淨,若是有
一點殘餘,那麼各類不爽

可是在Android偏偏相反
若是你結束了一個程序(包括在設置->應用程序中結束),事實上這個程序其實還可能活

這樣的處理帶來的好處就是下次啓動的時候啓動速度會有很大的提高

可是你不能期望Activity結束後,其未完成的任務會確定完成,由於雖然結束Activity,
而系統並未釋放其內存,其任務會繼續進行,可是在繼續進行的過程當中隨時有被系統kill
的可能性,因此若是期望Activity結束後會繼續完成其任務是不可靠的

最可靠的作法就是將須要Activity結束後(或者不依賴Activity)運行的任務放置到
Service中

Service是專門用於進行後臺任務處理

Service有如下五個方法:
onCreate
onDestroy
onStart
onBind
onUnbind
以上五個方法構成了服務的生命週期,在某個特定的時候會調用其中某個方法

當經過startService方法啓動服務的時候:
onCreate->onStart
若是再次啓動服務,只會調用onStart
說明服務永遠只存在一個實例
結束服務的時候會調用onDestroy

當經過bindService方法綁定服務的時候:
onCreate->onBind
當再次綁定的時候,什麼都不執行
也就是說服務同一時間只能綁定一次
當綁定的Activity被結束或者調用unbindService會讓服務解除綁定關係

服務一般都是用startService來啓動,以便執行長時間的後臺任務
在執行過程當中若是想得到執行的進度等信息,那麼能夠經過bindService來在某個監控用
的Activity上綁定該服務

今天:
通知欄的使用
服務的生命週期以及綁定服務的概念

明天:
推送的實現(廣告)
Activity的生命週期
------------------------------------------------
推送
服務器向設備發送信息

以前咱們都是由設備向服務器發送請求,而後服務器才響應內容給咱們的設備
可是不少時候咱們須要服務器主動發數據給咱們,這種狀況叫推送

HttpURLConnection是基於HTTP請求的鏈接方式
Http協議有個特色,它是請求響應模式,每一次請求會獲得一個響應,而後鏈接中斷
新的請求會有新的鏈接

而推送則須要保持手機和服務器一直持續鏈接,由於只有這樣服務器才能向手機主動發
送信息
持續保持
手機1------------|
手機2------------|-->服務器
手機3------------|
須要的時候向手機發送信息


保持持續鏈接使用Socket套接字

將接收寫入到服務中,在後臺運行
而後開機的時候自動啓動(開機廣播)

廣播也是Android的組件之一
在Android中各類系統服務,硬件的狀態變化都會發出一些信息給外界,咱們稱這些信息
爲廣播
之因此叫廣播,是由於這些信息能夠選擇性的接收或者忽視

當手機啓動的時候,會發出一條啓動的廣播信息
咱們的程序要作的就是收聽這條信息,而後開啓推送的服務

intent-filter是意圖過濾器
其功能是,你給他一段字符串常量
而後他會去根據這個字符串常量尋找對應的Activity或廣播
這個字符串常量是Activity或廣播的別名


開機廣播在4.0後續的版本中作了個小修改:
必需要用戶手動運行一次包含開機廣播的程序,開機廣播才生效

注意開機廣播須要:android.permission.RECEIVE_BOOT_COMPLETED權限

Activity的生命週期由7個方法構成:
onCreate *****
onStart
onResume *****
onRestart
onPause *****
onStop
onDestroy

onResume和onPause是程序的邊界
當執行onResume的時候說明程序界面即將和用戶見面
當執行onPause的時候說明程序界面此時沒法和用戶進行交互
因此咱們事實上認爲這2個方法纔是程序的邊界

而onStop,onDestroy基本上都是屬於忽略的方法,由於這2個方法並不是100%必定會被調用

onCreate在一個程序的生命週期中只會調用一次,因此它特別適合進行界面元素的構成,
相似Swing程序的構造方法
可是對於界面元素的數據填充,則建議在onResume中,由於手機設備的特性會致使界面經
常會被覆蓋掉(好比忽然來了一個電話),而onResume能夠保證它是界面顯示在用戶面前
以前最一個一定會調用的方法

本週:服務,推送的機制理解,編寫個簡單廣播(開機)
----------------
周2晚3317
周3上午1,2 3320
周3晚上 3317

下週預告:
Activity的生命週期必定要搞定
廣播的使用(攔截短信)
AIDL服務的寫法(和自動掛斷來電有關)
存儲

剩下的部分還有:
多媒體
動畫
傳感器
GPS和GoogleMap服務

1 Activity雜七雜八,意圖過濾器
2 廣播(廣播接收,廣播發送)
3 廣播的代碼註冊,AIDL服務,自動掛斷來電
4 SharedPreferences
5 SQLite
6 ContentProvide
7 文件處理(SD的文件處理,內部的文件處理,Assets,res/raw)
8 POST提交數據至服務器
9 滑屏,TabHost,菜單,抽屜

課程設計階段補充
多媒體
動畫
傳感器
GPS和GoogleMap服務
-----------------------------------------
Activity:
生命週期
狀態保存(橫豎屏切換)

Activity之間的值傳遞

廣播接收,攔截處理短信廣播
意圖過濾器

Activity生命週期分爲:
完整生命週期(Activity建立到銷燬)
onCreate----onDestroy
可視生命週期(Activity可見到不可見)
onStart----onStop
前臺生命週期(Activity可操做到不可操做)
onResume---onPause

正常狀況下啓動一個Activity會經歷如下方法:
onCreate-->onStart-->onResume
當按back結束的時候:
onPause-->onStop-->onDestroy

若是是其餘Activity覆蓋了當前的Activity
好比來了電話,那麼電話界面會強制覆蓋當前的Activity
或者當按下Home鍵的時候
那麼:
onPause-->onStop
若是在一段時間以內從新返回到這個Activity
那麼:
onRestart-->onStart-->onResume

onDestroy是不靠譜的,因此千萬不要將onDestroy做爲程序的邊界
那麼程序邊界設置爲onStop能夠麼?

在傳統程序中,好比桌面程序(Swing),web程序(JSP/Servlet)中,對話框是同步的
就是對話框出現後,會致使後續代碼中止運行,等待對話框關閉後才繼續執行
而Android中的對話框是異步的
簡單的說:Android的對話框show出來後,後面的代碼繼續執行

若是在Android中要實現同步對話框,請選擇Activity模擬

onPause是當前Activity失去用戶操做時最後一個確定會被調用的方法,然後面的
onStop以及onDestroy則不必定會觸發
因此onPause是實際意義上程序的邊界

而啓動Activity最後的一個步驟是調用onResume


Android的橫豎屏切換比咱們想像中要複雜的多
它的切換是依靠摧毀,從新建立來實現
因此當切換橫豎屏的時候會經歷如下方法:
onPause-->onStop-->onDestroy-->onCreate-->onStart-->onResume
那麼在這個過程當中,程序的運行數據和狀態會由於onDestroy的調用丟失,也會由於
onCreate的調用而重置
因此Activity還提供了2個專門解決這個問題的方法:
onSaveInstanceState
onRestoreInstanceState
調用的流程是:當切換橫豎屏的時候
onPause-->onSaveInstanceState-->onStop-->onDestroy-->onCreate-->onStart--
>onRestoreInstanceState-->onResume

Activity之間的值傳遞
1.Intent傳遞
2.靜態變量傳遞
3.全局對象傳遞
4.帶返回的Activity返回處理結果

廣播:
常見的系統廣播:
開機廣播
喚醒和休眠廣播
短信到達廣播
電話呼入和呼出廣播
電量廣播
..........

短信到達廣播

13908498187

意圖過濾器
發送廣播
廣播的代碼註冊
AIDL服務
自動掛斷來電

意圖過濾器Intent-Filter

Intent-Filter你能夠理解爲是一個索引,好比有個Activity叫M1,那麼若是要啓動這個
Activity,咱們會經過如下代碼:
Intent intent=new Intent(this,M1.class);
固然還可使用另一種方式(利用意圖過濾器)
在註冊M1這個Activity的時候,爲其配置一個意圖過濾器,指定Action爲hello
那麼須要啓動M1的時候,那麼能夠這麼寫:
Intent intent=new Intent("hello");

意圖過濾器對於Activity來講最大的價值有2個:
1.能夠跨應用調用Activity
2.能夠將多個Activity歸類爲一組,在使用的時候再由用戶決定用哪一個Activity來完成
操做

廣播:
電話狀態的監控
電話是一個很敏感且很重要的手機功能
因此Google在對待電話功能上是慎重的
在Android的API中沒有提供對電話內容錄音和操做的任何功能
而電話廣播僅僅只能讓咱們接收到電話的三種狀態:
響鈴,接,掛

AIDL服務
遠程服務調用
傳統的Service服務只能被當前應用啓動和綁定,若是須要被其餘應用使用,那麼就需
要AIDL服務

AIDL
Android Interface Declaration Language

實現步驟:
1.定義aidl文件(定義完成後,會自動生成對應的java類文件)
2.建立實現類(爲了實現aidl文件中聲明的方法實現),繼承對應生成的java類中的內部
類Stub
3.註冊,配置一個意圖過濾,起一個別名
4.將生成的java類copy到客戶端程序中(誰要去調這個服務,java類的文件就複製到誰
下面)
5.客戶端程序綁定AIDL服務
IBinder須要經過
Xxxx.Stub.asInterface方法來轉化,而非強制轉型
Xxxx是生成的那個Java類名稱

Service也被稱爲本地服務,只能被擁有這個Service的程序來訪問和操做
AIDL的目的就是實現本地服務遠程化,簡單的說就是容許其餘的程序來訪問和操做不屬
於本身的Service

掛電話:
正常狀況下沒法掛斷,只能經過很是手段:
TelephonyManager類是電話管理類,它掌控着電話的一切行爲
在這個類中有個方法叫getITelephony,這個方法會返回一個ITelephony對象,而
ITelephony對象實際是一個AIDL服務對象,它包含着控制電話的各類方法,其中就有
endCall掛斷方法
(問:爲何會是一個AIDL?答:由於電話是一個公共功能,其功能要求能被其餘的程序訪
問到,因此就定義爲了AIDL,而非普通服務.問:那爲何是服務,而不是其餘的?答:這個
問題太白癡,想一想,Android中什麼東西能一直在後臺運行,那只有服務)


自定義廣播的實現
自定義廣播可讓不一樣的程序之間相互通訊

廣播的註冊方式:
廣播有兩種註冊方式,一種是xml註冊,一種是代碼註冊

xml註冊是全局的,經過該方式註冊的廣播會一直生效,直到程序被卸載
而代碼的僅僅在程序正在運行的時候纔有效果

 

屏幕的休眠和喚醒(代碼註冊的問題)


任何程序都須要和數據打交道,而數據則須要存儲:
在Android中,數據有四種存儲方式:
1.文件存儲
a.SD卡
b.內部文件(外部不可訪問)
c.res/raw目錄下的文件
d.assets目錄下的文件
2.SharedPreferences
是一種輕量級的存儲策略,適合存儲配置信息,相似windows平臺中的inf文件
3.SQLite
是一種輕量級的移動數據庫,IOS也是使用SQLite
4.雲儲存
說白了就是數據不存放到手機自己,而是放到遠程的服務器裏


SQLite是一個移動設備的專用數據庫
它的內存佔用很是少,只須要幾百kb
它的性能很是高,Oracle的速度比SQLite慢幾十倍
它已經內置在系統中(Android,IOS等系統),因此無須額外安裝任何軟件
它的操做很是簡單,看上去和操做文件差很少

SharedPreferences
適合存放小量數據

1.代碼操做,不含界面
2.界面打包一塊兒


程序須要保存一些配置信息:
音量大小
屏幕亮度
字體
用戶名
密碼

1.文件
缺點:
Vxxx=78
Sxxxx=100
fontxxx=xxxx
fontsize=18

2.數據庫
缺點;
太誇張
---------------------------------------
文件存儲
在Android中文件(IO流)能夠存放到4個地方:
1.SD卡 這是最推薦的方式,由於SD卡的容量是最大的
2.應用程序內部 這種方式存放的文件沒法被外界獲取,只能經過當前應用程序取得
3.res/raw目錄下 這個目錄下存放的文件會隨程序一塊兒走(會打包到安裝程序中,apk)
4.assets目錄,這個目錄下存放的文件會隨程序一塊兒走(會打包到安裝程序中,apk)

應用程序被安裝到設備中後,會在設備的內置內存的data/data/目錄下創建一個同包名
的目錄,而後全部和當前應用程序有關的數據默認都會存放到這個以包名命名的目錄中
正常狀況下,data/data是沒法訪問的,它授權限保護
除非你的設備被root了

res目錄被稱爲資源目錄,全部Android的資源都存放到這個目錄下,好比佈局,控件,顏色
,圖片等等
而且全部的資源都會在R.java文件中造成對應的ID索引
不過res目錄下的內容在被打包成apk的時候,全部的資源會被轉譯爲二進制格式
可是res目錄下的raw目錄中的內容不會被編譯爲二進制格式

assets目錄被稱爲資產目錄
若是說res資源目錄下的全部資源都會在R.java文件中生成對應的ID
那麼assets資產目錄下的全部資源不會有對應的ID,那麼就意味着操做這些資源只能通
過流操做
assets目錄下的全部文件都會原封不動的打包到apk中

res目錄下的子目錄命名是有隱式規則的,好比你能夠命名一個子目錄叫raw,可是不能命
名爲rew,rsw,raw1
而raw目錄下不容許再出現子目錄
因此大量的,須要分類存放的資源並不適合存放到raw目錄中

而assets目錄徹底由流操做,其本質就是個普通目錄,你想怎麼幹均可以
---------------------------------------
SQLite數據庫文件被建立後,如何打包到apk中和安裝程序一塊兒走
問題:建立SQLite數據庫一般不會採用代碼建立方式,而是提早經過第三方可視化管理工
具來生成
可是生成的這個SQLite數據庫文件如何安放到客戶機上是個大問題


解決辦法:
將SQLite數據庫文件放入到工程的assets目錄中
在安裝後,第一次運行的時候掃描sd卡是否存在sqlite數據庫文件,若是不存在讀取
assets目錄中的數據庫文件經過流寫入到sd卡中

問題:那爲何不直接操做assets目錄中的數據庫呢?
答:由於操做不了
-------------------------------------------------
ContentProvider
暴露數據供外界使用

在Android中數據默認都是私有的(data/data/包/...目錄下)
意味着屬於A程序的數據,永遠不會被A程序以外的程序獲取

若是須要將A程序的數據提供給其餘程序使用,那麼就須要使用到ContentProvider
大概的流程:

|----ContentReceiver ----B程序
A程序 |----ContentReceiver ----C程序
ContentProvider-----ContentReceiver ----D程序
約定一個暗號(Authoritiy)


一個標準的URL由三個部分組成:
1.scheme
2.authoritiy (域名)
3.path (資源)

scheme://authoritiy/path

相關文章
相關標籤/搜索