安卓面試常問知識點

1.Android四大組件
①activity 提供用戶界面  用於與用戶交互的組件,(活動窗體)它需要爲保持各界面的狀態,做很多持久化的事情,妥善管理生命週期以及一些跳轉邏輯
②content Provider 
   爲應用程序之間訪問提供的接口的組件,實現數據共享,結構化數據集合,以表的形式對外提供數據,可以像數據庫一樣記性選擇排序
③BroadCastReceiver (廣播)
 採用異步機制完成組件之間消息的傳遞,異步是指廣播的發送方將消息標記後發出,不需要得到對方的迴應,可以繼續做自己的操作
默認情況下,所有的組件都有接收廣播的能力,組件想要接收廣播就註冊與發送方一致的標記
包括普通廣播和有序廣播:
發送有序廣播:sendOrderedBroadCast(...);     
sendBroadCast();
有序廣播可以進行應用程序之間傳遞消息,可以根據manifest文件中註冊的優先級的高低判斷接收的順序。
實現過程:
創建一個類繼承BroadCastReceiver,重寫其中的onReceiver()方法,進行接收廣播之後的操作。
廣播 的生命週期:


④server(服務)
不需要提供用戶界面,在後臺運行服務於activity,執行長時間耗時操作的組件


2.Android中常用的五種佈局
①線性佈局
控件有兩種排列方式,垂直和水平佈局
②相對佈局
以某一個元素爲參照物來定位的佈局方式
主要屬性: 相對於某一個元素,相對於父元素
③網格佈局
表格中有行和列,可以具體定義每一個元素的位置,
④絕對佈局
用X,Y座標來指定元素的位置,在屏幕旋轉是容易出現問題,對歌元素時計算很麻煩
⑤幀佈局
所有東西一次都放在左上角,會重疊,適用於一些比較簡單的佈局


這五種佈局元素可以嵌套使用,做出完美的界面


3.handler進制的原理:


答:android提供了handler和looper來滿足線程間的通信。Handler先進先出原則。looper用來管理特定線程內對象之間的消息交換(message Exchange).


    1)looper:一個線程可以產生一個looper對象,由它來管理此線程裏的message queue(消息隊列)


   2)handler:你可以構造一個handler對象來與looper溝通,以便push新消息到messagequeue裏;或者接收looper(從messagequeue裏取出)所送來的消息。


    3)messagequeue:用來存放線程放入的消息。


    4)線程:UI thread 通常就是main thread,而android啓動程序時會爲它建立一個message queue.


4.Android中的動畫分類,其特點和區別
  
(1)屬性動畫(3.0引入)
根據動畫指定的內容,時間等效果實現對當前的view屬性設置
(2)控件動畫(view)
不會對view當前的屬性設置發生改動
  ①補間動畫(Tween)
  淡入淡出、旋轉、縮放、平移
  ②幀動畫(Fram)
根據順序播放排列好的圖片


5.Android中有哪幾種解析XML的類,其特點?
①SAX解析是單向的,不佔內存空間,解析屬性方便,
缺點:要解析嵌套多個分支來說處理不是很方便
②DOM解析   官方推薦此解析,它能把XML文件加載到內存裏去。可以和
XPath很好的結合,若數據量大,不推薦使用
③Pull解析  用在J2ME對於節點處理比較好,同樣節省內存,在J2ME中我們經常使用的KXML庫來解析


6.listview的優化方案
①在getView方法中,若convertView爲null,則創建convertView並返回,若不爲空,則直接使用,在此方法中儘可能少創建view
②給convertView設置tag(setTag()),傳入一個viewHolder對象,用於緩存要顯示的數據,可打到圖像數據異步加載的效果
③如果listview顯示的item很多,就要考慮分頁加載,規定每頁加載多少條,當用戶拉到列表底部的時候再去加載接下來的條目


