Activity和Application
Activity簡(jiǎn)介
一個(gè)Activity代表一個(gè)單獨(dú)的窗口
一個(gè)應(yīng)用程序中會(huì)有一個(gè)Activity被指定為主界面
Activity用于提供可視化用戶界面的組件,可以與用戶進(jìn)行交互來完成某項(xiàng)任務(wù)
Activity在實(shí)現(xiàn)時(shí),被定義為一個(gè)獨(dú)立的類,并繼承android.App.Activity類或其子類
Activity生命周期:
概念
Activity由Activity棧進(jìn)行管理
當(dāng)一個(gè)新的Activity啟動(dòng)時(shí)被放置到棧頂,成為運(yùn)行中的Activity,前一個(gè)Activity保留在棧中,不再放到前臺(tái),直到新的Activity退出為止
Activity棧符合“后進(jìn)先出”原則,當(dāng)用戶完成當(dāng)前Activity并單擊Back按鈕時(shí),該Activity會(huì)被彈出棧,并被銷毀,然后恢復(fù)之前的Activity。
模型
onCreate() 第一次創(chuàng)建Activity
onStart() 啟動(dòng)Activity
onResume() 由暫?;謴?fù)到使用
onPause() 暫停Activity
onStop() 停止Activity
onDestory() 銷毀Activity
四種狀態(tài)
運(yùn)行狀態(tài)(Active/Running)
在屏幕的前臺(tái)(棧頂)
暫停狀態(tài)(Paused)
失去焦點(diǎn),但依然可見(非全屏的Activity或透明的Activity被放置在棧頂)
停止?fàn)顟B(tài)(Stopped)
一個(gè)Activity被另外的Activity完全覆蓋,不再可見
銷毀狀態(tài)(Killed)
通過結(jié)束Activity或殺掉進(jìn)程的方式,將處于暫?;蛲V?fàn)顟B(tài)的Activity從內(nèi)存中刪除
三個(gè)關(guān)鍵循環(huán)
整個(gè)生命周期
從onCreate()開始到onDestroy()結(jié)束
可見生命周期
從onStart()開始到onStop()結(jié)束
在屏幕中可見,但不能在前臺(tái)可見
前臺(tái)生命周期
從onResume()開始到onPause()結(jié)束
在所有Activity的最前面,可以與用戶交互
Activity類中的常用方法
方法描述setContentView(int layoutResID)設(shè)置Activity界面布局onCreate(Bundle savedInstanceState)Activity生命周期的方法,用于第一次創(chuàng)建ActivityonStart()Activity生命周期的方法,用于啟動(dòng)ActivityonPause()Activity生命周期的方法,用于暫停ActivityonStop()Activity生命周期的方法,用于停止ActivityonDestory()Activity生命周期的方法,用于銷毀ActivityonResume()Activity生命周期的方法,將Activity由暫停狀態(tài)恢復(fù)使用onRestart()Activity生命周期的方法,將Activity由停止?fàn)顟B(tài)恢復(fù)使用onKeyDown(int keyCode.KeyEvent event)鍵盤按鍵下時(shí)的動(dòng)作事件處理方法onKeyUp(int keyCode.KeyEvent event)鍵盤按鍵抬起時(shí)的動(dòng)作事件處理方法onTouchEvent(MotionEvent event)監(jiān)聽屏幕的觸摸事件處理方法openContextMenu(View view)開啟上下文菜單setResult(int resultCode)返回?cái)?shù)據(jù)給上一個(gè)ActivitystartActivity(Intent intent) startActivityForResult(Intent intent,int requestCode)攜帶數(shù)據(jù)并跳轉(zhuǎn)Activityfinish()結(jié)束當(dāng)前Activity
AppcompaActivity相對(duì)于Activity的兩點(diǎn)變化
AppcompaActivity帶有toolbar的標(biāo)題欄,Activity主界面沒有
theme主題只能用android:theme="@style/AppTheme"(AppTheme主題或其子類)
Log日志信息
方法描述Log.e()記錄錯(cuò)誤信息Log.w()記錄警告信息Log.i()記錄一般提示信息Log.d()記錄調(diào)試信息Log.v()記錄詳細(xì)信息
資源管理
概念
資源是指在代碼中使用的外部文件,包括圖片、音頻、動(dòng)畫和字符串等
在程序中如果直接使用這些資源,會(huì)給閱讀和維護(hù)源碼帶來不便
Android對(duì)資源的定義進(jìn)行改變,將應(yīng)用中所用到的各種資源中在res目錄中定義,并為每個(gè)資源自動(dòng)生成一個(gè)編號(hào),在應(yīng)用程序中可以直接通過編號(hào)來訪問這些資源
在Android應(yīng)用程序中,除res目錄外,assets目錄也用于存放資源
res目錄和assets目錄的區(qū)別
assets目錄存放應(yīng)用程序無法直接訪問的原生資源,需要通過AssetsManager類以二進(jìn)制流的形式來讀取資源
res目錄中的資源會(huì)由Android SDK在編譯時(shí),在R.java文件中為這些資源創(chuàng)建索引,程序可以通過資源清單類R.java對(duì)資源進(jìn)行訪問
資源分類
Android常用的資源
string、colors、arrays、anim(動(dòng)畫)、layout、drawable(圖像和圖標(biāo))、media(音頻)
分類
原生資源:無法通過由R類進(jìn)行索引的原生資源(assets下)
索引資源:可以通過R類進(jìn)行自動(dòng)索引的資源(res下)
通常指res目錄下的資源
Android資源目錄
目錄描述/res/animator/存放定義屬性動(dòng)畫的XML文件/res/anim/存放定義了補(bǔ)間動(dòng)畫或逐幀動(dòng)畫的XML文件/res/color/存放定義了不同狀態(tài)下顏色列表的XML文件/res/drawable/存放能轉(zhuǎn)換為繪制資源的位圖文件或定義了繪制資源的XML文件/res/mipmap/存放能轉(zhuǎn)換為繪制應(yīng)用啟動(dòng)圖標(biāo)資源的位圖文件/res/layout/存放各種界面布局文件,每個(gè)Activity對(duì)應(yīng)一個(gè)XML文件/res/menu/存放為應(yīng)用程序定義的各種菜單資源/res/raw/存放直接復(fù)制到設(shè)備中的任意文件/res/values/存放定義多種類型資源的XML文件/res/xml/存放任意的原生XMIL文件/assets/存放原生資源,包括音頻文件、視頻文件等
res/drawable文件夾
文件夾名dpi范圍建議尺寸drawable-ldpi0-120無drawable-mdpi120-16048*48drawable-hdpi160-24072*72drawable-nodpi無關(guān)原尺寸drawable-xhdpi240-32096*96drawable-xxhdpi320-480144*144drawable-xxxhdpi480-640192*192
適配規(guī)則
Android首先會(huì)選擇drawable-mdpi文件夾下的圖片,文件夾下有這張圖就會(huì)優(yōu)先被使用,圖片不會(huì)被縮放;
但是如果沒有在drawable-mdpi的文件夾下找到相應(yīng)圖片,Android系統(tǒng)會(huì)首先從更高一級(jí)的drawable-hdpi文件夾中查找,如果找到圖片資源就進(jìn)行縮放處理,顯示在屏幕上;
如果drawable-hdpi文件夾下也沒有,就依次往drawable-xhdpi文件夾、 drawable-xxhdpi文件夾、drawable-xxxhdpi文件夾、drawable-nodpi查找;
如果更高密度的文件夾里都沒有找到,就往更低密度的文件夾下查找;
如果都沒找到,最終會(huì)在默認(rèn)的drawable文件夾中尋找,如果默認(rèn)的drawable文件夾中也沒有,則會(huì)報(bào)錯(cuò)。
res/mipmap目錄
mipmap:為了加快渲染速度和減少圖像鋸齒,貼圖被處理成由一系列被預(yù)先計(jì)算和優(yōu)化過的圖片組成的文件,這樣的貼圖被稱為mipmap。
適配不同的設(shè)備
drawable與mipmap的區(qū)別
在App中,無論你將圖片放在drawable還是mipmap目錄,系統(tǒng)只會(huì)加載對(duì)應(yīng)密度中的圖片。
在Launcher中,如果使用mipmap,那么Launcher會(huì)自動(dòng)加載更加合適的密度的資源。
應(yīng)用內(nèi)使用到的圖片資源,并不會(huì)因?yàn)槟惴旁趍ipmap或者drawable目錄而產(chǎn)生差異。
單純只是資源路徑的差異R.drawable.xxx或者R.mipmap.xxx。(也可能在低版本系統(tǒng)中有差異)
自動(dòng)跨設(shè)備密度展示的能力是launcher的,而不是mipmap的。
_XML資源文件
分類
strings.xml:用于定義文本內(nèi)容的資源文件
colors.xml:用于定義顏色設(shè)置的資源文件
dimens.xml:用于定義尺寸的資源文件
styles.xml:用于定義主題和樣式的資源文件
文本資源文件
strings.xml文本資源文件
res\values\strings.xml
?<?xml version="1.0" encoding="utf-8"?>
?<resources>
? <string name="title">Resources</string>
? ? ?<string name="message">Hello World!</string>
? ? ?<string name="error">Wrong resource!</string>
?</resources>
Java代碼中訪問字符串
?CharSequence AppName = getString(R.string.title);
?CharSequence display = getString(R.string.message);
XML文件中訪問字符串資源
?android:App_name="@string/title"
?android:display="@string/message"
顏色資源文件
顏色值的聲明方式
#RGB
#ARGB
#PRGGBB
#AARRGGBB
語法
?<color name=color_name>#color_value</color>
示例
?<?xml version="1.0" encoding="utf-8"?>
?<resources>
? <color name="text_color">#F00</color>
? ? ?<color name="translucent_blue">#800000ff</color>
?</resources>
Java中訪問顏色
?int color1 = ContextCompat.getColor(context,R.color.blue);
?int color2 = ContextCompat.getColor(context,R.color.translucent_blue)
在API 23以前的低版本中,使用getResources().getColor(colorRes)方法訪問顏色資源,新版本已經(jīng)用ContextCompat.getColor(context,colorRes)代替。
dimens.xml尺寸定義資源文件
測(cè)量單位描述資源標(biāo)記示例像素實(shí)際的屏幕像素px10px英寸物理測(cè)量單位in6in毫米物理測(cè)量單位mm4mm點(diǎn)普通字體測(cè)量單位pt12pt密度獨(dú)立像素相對(duì)于160pi屏幕的像素dp3dp比例獨(dú)立像素對(duì)于字體顯示的測(cè)量sp10sp
dimens.xml
?<?xml version="1.0" encoding="utf-8"?>
?<resource>
? <dimen name="one_pixel">1px</dimen>
? ? ?<dimen name="two_inches">2in</dimen>
? ? ?<dimen name="doublke_density">2dp</dimen>
? ? ?<dimen name="fourteen_sp">14sp</dimen>
?</resource>
Java中訪問
?float dimen = getResources.getDimension(R.dimen.one_pixel);
?float dimen = getResources.getDimension(R.dimen.fourteen_sp);
XML中訪問
?android:textSize = "@dimen/fourteen_sp"
?android:textSize = "@dimen/double_density"
sytles.xml主題風(fēng)格資源文件
?<sytle name = style_name>
? <item name = item_name>Hex value|string value|reference</item>
?</sytle>
Java中訪問樣式資源
?setTheme(R.style.ThemeNew);
?setTheme(R.style.myStyle);
XML中訪問樣式資源
?android:App_name="@style/ThemeNew"
?android:display="@style/myStryle"
AndroidManifest.xml清單文件
Android應(yīng)用程序的全局描述配置文件
每一個(gè)Android應(yīng)用程序必須有且放在根目錄下
包含信息
聲明應(yīng)用程序的包名
描述應(yīng)用程序組件
確定宿主應(yīng)用組件進(jìn)程
聲明應(yīng)用程序擁有的權(quán)限
定義應(yīng)用程序所支持API的最低等級(jí)
列舉應(yīng)用程序必須鏈接的庫(kù)
設(shè)置清單文件的屬性時(shí)需要遵守幾項(xiàng)規(guī)則:
元素:在所有的元素中只有
和
是必需的且只能出現(xiàn)一次
屬性:元素的屬性大部分是可選的但有少數(shù)屬性是必須設(shè)置的
定義類名:所有的元素名都對(duì)應(yīng)其在SDK中的類名
多數(shù)值項(xiàng):如果某個(gè)元素有超過一個(gè)數(shù)值時(shí),必須通過重復(fù)的方式來說明該元素的某個(gè)屬性具有多個(gè)數(shù)值項(xiàng),且不能將多個(gè)數(shù)值項(xiàng)一次性說明在一個(gè)屬性中
資源項(xiàng)說明:需要引用某個(gè)資源時(shí),采用“@[package:]type:name”格式進(jìn)行引用
字符串值:類似于其他語言
自定義權(quán)限使用
元素聲明
?<permission
? ? ? ? ? ? ?android:label="自定義權(quán)限"
? ? ? ? ? ? ?android:description="@string/test"
? ? ? ? ? ? ?android:name="com.example.project.TEST"
? ? ? ? ? ? ?android:protectionLevel="normal"
? ? ? ? ? ? ?android:icon="@drawable/ic_launcher">
?</permission>
Android的不同權(quán)限級(jí)別的區(qū)分如下:
normal:低風(fēng)險(xiǎn)
dangerous:高風(fēng)險(xiǎn)
signature:簽名權(quán)限
signatureOrSystem:簽名或系統(tǒng)權(quán)限
Android應(yīng)用程序生命周期
Android應(yīng)用程序的生命周期是指在Android系統(tǒng)中進(jìn)程從啟動(dòng)到終止的所有階段,即Android程序啟動(dòng)到停止的全過程
程序的生命周期由Android系統(tǒng)進(jìn)行調(diào)度和控制
在系統(tǒng)內(nèi)存不足的情況下,Android系統(tǒng)會(huì)選擇性的終止一些重要性比較低的應(yīng)用程序,以便回收內(nèi)存供更重要的應(yīng)用程序使用
Android根據(jù)應(yīng)用程序的組件及組件當(dāng)前運(yùn)行狀態(tài)將所有的進(jìn)程按重要性程度從高到低劃分為5個(gè)優(yōu)先級(jí)
前臺(tái)進(jìn)程:顯示在屏幕前端并與用戶交互
可見進(jìn)程:部分程序界面可見,卻不能與用戶交互
服務(wù)進(jìn)程:由startService()方法啟動(dòng)服務(wù)的進(jìn)程
后臺(tái)進(jìn)程:不包含任何已經(jīng)啟動(dòng)的服務(wù),且沒有任何可見的Activity的進(jìn)程
空進(jìn)程:不包含任何活躍組件的進(jìn)程
Application類、樣式和主題
Application類
android.App.Application類代表當(dāng)前運(yùn)行的應(yīng)用程序。
應(yīng)用程序啟動(dòng)時(shí),系統(tǒng)會(huì)自動(dòng)創(chuàng)建對(duì)應(yīng)Application類的實(shí)例,并一直伴隨應(yīng)用程序的生命周期,且始終維持一個(gè)實(shí)例。
Application適合保存應(yīng)用程序多個(gè)組件都需要訪問的對(duì)象。
通過擴(kuò)展Application類,可以完成3項(xiàng)工作:
對(duì)Android運(yùn)行時(shí)廣播的應(yīng)用程序級(jí)事件(如低內(nèi)存)做出響應(yīng)
在應(yīng)用程序組件之間傳遞對(duì)象
管理和維護(hù)多個(gè)應(yīng)用程序組件所使用的資源
Application生命周期事件
Application類為應(yīng)用程序的創(chuàng)建和終止、低可用內(nèi)存和配置的改變提供了事件處理程序∶
在重寫這些方法時(shí)必須調(diào)用父類的事件處理程序
onCreate()
onLowMemory()
onTrimMemory()
onConfigurationChanged()
實(shí)現(xiàn)Application
步驟
創(chuàng)建一個(gè)類繼承Application
在Activity中使用Application類
運(yùn)行
樣式和主題
樣式:一個(gè)包含一種或者多種格式的集合,一般作為一個(gè)單位用于XML布局的某個(gè)元素中。
主題:一個(gè)包含一種或者多種格式的集合,通常作為一個(gè)單位應(yīng)用到Activity中。
程序中的樣式
步驟:
在res/values目錄下新建一個(gè)名為style.xml的文件,并增加
元素作為根元素
為
元素增加一個(gè)全局唯一的name屬性
在
元素內(nèi)部聲明一個(gè)或者多個(gè)
元素,每一個(gè)
元素用于定義了一個(gè)name屬性,并在元素的內(nèi)部進(jìn)行賦值
引用在其它XML中已經(jīng)定義的資源
樣式的聲明
?<?xml version="1.0" encoding="utf-8"?>
?<resources>
? <style name="SpecialText" parent="@style/Text">
? ? ? <itme name="android:textSize">18sp</itme>
? ? ? ? ?<itme name="android:textColor">#008</itme>
? ? ?</style>
?</resources>
樣式的引用
?<EditText id="@+id/text1"
? ? ? ? ? ?style="@style/SpecialText"
? ? ? ? ? ?android:layout_width="fill_parent"
? ? ? ? ? ?android:layout_height="wrap_content"
? ? ? ? ? ?android:text="Hello,World!" />
程序中的主題
主題的聲明
?<?xml version="1.0" encoding="utf-8"?>
?<resources>
? <style name="CustomTheme">
? ? ? <item name="android:windowNoTitle">true</item>
? ? ? ? ?<item name="windowFrame">@drawable/screen_frame</item>
? ? ? ? ?<item name="windowBackground">@drawable/screen_background_white</itme>
? ? ? ? ?<item name="panelForegroundColor">#FF000000</itme>
? ? ? ? ?<item name="panelBackgroundColor">#FFFFFFFF</item>
? ? ? ? ?<item name="panelTextColor">?paneForgroundColor</item>
? ? ? ? ?<item name="panelTextSize">14</item>
? ? ? ? ?<item name="menuItemTextColor">?panelTextColor</item>
? ? ? ? ?<item name="menuItemTextSize">?panelTextSize</item>
? ? ?</style>
?</resources>
設(shè)定所有Activity都使用同一主題
?<Application android:theme="@style/CustomTheme">
設(shè)定某個(gè)Activity使用某一主題
?<activity android:theme="@style/CustomTheme">
設(shè)置Activity為內(nèi)置的對(duì)話框主題
?<activity android:theme="@android:style/Theme.Dialog">
繼承Theme.Dialog主題生成一個(gè)新主題
?<style name="CustomDialogTheme" parent="@android:style/Theme.Dialog">
在Activity程序中設(shè)置主題
?protected void onCreate(Bundle savedinstanceState){
? ? ?super.onCreate(savedInstanceState);
? ? ?......
? ? ?setTheme(android.R.style.Theme_Light);
? ? ?setContentView(R.layout.linear_layout_3);
? ? ?
?}
? ? ?
在Activity中加載主題時(shí),主題中不能包括任何系統(tǒng)啟動(dòng)該Activity所使用的動(dòng)畫,這些動(dòng)畫將在程序啟動(dòng)前顯示。
在清單文件中配置Activity對(duì)話框格式主題
?<activity android:name".ThemeDemo01Activity"
? ? ? ? ? ?android:theme="@android:style/Theme.Dialog">
?
?</activity>
java中設(shè)置Activity對(duì)話框格式主題
?protected void onCreate(Bundle savedInstanceState){
? ? ?super.onCreate(savedInstanceState);
? ? ?setTheme(android.R.style.Theme_Dialog);
? ? ?setContentView(R.layout.activity_theme_demo02);
?}