編輯:關於Android編程
Activity:activity是用戶和應用程序交互的窗口,一個activity相當於我們實際中的一個網頁,當打開一個屏幕時,之前的那一個屏幕會被置為暫停狀態,並且壓入歷史堆棧中,用戶可以通過回退操作返回到以前打開過的屏幕。activity的生命周期:即“產生、運行、銷毀”,但是這其中會調用許多方法onCreate(創建) 、onStart(激活)、onResume(恢復)、onPause(暫停)、onStop(停止)、onDestroy(銷毀)、onRestart(重啟)。
Service:Service是一種程序,它可以運行很長的時間,相當於後台的一個服務,通過startService(Intent service)可以啟動一個Service,通過Context.bindService()可以綁定一個Service。
BroadCastRecevicer:接受一種或者多種Intent作觸發事件,接受相關消息,做一些簡單處理,轉換成一條Notification,統一了Android的事件廣播模型。可以使用BroadcastReceiver來讓應用對外一個外部的事件作出響應。Broadcast Receiver通過NotificationManager來通知用戶這些事情發生了,BroadcastReceiver注冊的有兩種方式,一種是可以在AndroidManifest.xml中注冊,另一種可以在運行時的代碼中使用Context.registerReceiver()進行注冊。用戶還可以通過Context.sendBroadcast()將他們自己的intent broadcasts廣播給其他的應用程序。
Content provider:內容提供者,可通過它來共享自己的數據給外部調用,給第三方應用提供數據訪問的接口。
如果自定義適配器,那麼在getView方法中要考慮方法傳進來的參數contentView是否為null,如果為null就創建contentView並返回,如果不為null則直接使用。在這個方法中盡可能少創建view。
給contentView設置tag(setTag()),傳入一個viewHolder對象, 用於緩存要顯示的數據,可以達到圖像數據異步加載的效果。
如果listview需要顯示的item很多,就要考慮分頁加載。比如一共要 顯示100條或者更多的時候,我們可以考慮先加載20條,等用戶拉到列表 底部的時候再去加載接下來的20條。分頁加載還沒學習。
Android提供了五種存取數據的方式 (1)SharedPreference,存放較少的五種類型的數據,只能在同一個包內使 用,生成XML的格式存放在設備中 (2) SQLite數據庫,存放各種數據,是一個輕量級的嵌入式數據庫 (3) File文件,通過讀取寫入方式生成文件存放數據 (4) ContentProvider,主要用於讓其他應用程序使用保存的數據 (5)通過網絡獲取數據和寫入數據到網絡存儲空間
最常用的布局有以下這幾種: 第一種:幀布局(框架布局)FrameLayout 第二種:線性布局LinearLayout 第三種:絕對布局AbsoluteLayout 第四種:相對布局RelativeLayout 第五種:表格布局TableLayout
采用ArrayAdapter、SimpleAdapter和SimpleCursorAdapter這些系統自帶的適配器,對於事件的響應只能局限在一個行單位。 假設一行裡面有一個按鈕控件,它們之間的響應操作是不一樣的。若采用系統自帶的適配器,就不能精確到每個控件的響應事件。這時,我們一般采取自定義適配器來實現這個比較精確地請求。
res/raw和assets的相同點:
兩者目錄下的文件在打包後會原封不動的保存在apk包中,不會被編譯成二進制。
res/raw和assets的不同點:
(1)res/raw中的文件會被映射到R.Java文件中,訪問的時候直接使用資源ID即 R.raw.filename;assets文件夾下的文件不會被映射到R.java中,訪問的時候需要AssetManager類。
(2)res/raw不可以有目錄結構,而assets則可以有目錄結構,也就是assets目錄下可以再建立文件夾
(3)讀取文件資源舉例:
讀取res/raw下的文件資源,通過以下方式獲取輸入流來進行寫操作
InputStream is = getResources().openRawResource(R.raw.filename);
讀取assets下的文件資源,通過以下方式獲取輸入流來進行寫操作
AssetManager am = null;
am = getAssets();
InputStream is = am.open(“filename”);
Intent是一種在不同組件之間傳遞的請求消息,是應用程序發出的請求和意圖。對於明確指出了目標組件名稱的Intent,我們稱之為顯式Intent。對於沒有明確指出目標組件名稱的Intent,則稱之為隱式Intent。Android系統使用IntentFilter 來尋找與隱式Intent相關的對象。
顯式Intent直接用組件的名稱定義目標組件,這種方式很直接。但是由於開發人員往往並不清楚別的應用程序的組件名稱,因此,顯式Intent更多用於在應用程序內部傳遞消息。比如在某應用程序內,一個Activity啟動一個Service。
隱式Intent恰恰相反,它不會用組件名稱定義需要激活的目標組件,它更廣泛地用於在不同應用程序之間傳遞消息。
1:服務器端寫AIDL 2:服務器端繼承Service,重寫3個方法 3:服務器端實例化一個AIDL定義接口的Stub對象,並實現接口的抽象方法; 4:配置文件
1:拷貝AIDL文件 2:綁定與Service端的服務 3:實現ServiceConnection,在實現的過程中通過Service端傳遞過來的IBinder得到Stub對象;例如:接口名.Stub.asInterface(service); 4:通過Stub對象調用相應方法
Service的生命周期由使用Service兩種方式決定,啟動方式不同生命周期不同。
(1)Start方式啟動Service的生命周期: onCreate()—onStartCommond()—onDestroy() 調用者和服務之間沒有任何的聯系,即使調用者退出,那麼服務也仍然進行。 (2)Bind方式啟動Service的生命周期:onCreate()->onBind()->–>onUnbind() -> onDestroy() 調用者和服務綁定在一起,調用者退出,服務即便退出。
采用ArrayAdapter、SimpleAdapter和SimpleCursorAdapter這些系統自帶的適配器,對於事件的響應只能局限在一個行單位。假設一行裡面有一個按鈕控件,它們之間的響應操作是不一樣的。若采用系統自帶的適配器,就不能精確到每個控件的響應事件。這時,我們一般采取自定義適配器來實現這個比較精確地請求。
public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; if(convertView==null){ viewHolder=new ViewHolder(); convertView=LayoutInflater.from(c).inflate(R.layout.list_item, null); viewHolder.text=(TextView) convertView.findViewById(R.id.item_text); viewHolder.image=(ImageView) convertView.findViewById(R.id.item_image); convertView.setTag(viewHolder); } viewHolder=(ViewHolder) convertView.getTag(); viewHolder.text.setText(list.get(position).getText()); viewHolder.image.setImageResource(list.get(position).getImage()); return convertView; } static class ViewHolder{ TextView text; ImageView image; }
第一:得到ContentResolver類對象 ContentResolver cr=getContentResolver(); 第二:定義要查詢的字段String數組 第三:使用cr.query();返回一個Cursor對象 第四:使用while循環得到Cursor裡面的內容
1)繼承Android的ContentProvider基類實現自己的ContentProvider類。 2)實現 ContentProvider裡的onCreate方法,創建provider的數據,一般為數據庫sqlite,那麼我們在onCreate裡實例化一個SqliteOpenHelper。 3)在ContentProvider 裡面重寫insert/delete/update/query增刪改查這些方法。在每個方法裡面實現相應的功能。 4)在AndroidManifest.xml文件中注冊該ContentProvider類,為ContentProvider指定Uri。
在布局文件中添加ImageView組件,設置background為res/anim/fram.xml動畫效果 通過ImageView對象的getBackground()方法得到AnimationDrawable對象 通過AnimationDrawable對象的start()來啟動幀動畫,stop()來停止動畫
兩者都會原封不動的保存在apk包中,不會被編譯成二進制碼。
1、raw目錄下只能存放文件,不能存放下一級的文件夾,而assets可以存放下一級的文件夾。 2、raw目錄下的資源會映射到R.java中生成資源id。而assets不會。 3、獲得資源的方法不同。代碼如下: this.getAssets().open(“xml/channels.xml”) this.getResources().openRawResource(R.raw.students) this.getClassLoader().getResourceAsStream(“student.xml”)
Andriod提供了 Handler 和 Looper 來滿足線程間的通信。
Android不允許UI線程之外的線程改變UI組件的值,所以要想在其他線程裡面改變UI組件的值,必須使用Handler來實現。 Looper: 一個線程可以產生一個Looper對象,由它來管理此線程裡的Message Queue(消息隊列)。 Handler: 你可以構造Handler對象來與Looper溝通,以便push(上傳)新消息到Message Queue裡;或者接收Looper從Message Queue取出的消息。 Message Queue(消息隊列,特點:先進先出):用來存放線程放入的消息。 線程:UI thread 通常就是main thread,而Android啟動程序時會替它建立一個Message Queue。 Handler、Looper、MessageQueue的初始化流程如下所示。 Hander持有對UI主線程消息隊列UI_MQ和消息循環Looper的引用,子線程可以通過Handler將消息發送到UI線程的消息隊列UI_MQ中。 Handler處理消息 UI主線程通過Looper循環查詢消息隊列UI_MQ,當發現有消息存在時會將消息從消息隊列中取出。首先分析消息,通過消息的參數判斷該消息對應的Handler,然後將消息分發到指定的Handler進行處理。
1、建立一個類繼承SqliteOpenHelper,聲明一個構造方法,參數包括(Context,name,CursorFactory,version);創建數據庫 2、實現其oncreate() 創建表 3:通過onupgrade() 版本號更新時執行; 4、實例化所建類對象,對其進行讀寫操作,執行sql語句創建數據庫(當對其使用讀寫時會判斷數據庫是否存在,如果存在,則不執行oncreate,不存在則執行)。
1、通過SqliteOpenHelper得到SqliteDataBase的實例化對象(分為讀寫兩種); 2、調用execSQL()執行增刪改的SQL語句,傳入SQL語句及需要填充的參數; 調用Cursor cursor = rawQuery()執行查詢的語句 3、對執行SQL語句返回的游標,進行遍歷; 4、及時關閉SqliteDataBase。
(1)Sqlite是嵌入式SQL數據庫引擎SQLite(SQLite Embeddable SQL Database Engine)的一個擴展。SQLite是一個實現嵌入式SQL數據庫引擎的 C語言庫(C library)。用SQLite連接的程序可以使用SQL數據庫,但不需要運行一個單獨的關系型數據庫管理系統進程(separate RDBMS process)。SQLite直接讀寫(reads and writes directly)在硬盤上的數據庫文件。
(2)SharedPreferences也是一種輕型的數據存儲方式,它的本質是基於XML文件存儲key-value鍵值對數據,通常用來存儲一些簡單的配置信息。其存儲位置在/data/data/<包名>/shared_prefs目錄下。SharedPreferences對象本身只能獲取數據而不支持存儲和修改,存儲修改是通過Editor對象實現。
Sql只能在該工程的內部共享數據,ContentProvider能在工程之間實現數據共享。
URI由是部分組成:
content://com.example.transportation/trains/122
A,標准的前綴: ContentProvider(內容提供者)的scheme已經由Android所規定, scheme為:content://
B,唯一標識整個Content Provider: 主機名(或叫Authority)用於唯一標識這個ContentProvider,外部調用者可以根據這個標識來找到它。
C,描述了數據的路徑,確定返回哪類數據: 路徑(path)可以用來表示我們要操作的數據,路徑的構建應根據業務而定
D,ID唯一標注請求的數據: 我們要請求數據的ID
1) 通過ContentResolver訪問系統多媒體提供的ContentProvider,得到多媒體音樂的cursor 2) 解析cursor,通過cursor得到對應文件列表 3) 設置listView,根據格式不同展示不同圖片,進行使用
繼承Android的ContentProvider基類實現自己的ContentProvider類。 實現 ContentProvider裡的onCreate方法,創建provider的數據,一般為數據庫sqlite,那麼我們在onCreate裡實例化一個SqliteOpenHelper。 在ContentProvider 裡面重寫insert/delete/update/query增刪改查這些方法。在每個方法裡面實現相應的功能。 在AndroidManifest.xml文件中注冊該ContentProvider類,為ContentProvider指定Uri。
1:得到ContentResolver類對象:ContentResolver cr = getContentResolver(); 2:定義要查詢的字段String數組。 3:使用cr.query(URI,字段數組,null, null,null);,返回一個Cursor對象。 4:使用while循環得到Cursor裡面的內容。
(1)SharedPreference,存放較少的五種類型的數據,只能在同一個包內使用,生成XML的格式存放在設備中 (2) SQLite數據庫,存放各種數據,是一個輕量級的嵌入式數據庫 (3) File文件,通過讀取寫入方式生成文件存放數據 (4) ContentProvider,主要用於讓其他應用程序使用保存的數據 (5)通過網絡獲取數據和寫入數據到網絡存儲空間
1)補間動畫:(你定義一個開始和結束,中間的部分由程序運算得到。就是對場景裡的對象不斷的進行圖像變化來產生動畫效果(旋轉、平移、放縮和漸變))AlphaAnimation(漸變型動畫)、scaleAnimation(縮放型動畫)、 TranslateAnimation(平移型動畫)、 RotateAnimation(旋轉型動畫)、 2)逐幀動畫:Frame(把一連串的圖片進行系列化連續播放,如同放電影的效果),它是通過播放一張一張圖片來達到動畫的效果;
1)在res/anim文件夾下配置動畫對應標簽,配置對應參數,包含初始值,動畫結束值,以及動畫時間 2)通過AnimationUtils.loadAnimation加載XML動畫文件 3)調用startAnimation方法開啟動畫
1)直接New出需要的補間動畫的對象,傳遞相應的參數 2)調用startAnimation方法開啟動畫
(方法一):在res下建立一個raw包,把文件放入包中。在activity中聲明
一個MediaPlayer對象,然後onCreate()方法中用
MediaPlayer.create(context,R.raw.資源名)方法實例化該對象。然後調用
MediaPlayer的start()、pause()和stop()方法進行開始、暫停和停止的
操作。最後在activity的onDestroy()中調用MediaPlayer的release()
方法進行資源的釋放。此方法的缺點是每次運行程序時都要加載raw裡的資
源文件,使安裝過程速度減慢。
(方法二):資源放在sdcard中。在activity中聲明一個MediaPlayer對象,
實例化 MediaPlayer()。使用Environment.getExternalStorageDirectory().getAbsolutePath()方法獲得path,然後path+=File.separator+資源名或”包名/資源名”。然後調用MediaPlayer的setDataSource(path)進行資源設置。然後先調用prepare()方法,在後再調用start()方法播放,調用pause()方法和stop()方法進行暫停和停止的操作。最後在activity的onDestroy()中用release()方法進行資源的釋放。
注意事項,使用方法二時,設置完資源路徑後要先調用prepare()方法,調
用start()、pause()、stop()方法前腰先進行一些判斷,不然一次性調用
多次同樣的方法容易出錯。調用stop()後在調用start()方法時要先調用prepare()方法。
1) new出一個實例 ; new SoundPool(4, AudioManager.STREAM_MUSIC, 100);第一個參數是允許有多少個聲音流同時播放,第2個參數是聲音類型,第三個參數是聲音的品質; 2) loadId = soundPool.load(context, R.raw.himi_ogg, 1); 3) 使用實例調用play方法傳入對應的音頻文件id即可
1) new Intent,配置隱式意圖 2) 通過Uri.parse獲取指定文件Uri 3) 給Intent添加Uri及type 4) 啟動Intent
VideoView 是android 系統提供的一個媒體播放顯示和控制的控件。 若需要控制欄,需要加上MediaController
1) 構建surfaceView 2) 獲取surfaceHolder,設置分辨率 3) 對surfaceHolder添加回調接口(SurfaceHolder.Callback ) surfaceHolder.addCallback(this); 4) 實現接口內部三個方法 (surfaceCreated ,surfaceChanged,surfaceDestroyed等),對Mediaplayer添加Display(控制管理器) 5) 對按鈕添加點擊事件
Timer是在一個應用運行期間進行的定時操作,當應用退出則定時操作也同時被取消。
AlarmManager是系統級的定時器,主要用來對Activity,Service,BroadCastReciver三大組件進行定時的操作,當應用退出後這個定時操作仍然可以按時進行,並且通過使用可喚醒的參數可以達到在系統休眠狀態下仍可以完成定時操作。
1)、首先創建surfaceView 2)、得到surfaceView對應控制器,並添加surfaceView的回調事件(surfaceView創建以及銷毀分別執行的操作,當surfaceView創建時,初始化camera,當surfaceView銷毀時,釋放camera的資源) 3)、設置分辨率 4)、設置不維護緩存 5) 點擊調用camera的takePicture傳入回調拍照的實例化PictureCallback對象
1:判斷contentView是否為null
2:使用viewHolder緩存數據,實現一步加載
3:分頁加載:
1)如果自定義適配器,那麼在getView方法中要考慮方法傳進來的參數contentView是否為null,如果為null就創建contentView並返回,如果不為null則直接使用。在這個方法中盡可能少創建view。
2)給contentView設置tag(setTag()),傳入一個viewHolder對象,用於緩存要顯示的數據,可以達到數據異步加載的效果。
3)如果listview需要顯示的item很多,就要考慮分頁加載。比如一共要顯示100條或者更多的時候,我們可以考慮先加載20條,等用戶拉到列表底部的時候再去加載接下來的20條。分頁加載還沒學習。
1.模型層(model):對數據庫操作,對網絡等操作都應在model中處理,對業務的計算等操作都應在該層。可以簡單的理解為Android中的Java源文件
2.視圖層(view):一般采用XML進行描述,使用的時候可以方便的引入,可以簡單的理解為Android中Layout文件。 Android中也可以用JavaScript+HTML 等方式作為view 層。
3.控制層(controller):控制model和view的協調工作。簡單的理解為Android中manifest文件。
Android應用開發中我們常常需要發送手機短信。這對於android平台來說,是最簡單不過的功能了,無需太多代碼,也無需自定義代碼,只需要調用android提供的消息管
<?xml version=. encoding=UTF-?><RelativeLayout xmlns:android=http://
確定取消對話框(帶圖標) //(上下文,主題) new AlertDialog.Builder(this, AlertDialog.THEME_DEVICE
1、概述 相信大家對AsyncTask都不陌生,對於執行耗時任務,然後更新UI是一把利器,當然也是替代Thread + Handler 的一種方式。如果你對