7.Android的數據存儲方式
①SharedPreference數據存儲
Android提供的用來存儲一些簡單配置信息的一種機制
需要使用sharedpreferences API讀寫數據
例如:登錄用戶的用戶名與密碼,採用了Map數據結構來存儲數據,以鍵值的方式存儲,可以簡單的讀取與寫入,採用XML格式將數據存儲到設備中,先調用edit()使其處於編輯窗臺,然後修改數據,最後使用commit()提交修改的數據
只能在同一個包內使用,不能在不同的包之間使用
②文件存儲
在Android中讀取和寫入文件的方法對外共享數據
③SQLite數據庫存儲
④ContentProvider數據存儲
繼承ContentProvider類,並重寫該類用於提供數據和存儲數據的方法,就可以向其他應用共享其數據,數據訪問方式會因數據存儲的方式而不同
優點:統一了數據訪問方式
⑤網絡存儲


8.activity的啓動模式有哪些?什麼含義?
(1)standard
標準啓動模式,當激活Activity時就創建新的activity
(2)singleTop
如果棧頂有activity的實例,則不需重新創建(只要不在棧頂就需要創建),可重用該實例,不過會調用onNewIntent()方法,如果棧頂不存在就重新創建新的實例並放入棧頂
(3)singleTask
如果棧中存在activity的實例則重用該實例(會調用onNewIntent()方法),重用時會讓實例回到棧頂,因此在它上面的實例會被移除棧頂,如果棧中不存在該實例,就會創建新的實例放入棧中
(4)singleInstance
存放singleInstance模式窗口的回退棧中不能有其他的窗口,若沒有則需新建任務來存放singleInstance窗口。


此啓動模式和瀏覽器工作原理類似,在多個程序訪問時如果瀏覽器沒有打開,則打開瀏覽器,否則在當前瀏覽器中訪問。可以節省大量的系統資源,保證要請求的Activity對象在當前的棧中只存在一個。


9.activoty的生命週期
①onCreate()
②onStart()
③onReStart()
④onResume()
下面三種狀態都能被殺死
⑤onPause()
⑥onStop()
⑦onDestory()
(1)啓動activity時①onCreate()②onStart()④onResume()
(2)接電話時⑤onPause()⑥onStop()
(3)電話結束③onReStart()②onStart()④onResume()
(4)啓動activity時,第二個activity是以對話框的形勢彈出⑤onPause()
(5)點擊返回鍵之後,把Dialog返回④onResume()
1.可見生命週期:從onStart()直到系統調用onStop()
2.前臺生命週期:從onResume()到onPause()


10 activity在屏幕旋轉時的生命週期


不設置Activity中的Android:configChanges時,切換橫豎屏時都重新調用各個生命週期,切橫屏時調用一次,切豎屏時調用兩次
若設置Acitvity中的Android:configChanges="orientation"時,切換橫豎屏時也都重新調用各個聲明週期,切橫屏時調用一次,切豎屏時也調用一次
若設置Activity中的Androd:configChanges="orientation|keyboardHidden"時。切屏不會重新調用各個生命週期,只會執行onConfigurationChanged方法


11.註冊廣播有幾種方式?這些方式的優缺點;談談Android引入廣播機制的用意
①動態註冊 在代碼中註冊
IntentFilter intentFilter = new IntentFilter(..action..)
IncomingSMSReceiver receiver = new IncomgSMSReceiver();
registerReceiver(recerver,filter);
②靜態註冊 在清單文件中註冊
<receive android:name=".IncomingSMSReceiver " >
<intent-filter>
   <action android:name="android.provider.Telephony.SMS_RECEIVED")
<intent-filter>
<receiver>


unregistreceiver()取消廣播
發送廣播:
Intent intent= new Intent(。。action。。。);
sendBroadCast();
12.適配器控件
必須有數據源,然後交給適配器控件,適配器顯示到控件中
spinner AutoCompleteTextView    listView  viewPager


純文本   ArrayAdapter
有文本有內容有圖片  SimpleAdapter
數據庫中的數據源用  CursorAdapter SimpleCursorAdapter
滑動功能 pagerAdapter fragmentpagerAdapter


