編輯:關於Android編程
一、Android Introduction
Android 是一個允許你在java環境下為手機設備開發應用和游戲的提供豐富應用框架。
二、四大組件
1、Activity
(1)定義:提供給用戶一個與app進行交互的UI界面的組件
(2)創建
//步驟
(1 繼承Activity或者其子類
(2 必須實現OnCreate()
(3 OnCreate()實現SetContentView(),為這個Activity提供的窗口,添加layout(布局)
(4 在配置文件AndroidManifest.xml中聲明該Activity
(3)生命周期
(4)通過傳遞Intent對象啟動,啟動方式兩種,一種不返回值startActivit(),另一種帶返回值startActivityForResult()
2、Broadcast Receiver
(1)定義:用來應答全系統范圍之內通知的組件,兩種表現形式,一時系統組織的(例如:鎖屏、電量低、截圖),二是自定義的(例如:下載完成數據發送廣播通知),廣播通常只做非常小的事情。
3、Content Provider
(1)定義:管理app共享數據集合的組件,只要該組件允許,其他的app就可以對其進行讀寫操作,例如:通訊錄、圖庫、視頻、音頻。
(2)通過ContentSolver,發送數據請求,接受請求結果並返回。
(3)使用ContentProvider會是應用的數據被其他應用共享,所以應謹慎使用,例如:搜索聯想建議、copy/paste本應用的復雜數據到其他應用中。
4、Service
(1)定義:是一個不需要提供與用戶進行交互UI的,運行在後台,進行長時間操作或者遠程操作的組件。
(2)Service的兩種使用類型:Started和Bound
Started在onStartCommend()方法中接受返回值操作,需要開發者自己管理的啟動與停止。
Bound 是將服務綁定到某一個或某些特定的組件上,不需要開發者關心服務的停止,當該服務上的綁定的組件都解綁時該服務會自動銷毀。
(3) StartService()啟動會激活並將結果返回到onStartCommend()中;BindService()方法激活onBind()方法。
(4)使用技巧:在onCreate()實現服務初始化,針對不同的啟動類型選擇相應的回調方法處理Service信息,在onDestory()中回收資源,例如線程、監聽、廣播接受等等,最重要的一點你的服務需要在配置文件中聲明,同時為了保證你app的安全性最好設置exported屬性為false,但是你的謹慎設置你的enabled屬性,他決定你的service能否被實例化,尤其在綁定服務。
(5)什麼時候用Thread什麼時候用Service?
前因:Service默認運行在當前app進程的主線程中,如果在Service做耗時操作,將有可能導致ANR的發生,耗時操作需要放到線程,但是Service適合執行在後台且不需要與用戶進行交互和返回數據的情形,如果需要在Service中做耗時操作,則需要在Service中開啟線程,其中有很多種選擇:AsynTask、HandleThread或者繼承自帶工作線程的IntentService。
5 、總結
(1)Activity、Broadcast Receiver、Service通過傳遞意圖參數啟動(激活),並且這三者之間可以通過Intent互相交流,Content Provider不需要,它通過Content Resolver啟動(激活)
(2)四大組件都需要被聲明且都具有靜態聲明的方式,但是Broadcast Receiver提供了一種動態聲明的方式:registerReceiver().
三、配置文件-mainfest
1、作用:聲明app權限、組件、版本
2、在Android Studio中,版本控制等設置屬性被遷移到了當前Gradle中,區別Eclipse Ant只能在配置文件內設置.
四、UI
1、手機坐標
默認的左上角坐標為(0,0),水平方向為x軸,垂直方向為y軸
2、布局
(1)LinearLayout-線性布局 屬於ViewGroup類
(1 特點:子布局呈線性分布,在同一時間只能呈現出一個方向的顯示效果,通過orientation設置
(2 layout_gravity:是指當前布局,在最靠近它的父布局中的位置
(3 gravity:設置當前布局內部,子布局的具體位置
(4 layout_weight為當前布局設置在父布局中的權重,但是要注意要將相應方向的屬性值設置為0dp,例如:設置水平方向等分,應將layout_width設置為0dp,默認values是0。
(2)RelativeLayout-相對布局 也屬於ViewGroup類
(1:當出現多個LinearLayout嵌套的時候,可以采用RelativeLayout提高效率(具體用布局分析工具查看)
(2:具有兩種設置位置的方式:一是根據與父布局的相對關系確定;二根據父布局內以確定子布局的位置的相對位置確定;
(3)FrameLayout-幀布局
(4)GridView+ListView
3、計量單位
(1)px、sp(設置文字大小的)、dp(除了文字大小以外的尺寸)
4、TextView、Button、EditView、ImageView
5、R文件
6、View類
(1)onMeasure()\onLayout()\onDraw();
7、回調機制之OnClickListener
8、沙盒
(1)app安裝到設備之後,系統便會為app分配一塊安全區域的“空間”,稱之為sandbox(沙盒)
(2)作用:
(1:首先Android OS是一個多用戶的Linux系統,是每個app成為了多用戶的一份子
(2:系統通過一個獨一無二的Linux user ID管理app,但是app本身並不知道它自己的ID
(3:保證了每一個app都獨立運行在自己的進程中,而且app之間運行過程互不影響。
(4:Android 系統在app中的組件需要被執行的時候,通過ID開啟他們的進程,當app長時間不執行或者系統需要回收內存為其他app提供資源的時候回關掉當前app。
(5:通過最小權限原則保證用戶的可以正常運行的權限,其他權限交由用戶自己選擇是否開啟,這樣營造了一個Android所謂的安全穩固的環境。
(3)提供了兩種方式,打破沙盒限制,實現多個app之間的數據共享以及app可以接入到系統的服務。
(1:通過設置相同的Linux user ID,是多個app運行在一個進程裡,可以互相訪問彼此文件,相同的Linux 進程可以共享具有相同證書簽名的VM裡。
(2:在app首次安裝的時刻,會讓用戶准許需要的權限,實現用戶接入到系統權限(通訊錄,攝像頭、藍牙、SD等等)的目的。
9、設備適配
(1)主要通過App Resource文件下的內容,達到適配的效果.
(2)分類:語言適配、SDK 平台的適配、屏幕尺寸的適配,如果要兼容不能適配的設備,根據以上三種分類,在代碼中動態的判斷。
(3)語言適配:通常的做飯為應用提供支持的語言包,並將語言包存放的合適路徑的strings.xml中,比如我要支持在中文的基礎上額外的支持英文,可創建一個values-en文件夾,將values裡面strings.xml的中文內容對應的翻譯到該文件夾下的strings.xml中,需要注意的是string的name屬性應該保持一致。
(4)屏幕適配:又分為尺寸small、normal、large、xlarge,對應著布局的文件夾layout,其中layout-land對應的是橫屏狀態的屏幕布局。另外,還通過密度區分,主要作用域圖片的文件夾drawable-ldpi、mdpi、hdpi、xdpi等等。
(5)平台適配:主要值得是v系列包的向下兼容,例如
android.app.Activity.Fragment和android.app.Activity.v4.Fragment的使用問題,前者只能在3.0之後使用,二後者可以兼容3.0之前的版本,讓其可以使用Fragment。
10、權限系統
(1)安全證書(認證)
(2)應用簽名(非對稱加密+證書認證):用來區分應用開發者。可以允許操作系統授權或者拒絕應用程序使用簽名級別權限和操作系統授予或者拒絕應用程序請求或者拒絕應用程序使用相同的Linux身份。
(3)通過Linux進程ID實現應用間的文件共享
(4)自定義權限:
android:label="@string/permlab_deadlyActivity"
android:description="@string/permdesc_deadlyActivity"
android:permissionGroup="android.permission-group.COST_MONEY"
android:protectionLevel="dangerous"/>
11、Intents and Intent Filters
(1)定義:Android通知其他組件的執行某種行為操作的信息對象。
(2)使用:啟動Activity(兩種方式)、啟動Service(兩種方式)、deliverBroadcast(兩種方式)
(3)Intent 分類:
(1直接(顯式)意圖:當你啟動一個直接意圖時,系統會立即在當前app根據意圖攜帶的內容,執行相應的操作。
(2 間接(隱式)意圖:當啟動一個叫間接意圖時,系統會找到合適的組件去啟動,所謂合適的組件就是在當前設備上所有app符合Intent Filter所過濾的內容的組件,如果只有一個符合要求的會直接啟動,如果存在多個符合要求的組件,系統會彈出dialog讓用戶自己選擇哪個組件去執行意圖操作。
(4)Intent Filter
(1 定義:在配置文件裡面指定你當前的組件能夠接受的Intent Type,例如,你為你的組件聲明了Intent Filter,其他的應用就可通過該Filter啟動你的組件了。
(2 注意: 如果你想確保你的程序組件是安全的,盡量不要為你的app 組件設定Intent Filter,而是用直接(顯式)意圖實現Intent Filter的功能。
(3 針對Service的 bindService(),5.0以後不允許通過間接(隱式)意圖的方式調用。
(5)Intent
(1 Note:When starting aService, you shouldalways specify the component name. Otherwise, you cannot be certain what service will respond to the intent, and the user cannot see which service starts.
(2 三種指定Intent組件的方式:完整的類名(含包名);調用setComponent(),setClass(),setClassName();用Intent構造函數。
(6)Note:如果使用隱式意圖,設備上的app無法響應你的意圖,你的app 將會終止,所以需要判斷自己設定的Action是否有應答,通過該方法intent.resolveActivity(params);
12、Common Intents(通用的意圖)
(1)具體Intents:
(2)現在Google支持在自己的app 中添加intent-filter,接受其他app請求的Common Intents
13、Loaders
(1)定義:3.0以後引入的,為Activity和 Fragment簡化異步加載數據的工具。主要作用:自動更新最新的內容,向顯示器及時更新顯示最新數據,通常獲取到的都是CursorLoader對象,例如,通訊錄搜索聯系人結果列表;
(2)主要方法:
(1 啟動Loader加載器:initLoader()
(2 重新刷新數據restartLoader()
(3 監聽Loader的狀態(創建、完成加載、重置加載內容)
(4 讀取通訊錄的源碼查看開發文檔
14、Tasks and Back Stack
(1)Task是Activity的集合,用戶與這Task裡的Activity進行交互、並且這些Activity是有序的存儲在Back Stack裡面的。
(2)Task進入後台,它的Activity全部停止,但是Back Stack存儲了各個Activity的狀態,等待Task重新執行的時候,重新resume Activity
(3)管理Task--launchMode
(1 standard(默認方式):在Task中Activity數量隨創建的次數增加,及一個Task中可以存在多個“重復”的Activity。
(2 singleTop:當在當前Task的Back Stack的棧頂存在需要被調用的Activity時,將不會在重新創建該Activity,而是將Intent的內容交於onNewIntent()方法處理。與FLAG_ACTIVITY_SINGLE_TOP作用一致。
(3 singleTask: 當前的或者其他Task中存在某個將要被調用的Activity,該Activity不會再創建,而是將Intent的內容交於onNewIntent()方法處理。與FLAG_ACTIVITY_NEW_TASK作用一致。
(4 singleInstance:跟singleTask類似,唯一區別是這種模式下允許多個Task可以擁有該Activity實例
(4)taskAffinity可以指定當前Activity期望存在的Task名稱,
即如果兩個Activity的Task的taskAffinity相同以singleTask方式啟動Activity時,會將這兩個Activity放到同一個Task中。
(5)如果一個.apk文件中包含了多個“application”,你可能需要用taskAffinity屬性來指定每個“application”中 activity 的 affinity 值。
(6)生命周期圖略
(7)
對於那些不想讓用戶返回的 activity,把元素的finishOnTaskLaunch設為"true"即可。
15.Fragment
(1)生命周期常用方法
(2)與Activity生命周期的關系
(3)為Activity添加一個沒有UI的Fragment
(1 Tag是其唯一的標示
(2 可以執行以下不需要交互的後台操作,比如開啟線程更新進度條實例:FragmentRetainInstanceSupport.java位於:(sdk\extras\android\support\samples\Support4Demos\src\com\example\android\supportv4\app)
·Fragment之間一些比較有趣的方法:setTargetFragment()\setRetainInstance(true)該方法對Fragment生命周期有這很大的影響:onDestroy()will not be called (butonDetach()still will be, because the fragment is being detached from its current activity).
·onCreate(Bundle)will not be called since the fragment is not being re-created.
後者可以配合沒有UI的Fragment進行數據量較大的現場保存公共,實現類似onRestoreInstanceState()等恢復現場的方法。
(4)通過回調實現Activity和Fragment的通信,具體步驟:在Fragment中定義接口,在Activity中實現該接口
(5)Fragment經典用法,為橫屏和豎屏設置兩套布局,橫屏有一個Activity兩個fragment,二豎屏情況下兩個Activity+兩個Fragment組成。第一種情況下,屏幕橫屏狀態布局顯示為左邊是列表狀態,而右邊是詳細內容。
三、實戰:青島美食城項目
(1)SharedPerferences數據存取
(1:匿名的SharedPerferences.getPerference(String)通過String參數只在Activity內部中使用。
(2:SharedPerferences.getSharedPerferences(String, int)通過String參數,在app范圍內使用,通過int控制使用范圍是否可以與其他app共享,api17之後只建議在app內容使用即int參數只支持MODE_PRIVATE;
(3:拓展Android的常見的五種存儲方式
<1>鍵值對的存儲方式:SharePerferences,如上面介紹的那樣。
<2>內部存儲器特點:對app是私有化訪問的,app卸載內容清空,內存不夠系統會自動回收該部分的內存。
<3>外部存儲:分為兩種一種設備自帶的,另一種常用的SD卡,對於設備來說可以被其他app共享的存儲器。
注意:
android:maxSdkVersion="18"/>
...
:操作外部存儲器需要獲取讀寫權限,但是在4.4以後訪問app自己的私有文件是不需要權限的。
getExternalStorageState():使用的時候要先判斷存儲器的狀態,如果存在存儲器再進一步進行操作。
getExternalStoragePublicDirectory():想要將自己的數據與其他app共享,需要存儲到系統提供的公共的文件目錄下,比如:圖庫、音樂、零食等文件夾下(Music/,Pictures/, Ringtones/)傳遞的參數分別為:DIRECTORY_MUSIC,DIRECTORY_PICTURES,DIRECTORY_RINGTONES
<4>數據庫存儲:數據庫存儲的是結構化的數據,對於app來說是私有的。
<5>網絡請求(雲存儲):需要流量請求的數據。使用的操作方法:
Java.net.*/Android.net.*
(2)Json數據手動與自動解析
(3)網絡請求_Volley
(4)RecyclerView列表
(5)WebView
<1>
四、動畫
1、動畫分類:屬性動畫、視圖動畫;視圖動畫又分為補間動畫、幀動畫。
補間動畫(View Animation)
定義:只針對View及其子類的動畫。
常用屬性:位移、縮放、透明度、旋轉。通過在res/anim中添加xml文件來實現,常用的標簽
spaceshipImage.startAnimation(hyperspaceJumpAnimation);
2、幀動畫(Drawable Animation)
定義:針對res/drawable的圖片資源實現類似幻燈片切換的動畫。該動畫的設置同樣是通過xml來設置的。同時該xml動畫文件是應該存放在res/drawable文件目錄下的。
特點:逐幀播放,每一幀對應一張圖片,在xml中常用的標簽
3、屬性動畫(Property Animation)
定義: 3.0 API11之後加入,不局限於View的動畫,所有的對象都可以使用該動畫,這就決定了具備動畫的控件不一定要在屏幕上顯示,它還可以是“幕後”對象。
瞬時數據是指那些存儲在內存當中,有可能會因為程序關閉或其他原因導致內存被回收而丟失的數據。這對於一些關鍵性的數據信息來說是絕對不能容忍的,誰都不希望自己剛發出去的一條微博
QQ厘米秀是騰訊手機QQ推出的全新功能玩法,厘米秀添加了讓人眼前一亮的人物動作互動功能,用戶可以通過手機QQ厘米秀的窗口與好友互動。還有一個故事卡線索功能,
不管是出於什麼樣地考慮,android系統終究是提供了hardware層來封裝了對Linux的驅動的訪問,同時為上層提供了一個統一的硬件接口和硬件形態。一.Hardwar
寫在前面:作為一個剛半只腳踏入android開發的新手,在使用eclipse開發了兩個自我感覺不甚成熟的商城類app之後,遇到了一些問題,總結為如下:1,代碼復用性。fi