第一篇:android橫豎屏總結
Android橫豎屏要解決的問題應該就兩個:一。布局問題;二。重新載入問題。
1.布局問題:如果不想讓軟件在橫豎屏之間切換,最簡單的辦法就是在項目的 AndroidManifest.xml中找到你所指定的activity中加上
android:screenOrientation屬性,他有以下幾個參數:
“unspecified”
默認值 由系統來判斷顯示方向.判定的策略是和設備相關的,所以不同的設備會有不同的顯示方向.“landscape”
橫屏顯示(寬比高要長)
“portrait”
豎屏顯示(高比寬要長)
“user”
用戶當前首選的方向
“behind”
和該Activity下面的那個Activity的方向一致(在Activity堆棧中的)“sensor”
有物理的感應器來決定。如果用戶旋轉設備這屏幕會橫豎屏切換。
“nosensor”
忽略物理感應器,這樣就不會隨著用戶旋轉設備而更改了
(“unspecified”設置除外)。
也可以在Java代碼中通過
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);來設置。
如果要讓軟件在橫豎屏之間切換,由于橫豎屏的高寬會發生轉換,有可能會要求不同的布局。可以通過以下方法來切換布局:
1)在res目錄下建立layout-land和layout-port目錄,相應的layout文件不變,比如main.xml。layout-land是橫屏的layout,layout-port是豎屏的layout,其他的不用管,模擬器會自動尋找。
2)通過this.getResources().getConfiguration().orientation來判斷當前是橫屏還是豎屏然后來加載相應的xml布局文件。因為當屏幕變為橫屏的時候,系統會重新呼叫當前Activity的OnCreate方法,你可以把以下方法放在你的OnCreate中來檢查當前的方向,然后可以讓你的SetContentView來載入不同的Layout xml.if(this.getResources().getConfiguration().orientation ==
Configuration.ORIENTATION_LANDSCAPE){
Log.i(“info”, “landscape”);
}
else if(this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT){
Log.i(“info”, “portrait”);
}
2.重新載入問題。如果不需要從新載入,可以在androidmanifest.xml中加入配置android:configChanges=“orientation”,配置android:configChanges的作用就是如文檔所說的:Specify one or more configuration changes that the activity will handle itself.If not specified, the activity will be restarted if any of these configuration changes happen in the system。這樣在程序中.Activity就不會重復的調用onCreate()甚至不會調用
onPause.onResume.只會調用一個onConfigurationChanged(Configuration newConfig)。
–*************其實在這里我遇到兩個奇怪的問題,那就是
1.如果我在android:configChanges中只設置orientation,他依然會重新加載,只有設置了orientation|keyboardHidden它才會只調用一個
onConfigurationChanged(Configuration newConfig)
2.當橫屏變豎屏的時候,他會調用兩次onConfigurationChanged,而豎屏轉橫屏時他只調用一次onConfigurationChanged,真是太奇怪了。如果你知道,歡迎留言共同探討*************–
如果需要重新載入,則不需要做任何修改。不過如果需要在重新載入過程中保存之前的操作內容或數據,則需要保存之前的數據。然后在activity的onCreate()中取出來。當然,如此就不能設置android:configChanges()了,否則就不會調用onCreate()方法。那么數據可以保存在哪呢?Android中四種存儲方法都可以,另外,還可以用Android為我們提供了onRetainNonConfigurationInstance()方法來暫時保存數據。
下面為此舉個例子:
保存臨時圖片:
1.@Override
2.public Object onRetainNonConfigurationInstance(){
3.final LoadedPhoto[] list = new LoadedPhoto[numberOfPhotos];
4.keepPhotos(list);
5.return list;
6.}
之后便可以在activity的onCreate()函數中實現重新調用臨時文件,在代碼中需要判斷系統是否需要重新加載臨時文件。以下是放在OnCreate()函數中加載臨時文件的代碼:
1.private void loadPhotos(){
2.final Object data = getLastNonConfigurationInstance();3.4.// The activity is starting for the first time, load the photos from Flickr
5.if(data == null){
6.mTask = new GetPhotoListTask().execute(mCurrentPage);
7.} else {
8.// The activity was destroyed/created automatically, populate the grid
9.// of photos with the images loaded by the previous activity
10.final LoadedPhoto[] photos =(LoadedPhoto[])data;
11.for(LoadedPhoto photo : photos){
12.addPhoto(photo);
13.}
14.}
15.}
對于大多數的情況并不需要做如上的操作,所以需要謹慎使用這個行文,畢竟最好的行為也并不適用于所有情況,如果應用的不好反而會給程序帶來不必要的麻煩。
如果要徹底禁止翻轉,可以設置android:screenOrientation的屬性為
nosensor,如此就可以忽略重力感應帶來的麻煩了。不過不知道為什么,在模擬器上不管用,聽別人說在真機上是正確的,我沒有真機,等有了真機再試試看
比如
Java代碼
if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE){//橫向
setContentView(R.layout.file_list_landscape);
}else{
//豎向
setContentView(R.layout.file_list);
}
第二篇:Android總結
Android四大組件:
Activity—表現屏幕界面
Service—后臺服務
BroadcastReceiver—實現廣播機制
ContentProvider—實現數據存儲
Intent類:用來啟動程序并傳遞信息的類
用于Activity、Receiver、Service之間進行交互的類,通過無參構造方法創建對象,增加其action、category、data、extra等屬性進行信息傳遞,并通過Activity中的startActivity(Intent intent)進行界面的跳轉;通過Context中的StartService(Intent intent)進行服務跳轉;通過Context中的registerReceive(Intent intent)對廣播進行注冊,并通過sendBroadcast()進行無序消息發送,或可以通過SendOrderedBroadcast()進行有序的消息發送。Handler類:
用來發送和處理消息,并配合主線程完成UI的更新;消息Message/Runnable傳遞通過MessageQueue(消息隊列,先進先出)進行傳遞,并通過Lopper進行接收,傳遞的消息可以為Message對象,也可以是Runnable對象;接收方法通過HandleMessage(Message msg)進行獲取。SharedPreferences類:
一般用于第一次登錄時的設置,或者是各個界面的一些小型格式設置,如字體等。是本地的小型共享數據庫,可以通過Context的靜態方法getSharedPreferences獲得其對象,對象內的值均為鍵值對進行儲存。通過SharedPreferences對象調用editor()獲取SharedPreferences.Editor對象,向共享數據庫中增加數據,putString(),并提交數據,commit();通過SharedPreferences對象獲取共享數據庫中的數據,getString()。
ViewPager:實現界面滑動的類;
通過設置OnPagerChangedListener設置ViewPager的監聽事件;
實現流程:
①布局文件中設置ViewPager控件;
②代碼中進行綁定控件;
③通過繼承PagerAdapter抽象類進行設置適配器,并傳遞數據源;
④適配器中實現兩個抽象方法,兩個重寫方法:getCount()—獲取滑動界面的數量,isViewFromObject()—判斷視圖是否是來自于Object文件中;重寫兩個方法,分別為destoryItem—銷毀指定位置的視圖;InstantiateItem(),設置指定位置的視圖;
Timer與TimerTask類:
Timer為計時器的類,通過無參構造方法可以獲取對象,通過Timer.schedule(TimerTask task,long time)進行設置多久后執行某任務,當任務執行完后,取消計時的功能,Timer.cancle();TimerTask類為抽象類,實例化時,必須重寫run方法;執行的內容,均在run方法中進行設置,并且執行時,已在子線程中進行執行。自定義View:用到的類有Paint、Canvas、Spec、SpecF、Path、View.MeasureSpec、Timer、TimerTask;
抽象類,通過子類繼承,獲取對象;在布局文件中綁定后,通過代碼,設置自定義View的屬性;自定義View中,通過重寫OnMeasure方法,對布局文件中的尺寸進行測量,并由View中的setMeasureDimenson()方法,進行數據的保存;通過重寫Ondraw方法,進行繪圖;當需要繪制動態圖形時,使用計時器Timer的schedule(TimerTask,long time,delay time2)方法,在time時間后,每隔time2時間,重寫執行run方法中的內容;將耗時的操作設置在run方法中,并通過View中的invalidate()方法刷新主線程中的繪的圖形,通過postInvalidate()刷新子線程中的圖形。數據庫:
常用的數據庫有Oracle,需要安裝和配置的大型收費數據庫;MySQL是中型數據庫,同樣需要安裝配置,但不需要收費;Sqlite是小型免費的嵌入式數據庫,占用內存低,最新版本為3.0。Sqlite數據庫需要通過SqliteDatabaseOpenHelper進行創建數據庫,并通過SqliteDatabase進行數據庫的操作。輔助類是抽象類,通過繼承,重寫兩個方法,并在子類的構造方法中通過OpenHelper的構造方法(Context context,String SqlName,SqliteDatabase.CursorFactory factory,int version)進行數據庫的創建,在onCreate方法中,進行數據庫表的創建,在onUpdate中進行數據庫的版本更新。在數據庫的操作類中,執行exect方法,通過sql語句對數據庫進行操作。Create table student(_id integer primary key auto increament ,name text);insert into student(_id,name)values(1,zx);delete from student where _id=1;update student set _id=2 where name=zx;select *from student;ListView、GridView適配器的優化:
將布局文件中的控件進行封裝,當視圖加載時,判斷可變視圖是否存在,當不存在時,通過布局文件獲取視圖,并新建封裝類,將地址通過setTag()進行發送;當視圖存在時,重復利用地址—getTag()。反射:
存儲數據的方式:
共享數據庫、數據庫、文件、網絡、內容提供者
廣播:
廣播傳播時,需要接收者、發送者、廣播頻道;根據發送者的發送方式不同,分為有序廣播、無序廣播;有序廣播為接收者有接收順序,根據設置的優先級不同,確定先后順序,接收者同時也是發送者,向后面的廣播發送消息,發送過程中,可以添加信息,也可以停止廣播的傳輸;無序廣播,接收者之間無聯系,均從發送者處接收信息;廣播在傳輸過程中,不能被添加信息,也不可能被停止。廣播在發送前,需要對接收者進行注冊,注冊方式有兩種,動態注冊、靜態注冊。動態注冊,是在代碼中進行,通過Context對象調用靜態方法進行注冊,所有的廣播均可以用動態注冊,其生命周期依賴于應用,相對于靜態注冊,比較節省內存;靜態方法在清單文件中進行注冊,部分系統廣播不能通過靜態注冊進行,其生命周期依賴于系統,當系統啟動,即運行接收廣播,較耗內存。廣播接收者需要繼承BroadcastReceiver,并實現抽象方法onReceive(),通過回調接口,進行數據的傳輸。注意:廣播發送前,必須進行接收者的注冊,并且,當顯示跳轉時,不需要意圖過濾器。安卓布局:九種布局
線性布局,水平或垂直方向兩種格式,主要特點為權重,即規定各控件在視圖中的占有的比例;
相對布局,相對于父控件或兄弟控件的布局,各控件需指定相對位置; 絕對布局,指定各控件在視圖中的絕對位置,幾乎不再使用; 表格布局,子布局放在行中,列由控件表示(TableRow); 幀布局:覆蓋前面布局的布局,一般用于暫停按鈕等; 風格布局:可以跨行、跨列的布局,占滿換行;
左右側滑:可以實現左右側滑,通過設置主菜單和二級菜單設置左右兩個菜單; 下拉刷新:設置下拉刷新、上拉加載的功能; 抽屜布局;
安卓版本及對應的API:
1.6—4;2—7;3—11;4—15;4.3—18;5—20;5.1—21;6—23;7—25; 安卓四層架構:
應用層:Java語言開發,主要從事App開發;
運行庫層:Java語言與C語言,View視圖、管理類等的開發; 架構層:C語言與Linux語言,各種框架、瀏覽器等; 內核層:Linux、C語言,開發各種驅動; 安卓四大組件:
Activity:界面,實現程序與用戶之間的交換,有自己的生命周期,七個生命周期;4種啟動模式 Service:
BroadcastReceive:三要素,發送者、接收者、發送頻道(Intent);類型:有序(接收有序,有數據傳送,可以攔截數據)、無序廣播(相對);注冊方式:靜態注冊,持久監聽,占用內存比較高生命周期跟隨系統,動態注冊(代碼中),所有廣播都可以動態注冊,部分系統廣播不能動態注冊,臨時監聽,占用內存較少,生命周期隨應用進行;
ContentProvide:不能存放數據,五種存放數據方式之一,特點為:①為數據的獲取等操作添加一個統一的接口②可以實現跨應用訪問數據;③可以實現Android中通訊錄、消息、音頻、視頻等的訪問或操作;通過ContentReceive進行數據的訪問,可以對數據進行增刪改查操作。
動畫: IO流: 序列化: AlertDialog:
Set實現類: 手機電量檢測:
自定義SurfaceView:
自定義View:三個構造方法的區別
Message:Handler.obtain/new/Message.obtain
HttpUriConnection訪問網絡
gride 異步任務 動畫
抽象類和接口 反射 克隆 序列化 側滑的實現 數據庫 Socket:
Gson解析
異步任務和子線程區別 WebView 版本更新 照片的圓角化
Collection與Collections Sql語句
MVP框架與MVC: TCP與UDP的區別: 一鍵分享的流程: Http協議的理解: 不使用框架訪問網絡: List集合與set集合: 自定義View的流程: 線性布局的特點: ViewPager的原理: 服務的啟動方式:
Activity的啟動方式: Xml數據解析:
第三篇:Android 個人總結
Android 個人總結
通過本學期的的學習,我知道了android是由google開發的一款手機平臺,android的基本架構是基于linux內核,由內核向外的反別為庫和應用架構,然后就是我們手機上的可視化應用了,android是一個系統,但是并非是操作系統。
在開發之前,我們首先要搭建一個開發環境,用的是java編程的eclipse,我們從網上下載sdk包,里面包含了android開發常用的工具,android既是手機操作系統,也是跨平臺(windows,mac,linux)的開發工具,雖然是使用linux為核心的平臺,但是你可以在很多地方感覺到類似做網頁開發的感覺。具有本身獨特的進程管理方式,完整的上網功能,搭配了google地圖,Gmail等服務,即使像我們這些尚未入門的開發者也能開發出自己理想的應用程序來。
剛開始的時候,得知android開發需要使用java語言心里了小小的畏懼,但隨著學習的漸漸深入就會發現android平臺只是使用了java的語法而已,所以,即使我們不具備java語言開發的基礎,也可以放心地加入到android開發當中來。
第一節課,老師向我們詳細介紹了開發界面右邊窗口的內容,首先是src目錄,里面包含了我們開發界面的java文件以及各種我們創建的類組成的開發包。然后是gen目錄,里面涵蓋的是系統的類文件(如R.java,Buidconfig.java)與android系統的依賴文件(Android Dependencies)。再下來是assets(用戶資源文件),里面文件的訪問是通過文件路徑的形式調用。Bin文件里面包括了res資源文件,android項目配置文件androidmanifest以及我們開發之后產生的后綴為.apk的應用程序文件。Res是系統資源目錄,我們要用到得圖片資源,顏色資源,字符串資源都在里面。一般的開發都要用到界面文件也包含在里面。
Eclipse具有史上超豪華的手機控件,包括常用的文本文件,文本框,按鈕,進度條等,還有特殊形式的email,gmail文本框,在開發過程當中,很多控件都是以拖拉的形式拖拽到開發界面上,大大地減少了我們開發時候的工作量,在配置文件中,我們可以添加各種各樣的系統動作,以及系統服務,還可以建立用戶自己的文件庫。
當我們開發完成的時候,就可以運行手機模擬器,在上面,我們可以像操作當今市場上最流行的android手機一樣操作我們的模擬器,可視化的界面可以我們隨心所欲地下載我們開發的應用程序到模擬器上,就可以實現步步跟進,想要修改哪里就一目了然了,模擬器上人性化的設計界面大大方便了用戶與機器之間的交流。如果我們擁有一部android系統的手機的話,就可以把自己開發的應用程序下到手機上,看到自己的成果,頓生成就感,真的很有樂趣。也加大了我對學習android的信心。
總體來說,學習android就要不怕困難,迎難而上。Android不久可以滿足自己的成就感,還可以在未來的生活中找到自己理想的工作。用別人準備好的各種類,包來開發出自己獨特風格的應用程序,既省時又省力,何樂而不為呢。在這里,要感謝曾老師對我的栽培和關懷,他教給了我知識,使我在學習的時候少走了很多的彎路,也增加了我對未來工作的信心。
第四篇:Android 課程總結
一、Android開發環境的搭建。
1、Android SDK的安裝;
2、ADT的安裝和配置;
3、Android 模擬器的配置。
二、編寫第一個Android程序───Hello World(1學時)
1、創建一個Android應用程序的步驟;
2、Android 應用程序目錄結構;
3、AndroidManidest.xml文件的作用;
4、Android相關資源文件的作用。
三、Activity及Activity和Intent(2學時)
1、Activity的主要作用;
2、創建一個Activity的方法;
3、在AndroidManifest.xml文件中的注冊應用Activity的方法;
4、在Activity中添加控件的方法;
5、多個Activity之間的切換;
6、Intent的基本作用;
7、在一個Activity中啟動另一個Activity的方法;
8、使用Intent在Activity中傳遞數據的基本方法。
四、常見控件的使用方法(基礎)
1、TextView的使用方法;
2、EditText的使用方法;
3、Button的使用方法;
4、Menu的使用方法。
五、Activity的生命周期(2學時)
1、Activity的七個周期:
① OnCreate();② OnDestroy();③ OnPause();④ OnRestart();⑤ OnResume();⑥ OnStart();⑦ OnStop();
2、Task的基本概念;
3、Activity和Task之間的關系;
4、對話框風格的Activity的使用方法。
六、Activity的布局(3學時)
1、LinearLayout的使用方法;
2、TableLayout的使用方法;
3、LinearLayout和TableLayout的嵌套使用;
4、RelativeLayout的使用方法(重點、難點)
七、常用控件是使用方法二(2學時)
1、RadioGroup和RadioButton的使用方法;
2、CheckBox的使用方法;
3、Toast的基本用法。
4、ProgressBar的使用方法;
5、ListView的用法。
八、Handler的使用方法(2學時)
1、Handler的基本概念;
2、Handler的基本用法;
3、使用Handler更新ProgressBar
4、Handler與線程;
5、Bundle的用法;
6、在新線程中處理消息的方法。
九、SQLite使用方法
1、SQLite介紹;
2、SQLiteOpenHeper使用方法;
3、使用adb訪問SQLite
4、增、刪、改、查。
十、Android文件下載
1、使用HTTP協議下載文件;
2、將下載的文件寫入SDCARD。
十一、Content Provider初步(2學時)
1、Content Provider的基本概念;
2、Uri;
3、Content Provider的實現方法。
十二、XML文件的解析方法
1、什么是SAX;
2、SAX的基本原理;
3、SAX常用接口;
4、SAX解析。
十三、廣播機制(2學時)
1、Android的廣播機制(圖鑒);
2、BroadCastReceive的作用;
3、BroadCastReceive的編寫方法;
4、BroadCastReceive的生命周期。
5、注冊BroadCastReceive的方法;
6、Android內置BroadCastReceive Actions。
十四、WIFI網絡的使用
1、什么是WIFI;
2、獲取WIFI網卡的狀態;
3、操作WIFI所需要的權限;
4、改變WIFI網卡的狀態。
十五、Socket編程
1、什么是Socket;
2、Socket基本通信模型(見圖);
3、使用基于TCP協議的Socket;
4、使用基于UDP協議的Socket。
十六、Service
1、Service是什么;
2、Service不是什么;
3、Service的生命周期;
4、啟動和停止Service;
第五篇:Android方案總結
一、硬件描述
如上圖,應用程序的開發過程中我們使用了飛思卡爾的i.MX51 EVK Hardware。設備提供的支持如下:多標準音頻回放;多標準視頻回放;開放的系統支持;
二、軟體結構
1、Android系統的初始化流程圖如下所示:
BeginMkdir: /dev,/proc,/sys,/dev/pts,/dev/socketaction_for_each_trigger(“early-init”, action_add_queue_tail);property_set(ro.XXX)open_devnull_stdio():fd is 0,1,2device_initaction_for_each_trigger(“init”, action_add_queue_tail)log_init: /dev/__kmsg__property_initaction_for_each_trigger(“early-boot”, action_add_queue_tail);parse_config_file(“/init.rc”)Check have /dev/consoleaction_for_each_trigger(“boot”, action_add_queue_tail);import_kernel_cmdline: /proc/cmdlineload_565rle_image(INIT_IMAGE_FILE)queue_all_property_triggers()get_hardware_name: /proc/cpuinfoIf load okrestart_processes()Yparse_config_file(/init.%s.rc)Show Image, and Print “A N D R O I D”to ttyEnd
可以具體描述如下:(1).初始化log系統。
(2).解析/init.rc和/init.%hardware%.rc文件。
(3).執行 early-init action in the two files parsed in step 2。
(4).設備初始化,例如:在 /dev 下面創建所有設備節點,下載 firmwares。
(5).初始化屬性服務器,Actually the property system is working as a share memory.Logically it looks like a registry under Windows system。
(6).執行 init action in the two files parsed in step 2。
(7).開啟 屬性服務。
(8).執行 early-boot and boot actions in the two files parsed in step 2。
(9).執行 Execute property action in the two files parsed in step 2。
(10).進入一個無限循環 to wait for device/property set/child process exit events。
2、方案基本框架,如下圖所示:
Native codeDaivik runtimeAndroidNDKappsJNIAndroidSDKappsAndroid app frameworkStandard librariesLinux kernel+Android extension
(1)圖中Native Code包含一系列運行與Linux內核之上,由C/C++語言寫成的庫,這些庫提供基本的系統級功能。其為應用層提供了本地開發的可擴展性,在此次開發過程中,Native Code主要為我們提供了音視頻的編解碼(即我們在此層開發了我們自己的音視頻的編解碼)。系統中主要使用的是G711音頻編解碼,實現語音的本地錄音及播放;FFMPEG視頻解碼,進行圖像視頻的解碼,實現視頻的實時播放。
(2)Dalvik runtime的相關介紹。Android系統的應用開發語言是Java,而保障這一點的就是Android runtime。Java語言的運行需要有虛擬機的存在,而Android runtime 的核心就是一個稱之為Dalvik的虛擬機。另外,Android runtime還包含了一個強大的Java核心類庫。這個類庫從功能上涵蓋了傳統Java核心類庫的大多數功能。應用程序調用Android 函數庫(即Android runtime中的Java核心類庫)中的函數時,其實只是調用的一個函數名,具體實現在Native Code中的Library中。即是Library為上層的應用提供API供開發使用。(3)關于JNI。Java Native Interface(JNI)標準,它允許Java代碼和其他語言寫的代碼進行交互。JNI一開始是為了本地已編譯語言,尤其是C和C++而設計的,但是它并不妨礙你使用其他語言,只要調用約定受支持就可以了。我們開發的音視頻本地編解碼庫,就是通過JNI來使用的。如下,private static native void InitEnv();private static native int drawFrame(Bitmap bitmap, byte[] inbuffer, int buf_len);這是我們在程序中調用的本地函數,先要使用關鍵字native進行本地聲明。static { System.loadLibrary(“decode”);}
這是用來加載我們的c動態庫的,上面的native聲明中的方法就是在我們加載的庫中具體實現的。
(4)Linux kernel 和Android extension部分。這一部分主要為我們提供了諸如硬件設備驅動(如display driver、camera driver等)、進程管理、內存管理、電源管理等底層功能。這一層的Linux并不是標準的GNU/Linux,而是根據我們的商業需求進行大量的定制。