13.activity的傳值方式,傳的數據必須是可序列化數據
①直接傳值intent
Intent intent = new Intent(...);
intent.putExtra("","");
startActivity(intent);
目標 getIntent()
Intent intent = getIntent();
intent.getStringExtra("...");
②Bundle對象
Intent intent = new Intent(...);
創建bundle對象
Bundle bundle = new Bundle();
bundle.putString(...);
intent.putExtras(bundle);
startActivity(intent);
目標Activity
Intent intent = getIntent();
Bundle bundle = intent.getExtras();
int in = bundle.getInt("...");
③回傳
啓動時
startActivityForresult(intent,REQUEST_CODE);
回傳通過setResult
重寫onActivityResult()方法


④application方法
⑤通過剪切板傳值
將內容先存在剪切板中,再從剪切板中粘貼


Intent的七大屬性:
ComponentName,Action,Category,Data,Type,Extra,Flag


14.回退棧,先進後出


15.什麼是ANR,如何避免它?
Application Not Responding 應用程序無響應,它是由活動管理器和窗口管理器共同監管的,若在用戶操作5s內應用程序沒有做出響應,BroadCastReceiver在10s內沒有執行完畢,則會出現應用程序無響應強行關閉。
避免:
儘量在關鍵方法onCreate或onResume方法中少的創建操作,將高耗時的操作交給子線程來處理

16.線程是如何停止的?
1.run方法執行完,自然停止
2.設置一個標示flag,當flag=false 時停止線程
3.用interrupt強制停止


17.簡要解釋activity,intent,intent filter,service,Broadcase
BroadCastReceiver


activity是一個可視化界面,可以與用戶進行交互操作,
service沒有可視化界面,在後臺進行長時間耗時操作的組件
intent是一個對象,他可以顯式的指定目標activity,然後進行跳轉操作
當目標activity找不到是隱式的,則通過intent filter 告訴目標activity能處理的intent,它是在Intent filter中聲明的
Broadcast是採用一種異步機制對外發送廣播,發送方將消息標記後發出,不用等待對方迴應就可以繼續進行操作
BroadcastReceiver 是接收廣播的消息,需要註冊與發送方一樣的標記纔可以接收到


18,MVC模式的原理
model,view,controller


模型對象
所有的業務邏輯都寫在該層
視圖對象
負責生成用戶界面的部分,接收用戶的輸入,顯示處理結果
唯一可以讓用戶看見的一層
控制層
根據用戶的輸入,控制用戶界面數據顯示及model對象狀態的部分


19.Android的系統框架
linux內核層
負責硬件的驅動,內存的管理
運行環境和本地類庫
運行環境負責解釋和執行生成的dalvik格式的字節碼,本地類庫中存放了很多關於android的代碼類,它是開源的函數庫
應用程序框架層
開發人員運用本層封裝好的API來進行開發
應用程序層
開發人員開發程序層可以調用內置的應用程序


下層爲上層服務,穩定性,靈活性和可擴展性


20.contentProvider如何實現數據共享
繼承contentProvider抽象接口,存儲和檢索數據,重寫其中的方法,就可以實現以數據庫表的形式對外暴露數據,如果想要應用程序的數據公開化,有兩種方法:
創建一個屬於自己的contentProvider或將數據添加到已有的contentProvider中,有相同的數據類型並且contentProvider的權限
外界程序可以通過contentSolver接口訪問contentProvider提供的數據


21,IntentService優點
當處理intent時會產生一個對應的service,android的進程處理器會儘可能的不kill掉你
22、 如果後臺的Activity由於某原因被系統回收了,如何在被系統回收之前保存當前狀態?
在activity在回收之前調用onStateInstanceState()方法,在此方法中保存需要保存的數據,通過重寫onRestoreInstanceState()方法從中提取保存的數據
23.設置窗口樣式
android:Theme = "@android:style/Theme.Dialog"
設置透明度
android:Theme = "@android:style/Theme.Translucent"


24.一條最長的短信中文佔(包括標點)70個字節
英文佔160個字節


