編輯:關於Android編程
一個activity呈現了一個用戶可以操作的可視化用戶界面。所有程序的流程都運行在Activity之中,Activity具有自己的生命周期(由系統控制生命周期,程序無法改變,可以用onSaveInstanceState保存其狀態)。
Intent用於啟動Activity, Service, 以及BroadcastReceiver三種組件, 同時還是組件之間通信的重要媒介。
- Intent為組件的啟動提供了一致的編程模型. 無論想要組件是Activity, Service, 還是BroadcastReceiver, 都可以使用Intent封裝啟動的意圖.
- 在某些時候, 應用程序只是想啟動具有某種特征的組件, 並不想和某個特定的組件耦合. 使用Intent可以方便的達到這種高層次解耦的目的.
Intent屬性的設置,包括:
- Action,也就是要執行的動作;
- Data,也就是執行動作要操作的數據,Android中采用指向數據的一個URI來表示,對於不同的動作,其URI數據的類型是不同的(可以設置type屬性指定特定類型數據),如ACTION_EDIT指定Data為文件URI,打電話為tel:URI,訪問網絡為http:URI,而由content provider提供的數據則為content: URIs;
- type(數據類型),顯式指定Intent的數據類型(MIME),一般Intent的數據類型能夠根據數據本身進行判定,但是通過設置這個屬性,可以強制采用顯式指定的類型而不再進行推導;
- category(類別),被執行動作的附加信息,比如LAUNCHER_CATEGORY 表示Intent 的接受者應該在Launcher中作為頂級應用出現;而ALTERNATIVE_CATEGORY表示當前的Intent是一系列的可選動作中的一個;
- component(組件),指定Intent的的目標組件的類名稱。通常 Android會根據Intent 中包含的其它屬性的信息,比如action、data/type、category進行查找,最終找到一個與之匹配的目標組件;
- extras(附加信息),是其它所有附加信息的集合。使用extras可以為組件提供擴展信息;
IntentFilter類表示Intent過濾器, 大部分情況下, 每一個component都會定義一個或多個IntentFilter, 用於表明其可處理的Intent。一般來說, component的IntentFilter應該在AndroidManifest.xml文件中定義,定義的方法:在, , 元素中增加一個或多個子元素。
Service是一個沒有用戶界面的在後台運行執行耗時操作的應用組件。其他應用組件能夠啟動Service,並且當用戶切換到另外的應用場景,Service將持續在後台運行。另外,一個組件能夠綁定到一個service與之交互(IPC機制。
BroadcastReceiver是“廣播接收者”的意思,它是Android四大基本組件之一,這種組件本質上是一種全局的監聽器,用於監聽系統全局的廣播消息。它可以接收來自系統和應用的的廣播。
當Intent發送以後,所有已經注冊的BroadcastReceiver會檢查注冊時的IntentFilter是否與發送的Intent相匹配,若 匹配則就會調用BroadcastReceiver的onReceive()方法。所以當我們定義一個BroadcastReceiver的時候,都需要 實現onReceive()方法。
注冊BroadcastReceiver有兩種方式:
- 一種方式是,靜態的在AndroidManifest.xml中用標簽生命注冊,並在標簽內用標簽設置過濾器。
- 另一種方式是,動態的在代碼中先定義並設置好一個 IntentFilter對象,然後在需要注冊的地方調Context.registerReceiver()方法,如果取消時就調用Context.unregisterReceiver()方法。
Service不是一個進程,它和應用程序在同一個進程中,Service也不是一個線程,它運行在應用程序的主線程中。IntentService繼承自Service。
IntentService使用隊列的方式將請求的Intent加入隊列,然後開啟一個worker thread(線程)來處理隊列中的Intent,對於異步的startService請求,IntentService會處理完成一個之後再處理第二個,每一個請求都會在一個單獨的worker thread中處理,不會阻塞應用程序的主線程。
設置 android:configChanges=”orientation|keyboardHidden”,在2.3上表現為不重新創建activity,4.0如下
a)、android:targetSdkVersion<=”12”,生命周期表現為不重新創建activity;
b)、android:targetSdkVersion>”12”,表現為重新創建activity;
設置android:configChanges=”orientation|keyboardHidden|screenSize”,在2.3和4.0上都表現為不重新創建。
可以將dictionary.db文件復制到Eclipse Android工程中的res/raw目錄中。所有在res /raw目錄中的文件不會被壓縮,這樣可以直接提取該目錄中的文件。
在Android中不能直接打開res aw目錄中的數據庫文件,而需要在程序第一次啟動時將該文件復制到手機內存或SD卡的某個目錄中,然後再打開該數據庫文件。復制的基本方法是使用getResources().openRawResource方法獲得res aw目錄中資源的 InputStream對象,然後將該InputStream對象中的數據寫入其他的目錄中相應文件中。在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法來打開任意目錄中的SQLite數據庫文件。
實現:
private SQLiteDatabase openDatabase(){ try{ // 獲得dictionary.db文件的絕對路徑 String databaseFilename = DATABASE_PATH + "/" + DATABASE_FILENAME; File dir = new File(DATABASE_PATH); // 如果/sdcard/dictionary目錄中存在,創建這個目錄 if (!dir.exists()) dir.mkdir(); // 如果在/sdcard/dictionary目錄中不存在 // dictionary.db文件,則從res\raw目錄中復制這個文件到 // SD卡的目錄(/sdcard/dictionary) if (!(new File(databaseFilename)).exists()){ // 獲得封裝dictionary.db文件的InputStream對象 InputStream is = getResources().openRawResource(R.raw.dictionary); FileOutputStream fos = new FileOutputStream(databaseFilename); byte[] buffer = new byte[8192]; int count = 0; // 開始復制dictionary.db文件 while ((count = is.read(buffer)) > 0){ fos.write(buffer, 0, count); } fos.close(); is.close(); } // 打開/sdcard/dictionary目錄中的dictionary.db文件 SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase( databaseFilename, null); return database; } catch (Exception e){ } return null; }
private final String DATABASE_PATH = android.os.Environment .getExternalStorageDirectory().getAbsolutePath() + "/dictionary"; private final String DATABASE_FILENAME = "dictionary.db";
a:從MVC的角度考慮(應用程序內) ,是為了實現移動或者說嵌入式設備上的MVC架構,它們之間有時候是一種相互依存的關系,有時候又是一種補充關系,引入廣播機制可以方便幾大組件的信息和數據交互。
b:程序間互通消息(例如在自己的應用程序內監聽系統來電);
c:效率上(參考UDP的廣播協議在局域網的方便性); d:設計模式上(反轉控制的一種應用,類似監聽者模式)。
sim卡的文件系統有自己規范,主要是為了和手機通訊,sim本身可以有自己的操作系統,EF就是作存儲並和手機通訊用的。
SIM (Subscriber Identity Module:用戶識別模塊) 卡是一種智能卡, ISO7816中對智能卡作了基本的定義. SIM卡提供給用戶的是它的移動性和便攜性.
SIM卡的硬件組成:
CPU: SIM卡中的CPU和電腦中CPU一樣負責整個SIM卡的控制, 運算和操作;
ROM: 是SIM卡中存放整個片內操作系統的地方;
EPPROM: 相當於SIM卡中的硬盤,存放著整個文件系統和任何需要應用程序讀寫的信息;
RAM: 和計算機RAM的一樣,也是用來存放計算過程中的臨時數據。
嵌入式實時操作系統是指當外界事件或數據產生時,能夠接受並以足夠快的速度予以處理,其處理的結果又能在規定的時間之內來控制生產過程或對處理系統作出快速響應,並控制所有實時任務協調一致運行的嵌入式操作系統。
特點:實時性、可裁剪性、高可靠性、易移植性。
Android操作系統用的內核是linux,而linux內核不屬於實時操作系統范疇。 所以Android不是實時操作系統。
手機短信的長度是由編碼決定的,根據國際標准,每條短信最多發送1120位。
如果發送純英文字符,由於英文ASCII采用單字節的7位編碼,所以1120位的限額可以傳送1120 ÷ 7 = 160個byte。
一旦傳送的字符中包含中文、日文、韓文等雙字節字符,不論中文還是西文,不論全角還是半角,都必須采用2個字節的8位編碼,因此1120 ÷ 8 ÷ 2 = 70個byte,即最多傳送70個字。
andriod提供了Handler 和 Looper 來滿足線程間的通信。Handler先進先出原則。Looper類用來管理特定線程內對象之間的消息交換(MessageExchange)。
1)Looper: 一個線程可以產生一個Looper對象,由它來管理此線程裡的MessageQueue(消息隊列)。
2)Handler: 你可以構造Handler對象來與Looper溝通,以便push新消息到MessageQueue裡,或者接收Looper從Message Queue取出)所送來的消息。
3)Message Queue(消息隊列):用來存放線程放入的消息。
4)線程:UI Thread 通常就是Main Thread,而Android啟動程序時會替它建立一個MessageQueue。
MVC(Model view contraller)表示模型、視圖、控制器。即把一個應用的輸入、處理、輸出流程按照Model、View、Controller的方式進行分離,這樣一個應用被分成三個層——模型層、視圖層、控制層。
模型(Model):就是業務流程/狀態的處理以及業務規則的制定。業務流程的處理過程對其它層來說是黑箱操作,模型接受視圖請求的數據,並返回最終的處理結果。業務模型的設計可以說是MVC最主要的核心。
視圖(View):代表用戶交互界面。
控制(Controller):可以理解為從用戶接收請求,將模型與視圖匹配在一起,共同完成用戶的請求。它就是一個分發器,選擇什麼樣的模型,選擇什麼樣的視圖,可以完成什麼樣的用戶請求。控制層並不做任何的數據處理。
模型、視圖與控制器的分離,使得一個模型可以具有多個顯示視圖。如果用戶通過某個視圖的控制器改變了模型的數據,所有其它依賴於這些數據的視圖都應反映到這些變化。因此,無論何時發生了何種數據變化,控制器都會將變化通知所有的視圖,導致顯示的更新。這實際上是一種模型的變化-傳播機制。
- View 傳送指令到 Controller
- Controller 完成業務邏輯後,要求 Model 改變狀態
- Model 將新的數據發送到 View,用戶得到反饋
Android中MVC的運用:
- View:自定義View或ViewGroup,負責將用戶的請求通知Controller,並根據model更新界面;
- Controller:Activity或者Fragment,接收用戶請求並更新model;
- Model:數據模型,負責數據處理相關的邏輯,封裝應用程序狀態,響應狀態查詢,通知View改變,對應Android中的datebase、SharePreference、ContentProvider等。
DDMS(Dalvik Debug Monitor Service),是安卓開發環境中的Dalvik虛擬機調試監控服務,是一個程序執行查看器,在裡面可以看見線程和堆棧等信息。
Traceview是安卓平台配備的性能分析的工具,可以通過圖形化讓了解要跟蹤的程序的性能,並且能具體到方法(Method)。
TraceView使用:在Manifest中加入sd卡寫權限,在java代碼中 onCreate裡面面添加Debug.startMethodTracing(),在onStop面添加Debug.stopMethodTracing()。運行一遍後會在sd卡目錄下生成一個trace文件,導出到電腦再用TraceView執行可查看程序的性能。
可以用JNI(Java Native Interface)接口。
IPC即進程間通信(Interprocess Communication),Android中的IPC機制是為了讓Activity和Service之間可以隨時的進行交互,故在Android中,該機制只適用於Activity和Service之間的通信,類似於遠程方法調用,類似於C/S模式的訪問。通過定義AIDL接口文件來定義IPC接口。Servier端實現IPC接口,Client端調用IPC接口的本地代理。
NDK是一些列工具的集合,NDK提供了一系列的工具,幫助開發者迅速的開發C/C++的動態庫,並能自動將so和java 應用打成apk包。
NDK集成了交叉編譯器,並提供了相應的mk文件和隔離cpu、平台等的差異,開發人員只需簡單的修改mk文件就可以創建出so庫。
理解球坐標系首先看下球的坐標系 ,如圖 : (圖來自百度百科 ) 設球上有一點 A ,球心為O ,OA在 xOy上的投影與X軸夾角為φ (范圍
前言現在看來其實更像是一篇知識概括,多處可能未講清楚,於是打算重寫事件分發,用一篇文章大致講清楚。首先,形式上筆者最先思考的是使用源碼,此者能從原理上講解分發機制,比起侃
圖片輪播Banner現在算是比較常見的功能了,可以用來循環播放廣告或者是熱門內容在這裡我利用ViewPager模擬實現了Banner的功能,效果圖如下:可以看到,在剛打開
在API21中Google就發布了Camera2類來取代Camera類,那麼這個Camera2類到底改變了那些地方呢,我們來看官方的說法:Camera2 APISuppo