25.如何退出activity?如何安全退出多個activity?
(1)對於單一的activity來說,想要退出就直接用finish()方法退出,或者也可以用killProcess()和System.exit()方法
(2)對於多個activity,
        ①每打開一個activity,就記錄下來,在需要退出的時候關閉每一個activity即可
        ②發送特定廣播:在需要退出activity時就發送一個特定的廣播,當activity接收到廣播後關閉即可
        ③遞歸退出:在打開新的activity時使用startActivityForResult()方法,然後自己加標誌,在onActivityResult中處理,遞歸關閉
       ④拋出異常:在需要退出的時候拋出異常使其ForceClose(),問題是如何使程序結束掉,不彈出ForceClose的窗口


26.AIDL全稱?如何工作?能處理那些類型的數據?
用來實現進程間的傳遞
Android Interface Define Language 接口描述語言  基於接口輕量級的
②不需要import聲明的簡單java編程語言類型
String CharSequence不需要特殊聲明
List Map。這些所包含的成員必須是簡單的數據類型
③編譯器通過aidl文件生成一段代碼,通過預先定義的接口達到進程內部之間通信的目的。若需要在activity中需要訪問另一個service裏的對象,需要先將對象轉化成AIDL可識別的參數,然後用AIDL來傳遞這些參數,在消息的接收端,使用這些參數來組裝成自己需要的對象


編譯器通過aidl文件生成一段代碼,通過預先定義的接口實現進程內部之間的同行。若一個activity中需要調用另一個service中的某個參數,則可以先把參數轉化成aidl可識別的參數,然後通過aidl傳遞參數,在消息接收端,需要將參數組裝成自己的對象


27.運行時權限Dalvik(Android授權)
文件系統權限linux內核授權


28.直接發送Uri把參數帶進去,或在manifest文件中的intentfilter中的data屬性


29.android系統的優勢和不足


30、Android dvm的進程和Linux的進程, 應用程序的進程是否爲同一個概念 


DVM 是Dalvik虛擬機
每個Android應用程序都在它自己的進程中運行,都需要擁有一個Dalvik虛擬機實例,每個DVM都在linux中的一個進程,可以認爲是同一個概念


31. sim卡的EF文件是什麼?有何作用
sim本身有自己的操作系統
EF就是做存儲和手機通訊用的
32.嵌入式內存管理有哪幾種形式
頁式 段式 段頁 MMU 虛擬空間等技術
33.嵌入式實時操作系統
Android是基於linux內核的,是屬於軟實
嵌入式實時操作系統是指當外界產生數據時能夠以足夠快的速度接收並處理數據,處理的結果在規定的時間之內來控制生產過程和對處理數據做出快速相應,並控制所有實時任務協調一致運行  實時系統分爲軟實和硬實兩種




嵌入式實時操作是指當外界產生數據時能以足夠快的速度接收並處理數據
,將處理的數據在規定時間之內對數據做出快速響應,並控制實時任務協調一致運行  


34.如何將SQLite數據庫與apk文件一起發佈?
可以將dictionary.db文件複製到res文件夾下的aw中,在此目錄下文件不會被壓縮,還可以直接提取該目錄中的文件
35.如何打開res aw目錄下的數據庫文件
在Android中不能直接打開res aw目錄中的數據庫文件,而當程序在第一次啓動時將該文件複製到手機內存或SD卡的某個目錄中,然後讀取該數據庫文件,複製的基本方法使用getResources().openRawResource
SOLiteDatabase.openOrCreateDatabase方法來打開任意目錄中的SQLite數據庫文件


36.DDMS是程序執行查看器
     RraceView是程序性能分析器
     JNI接口  java native interface  java 本地接口


37.IPC(進程間通信)機制
IPC是內部進程通信的簡稱,是爲了實現activity和service之間可以隨時進行交互,通過定義AIDL接口文件來定義IPC 接口,Service端實現IPC 接口,Client端調用IPC接口本地代理。


38.NDK是一些工具的集合


39.應用怎麼優化?
(1)代碼優化:儘量使用繼承,實現高內聚低耦合
(2)佈局優化:儘量少嵌套佈局,使用include引用
(3)性能優化:圖片要加緩存+裁剪,listview在滑動停止後要進行加載


40.多線程的理解?
(1)使用原因:主線程不能更新UI,主線程做耗時操作可能導致UI線程阻塞,給用戶帶來不便
(2)使用方式:Handler,Thread,AsyncTask,HandlerThread,Timer定時器
(3)Handler + Thread:sendMessage來發送消息,由what表示發送標識,obj表示代入數據


41.多線程同步的方式有哪些(同步就是一個線程執行完了才能執行另一個線程)
①Synchronized同步鎖:鎖代碼塊和鎖方法
②利用Hander,在每個線程中都設有Hander的實例對象,利用sendMessage()互相發送來達到同步


42.怎麼實現service
(1)利用綁定activity的方法
步驟1:創建自己的service的方法繼承service
onStartCommand()中啓動線程
步驟2:在線程中發送廣播
步驟3:在Manifest文件中註冊service
步驟4:在activity中註冊廣播
步驟5:開啓服務與關閉服務
(2)利用接口回調的方法
步驟1:






43.seekBar拖動條
通過seekBar.getProgress()獲取seekBar的值
SeekBar.OnSeekBarChangeListener()處理拖動條值的變化


Menu菜單


44.IoC控制反轉
activity下面的方法是框架調用的,系統自動調用onCreate不是程序編寫者主動去調用,反而是用戶寫的嗲嗎被框架調用,也就是反轉。例如數據庫的管理類


45.數據庫的基本操作
①第一步,創建一個類繼承SQLiteOpenHelper
②第二步,實現SQLiteOpenHelper中的兩個方法(創建數據庫方法和數據庫版本升級的方法)
③第三步,使用SQLiteOpenHelper的實例獲得SQLiteDatabase的實例
④第四步,獲得SQLiteDatabase的實例就可以實現增刪改查的操作


getReadableDatabase是以讀寫的方式打開數據庫,如果磁盤控件已滿,則不會拋出異常,以讀的方式打開數據庫
getWritableDatabase是以寫的方式打開數據庫,如果磁盤控件已滿,則會拋出異常


46.get/post請求的區別




一個MVC的面試題




Android中界面部分也採用了當前比較流行的MVC框架,在Android中: 


 


  1) 視圖層(View):一般採用XML文件進行界面的描述,使用的時候可以非常方便的引入。當然,如何你對Android瞭解的比較的多了話,就一定可以想到在Android中也可以使用JavaScript+HTML等的方式作爲View層,當然這裏需要進行Java和JavaScript之間的通信,幸運的是,Android提供了它們之間非常方便的通信實現。     


  2) 控制層(Controller):Android的控制層的重任通常落在了衆多的Acitvity的肩上,這句話也就暗含了不要在Acitivity中寫代碼,要通過Activity交割Model業務邏輯層處理,這樣做的另外一個原因是Android中的Acitivity的響應時間是5s,如果耗時的操作放在這裏,程序就很容易被回收掉。


  3) 模型層(Model):對數據庫的操作、對網絡等的操作都應該在Model裏面處理,當然對業務計算等操作也是必須放在的該層的。就是應用程序中二進制的數據。


圖片緩存的三種方式:
1.lrucache 強引用  內存緩存
   SoftReference<Bitmap>   軟引用
2.磁盤緩存  sd卡緩存  保存到本地
3.網絡緩存


先在內存中找,如果沒有則在磁盤中找存到內存,若都沒有就在網絡中找


50.listview的優化
①convertView的複用。當數據加載完全,則convertView爲null,當數據加載不完全,則convertView不爲null。當滑動listView時,
系統會自動convertView複用。
②靜態類ViewHolder中定義所有的控件,
③若數據很多的話,可以對listView進行分頁加載


靜態類的特點:不易被回收,第一次調用的時候會消耗很長時間,從第二次開始調用時,就不用findviewbyid了,可以很快的調用。


51.imageloader圖片錯位的原因,怎麼下載的流程圖
原因:convertView的複用,比如說listView滑到第二行異步加載某個圖片加載很慢,在加載過程中
listView已經滑倒第14行,其第二行的加載已經結束,第二行已不在屏幕內,第二行的數據可能被第14行復用,這是之前的圖片加載結束,就會顯示在第14行,造成錯亂。


下載的流程圖:
先在內存中找,如果沒有則在磁盤中找存到內存,若都沒有就在網絡中找
下載下來之後,先存如磁盤,再存入內存。


52.handler機制的原理
是爲了讓子線程可以操控UI界面,所以子線程會發送消息,handler會將這些消息存儲到消息隊列中(MessageQueue),looper從消息隊列中取出消息交給handler處理。
一個線程中只能有一個looper,可以有多個handler。
主線程中有系統封裝好的looper,子線程中沒有。
若已經有了looper,系統會拋出異常,若沒有looper,系統會自動創建一個looper。
53.異步任務
進行長時間耗時操作的,其有三種泛型:
params,Progress,Result


四個步驟:
異步.excute()方法啓動異步任務
①onPreExcute()
異步任務執行操作前做一些準備工作。
②doInBackground()
子線程中的耗時操作,可調用publishProgress方法來更新實時的任務進度。
③onProgressUpdate()
用publishprogress方法啓動此方法
④onPostExcute()
傳遞線程執行的結果。
54.數據庫操作
SQLiteDatabase db = helper.getWritableDatabase();
以讀寫方法打開數據庫,若數據存儲已滿,則只以讀的方式打開數據庫,用此方法就會出錯
SQLiteDatabase da = helper.getReadableDatabase();
以上兩種方法可以得到SQLiteDatabase的實例,
db.openDatabase();


增,刪,改,查
創建數據庫:
String sql = “Create table user(id Integer primary key,name vachar(30))”
db.execuSQL(sql);
增:


55.同時下載500張圖片,怎麼實現“?
可以採用線程池。比如有500個線程,但同時執行的只有5個線程,其他線程處於等待狀態,當執行完一個線程後後邊接着有一條線程開始執行。




項目難點:
1.Android的事件處理機制和屏幕適配
2.百度地圖
(1)申請密鑰(名字爲應用程序包名)
(2)在manifest文件中的application下
 <!--配置地圖開發的密鑰 key 需要自行申請-->
        <meta-data 
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="kBfIIOi9jm3xGdW5O0LcrXDM"
            />
(3)添加百度地圖開發所需要的權限
(4)xml文件中添加表示展示地圖的控件MapView
    <com.baidu.mapapi.map.MapView  
   android:id="@+id/bmapView"  
   android:layout_width="fill_parent"  
   android:layout_height="fill_parent"  
   android:clickable="true" />
(5)展示基本地圖大概思路
private MapView mapView ;//聲明地圖控件
private BaiduMap baiduMap;//聲明地圖的控制對象
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//在使用SDK各組件之前初始化context信息,出入ApplicationContext
//注意該方法要在setContentView方法之前實現
setContentView(R.layout.activity_map);

//獲取地圖顯示控件對象
mapView = (MapView) findViewById(R.id.bmapView);

baiduMap = mapView.getMap();//獲取地圖控制器
baiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);//默認普通的地圖
// baiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);//衛星的地圖
baiduMap.setTrafficEnabled(true);//表示展示當前的交通狀態

}


檢查密鑰的方法
onCheckKey(){///...}


當Activity處於生命週期的任何狀態時,mapview也隨之處於該狀態
(6)添加覆蓋物的方法
除了創建上述的baiduMap控制對象,接下來第一步需要通過BitmapDescriptorFactory創建BitmapDescriptor對象
第二步創建標記點的位置Latlny
第三步創建圖層對象OverlayOptions
第四步就將圖層對象添加到地圖上使用方法addOverlay();
綁定地圖標記的單擊事件表示當地圖標記被單擊時回調的方法
baiduMap.setOnMarkerClickListener(new OnMarkerClickListener(){
public boolean onMarkerClick(){


}
});
第五步點擊出現彈窗,InfoWindow對象


(7)POI檢索步驟
接以上4步
第五步綁定poi檢索獲取結果監聽器
poiSearch.onGetPoiSearchResultListener(...){..
有兩個方法:
onGetPoiResult(...){...}
onGetPoiDetailResult(...){...}
.}
第六步創建類繼承PoiOverlay的覆蓋物,通過重寫裏面的兩個方法
①構造器
②onPoiClick()確定poi檢索的所有集合


(8)定位步驟
定位有三種模式:
高精度定位模式:使用網絡定位和GPS定位
低功耗定位模式:使用網絡定位
僅用設備定位模式:不需要銜接網絡的情況下進行定位,不支持室內環境的定位
①創建位置接收器對象locationClient(位置接收器必須在主線程中聲明)
②設置當前定位的地圖使用的座標系 locationClientOption.setCoorType("");
③位置接收器註冊註冊接收位置的監聽
registerLocationListener(...){
接收到定位信息時回調該方法
onReceiveLocation(...)

}


(9)路線規劃
通過單例模式獲得路線規劃查詢器
主要通過routePlanSearch.setOnGetRoutePlanResultListener(...){
步行路線
onGetWalkingRouteResult(...)
公交路線
onGetTransitRouteResult(...)
駕車路線
onGetDrivingRouteResult(...)
}
創建一個類繼承DrivingRouteOverlay
其中有點擊路線規劃中的node節點觸發事件(onRouteNodeClick(...))


位置接收器對象啓動
locationClient.start();
發送位置請求
locationClient.requestLocation();
3.極光推送
4.反射註解的應用
①反射註解是爲了減少findviewbyid
②如果需要用到一個系統類中的屬性和方法,可是又不知道這個類中有什麼屬性和方法,可以通過反射獲得這個類中的屬性和方法,通過setAccessiable方法將他設爲public,然後通過set方法進行賦值
5.實現新浪和騰訊微博獲得授權登錄、分享等功能
使用第三方ShareSDK操作
第三方登錄前需要準備兩項工作
①開放API
②實現第三方的授權
其第三方登錄分爲兩種:
①要功能,不要數據
       當觸發第三方登錄事件時,獲取用戶的ID,將用戶的id與服務器平臺中的內容相比較,若存在,則爲合法用戶,允許進入系統;否則調用authorize()方法將引導用戶進入授權頁面,輸入賬戶名和密碼。若調用了onComplete()方法,則授權成功,否則調用removeAccount()方法清除第三方登錄的緩存數據。
②要數據,不要功能
       當觸發第三方登錄事件時,獲取用戶的資料,進行授權操作,若調用onComplete()方法,則說明授權成功,引導用戶直接進入登錄(login)頁面,否則提示錯誤。調用removeAccount()方法清理授權緩存數據。登錄時客戶端發送用戶資料的id給服務端,服務端判定用戶是否已經註冊用戶,若已註冊,則引導用戶進入系統,若沒有註冊,則進入註冊頁面,註冊時用戶挑選自己註冊的所需字段,並提交給服務端,服務端完成註冊後反饋給客戶端引導用戶進入系統。否則調用removeAccount()方法,刪除可能的授權緩存數據。


6.二維碼的功能實現(********)


7..SlidingMenu的實現
slidingMenu也是一種控件,實例化控件的三種方式:
(1)繼承slidingMenu自帶的slidingMenuFragmentActivity
(2)SlidingMenu menu = new SlidingMenu(context);
(3)xml文件註冊


8.檢查更新操作的實現、
 1.檢測當前版本的信息AndroidManifest.xml-->manifest-->android:versionName。


      2.從服務器獲取版本號(版本號存在於xml文件中)並與當前檢測到的版本進行匹配,如果不匹配,提示用戶進行升級,如果匹配則進入程序主界面。


      3.當提示用戶進行版本升級時,如果用戶點擊了確定,系統將自動從服務器上下載並進行自動升級,如果點擊取消將進入程序主界面。
9.BitmapFactory.Options進行圖片的二次採樣(****************)


爲了防止加載大圖片造成內存溢出
方法一
計算 圖片 的原始寬高,默認縮放爲1,
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true; 僅僅解碼邊緣區域
//如果指定了inJustDecodeBounds,decodeByteArray將返回爲空
BitmapFactory.decodeByteArray(bytes,0,bytes.length,options);
//得到寬和高
height = options.outHeight;
width = options.outWidth;


//圖片實際的寬與高,根據默認最大
while((height / sampleSize > Cache.IMAGE_MAX_HEIGHT) || 
       (width / sampleSize > Cache.IMAGE_MAX_WIDTH)){
sampleSize *= 2;
}
//不再只加載圖片實際邊緣
options.inJustDecodeBounds = false;:
//制定縮放比例
options.inSampleSize = sampleSize;
return BitmapFactory.decodeByteArray(bytes,0,bytes.length,options);


方法二:
通過原始圖片的 寬高和現在圖片的寬高計算出縮放的比例,然後再通過縮放的比例縮放。


//給定的BitmapFactory設置解碼的參數
BitmapFactory.Options options = new BitmapFactory.Options();
//從解碼器中獲取原始圖片的寬高,這樣避免了直接申請內存空間
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(...);


options.inSampleSize = calculateInSampleSize(options,reqWidth,reqHeight);
//壓縮後便可以將其設置爲false了
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(...);
。。。


10.每個item的動畫縮放的實現
從xml文件中設置,然後引用佈局


11.AudioManager實現對手機情景模式的控制
12.可擴展的listview


一.是一種可以擴展的listview,就是那種點擊一下可以擴展出子項,再點一下收縮回去的顯示list。因爲需要查看一堆文件的目錄結構,就使用了expandablelist以便於直觀地看到結構形式。
一、ExpandableListView
  一個垂直滾動的顯示兩個級別(Child,Group)列表項的視圖,列表項來自ExpandableListAdapter 。組可以單獨展開。
  其所用到的重要方法如下:
                     1. expandGroup(int groupPos) :在分組列表視圖中展開一組,
      2. setSelectedGroup(int groupPosition) :設置選擇指定的組。 
      3. setSelectedChild(int groupPosition, int childPosition, boolean shouldExpandGroup) :設置選擇指定的子項。
      4. getPackedPositionGroup(long packedPosition) :返回所選擇的組
      5. getPackedPositionForChild(int groupPosition, int childPosition) :返回所選擇的子項
      6. getPackedPositionType(long packedPosition) :返回所選擇項的類型(Child,Group)
      7. isGroupExpanded(int groupPosition) :判斷此組是否展開


二、ExpandableListAdapter
    一個接口,將基礎數據鏈接到一個ExpandableListView。此接口的實施將提供訪問Child的數據(由組分類),並實例化的Child和Group。
  其裏面重要方法:
                     1. getChildId(int groupPosition, int childPosition) 獲取與在給定組給予孩子相關的數據。
              2.getChildrenCount(int groupPosition) 返回在指定Group的Child數目。
                      3.getChildView() 獲取子視圖(就是二級視圖)
                      4. getChildView()獲取父視圖


13.通知




 左邊的popWindow
*/
popView_left = getLayoutInflater().inflate(
R.layout.nearby_popwindow_left, null);
popupWindow_left = new PopupWindow(popView_left, displayMetrics.widthPixels,
LayoutParams.WRAP_CONTENT, true);
// 以下三句設置點擊空白處時popwindow會消失
popupWindow_left.setTouchable(true);
popupWindow_left.setOutsideTouchable(true);
popupWindow_left.setBackgroundDrawable(new BitmapDrawable(
java中也是4個字節 getResources(), (Bitmap) null));
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章