一:網路技術
1:WebView
我們可以在程式中內嵌一個瀏覽器,用於展示各種各樣的網頁。【還有一種用法:用webview來展示webapp】
使用步驟:在佈局檔案中引入一個webview控制元件——在程式碼中為webview控制元件設定瀏覽器屬性、代理模式、loadUrl設定開啟的網頁等——在AndroidManifest.xml中註冊網路許可權
2:網路請求:使用okhttp框架
3:解析網路響應資料
Json資料:使用Gson庫或者FastJson
XML資料:使用Xstream
二:多執行緒
android多執行緒的使用步驟:
法一:繼承Thread,定義執行緒類,重寫run()方法執行耗時邏輯——在其他地方新建執行緒類例項——執行緒例項.start()啟動執行緒
法二:實現Runnable介面,定義執行緒類,重寫run()方法——用runnable例項作引數,新建Thread執行緒例項——start()啟動執行緒
子執行緒中操作UI:
法一:訊息傳遞機制——handler:主執行緒建立handler,重寫handleMessage方法處理訊息,更新UI——子執行緒中傳送訊息
法二:使用AsyncTask:定義一個非同步任務類繼承自AsyncTask——重寫其中的幾個方法,定義非同步任務執行前、執行時、執行後的回撥方法,在某些方法中操作UI——在其他地方建立非同步任務類例項,通過execute()方法啟動非同步任務
法三:使用 runOnUiThread(new Runnalbe(){重寫run方法}) 方法,在重寫的run方法中操作UI
三:服務
1:服務依賴於建立它的應用程式,當程式被殺死時,所有依賴於該程式的服務都會停止。
2:服務預設是執行在主執行緒中的,因此,雖然服務是在後臺執行,但是如果需要執行耗時操作,也要在服務中開啟子執行緒來執行耗時操作。
3:服務自己停止:在服務中呼叫stopSelf()即可。
4:服務的基本使用:
繼承Service定義服務類,重寫其中的幾個方法,定義服務要執行的操作——在AndroidManifest.xml中註冊服務——在activity中建立intent,通過intent啟動服務——通過intent停止服務
5:活動與服務的通訊呼叫:
繼承Service定義服務類:服務類中繼承Binder定義一個內部類,binder類中定義需要被活動呼叫的方法;服務類中建立binder類例項,並且在onBind()方法中返回這個binder——在activity程式碼中,建立一個ServiceConnection例項,重寫其中的兩個方法,分別對應服務繫結成功與失敗兩種情況的回撥,其中繫結成功回撥方法中獲取到binder例項——在activity中通過intent和connection例項作為引數,繫結服務——在activity中通過binder例項呼叫Binder類中定義的方法——在activity中通過connection例項作為引數,解綁服務
6:服務的高階用法:
前臺服務:在定義服務類時,重寫onCreate()方法,在其中建立一個通知,並讓通知顯示,這樣在服務被建立時就會在顯示一個前臺通知了。
執行耗時操作的服務——IntentService類:非同步的、非同步操作完成後會自動停止的服務。
繼承IntentService類定義一個非同步服務類——重寫兩個方法,其中:onHandleIntent()方法中執行耗時操作,這個方法會自動在子執行緒中執行,因此不會導致ANR;onDestroy()方法會在onHandleIntent()方法執行完畢後自動呼叫,自動停止服務——在activity中通過intent,啟動非同步服務類
四:LBS——基於位置的服務
1:定位的實現:通過手機的GPS定位;通過附近的三個網路基站計算定位。
2:實際應用:多采用高德地圖SDK或者百度地圖SDK來進行定位、描點、規劃路線等。
五:進階技巧
1:使用Intent傳遞物件
法一:序列化
定義實體類時,實現Serializable介面,這樣的建立出來的類物件就可以在intent中攜帶了
//攜帶物件 intent.putExtra("key",obj) //提取物件 CLassName obj = (ClassName)getIntent().getSerializableExtra("key")
法二:Parcelable
Parcelable把一個完整的物件進行分解,分解的每一部分都是可以被intent攜帶的基本資料型別。
定義實體類時,實現Parcelable介面——重寫writeToParcel(Parcel dest)方法,通過dest.writeXX(類成員變數)來決定要分解、輸出哪些內容——定義Creator常量,重寫其中的createFromParcel(Parcel source)方法,從source中提取被分解掉內容,重新建立出一個類物件並返回
//攜帶物件 intent.putExtra("key",obj) //提取物件 CLassName obj = (ClassName)getIntent().getParcelableExtra("key")
2:超級實用技巧——訂製日誌工具:開發除錯、故障診斷時列印關鍵資料,上線後不列印
新建一個工具類,LogUtil:
import android.util.Log; /** * Created by yeguojian on 2017/10/12. */ public class LogUtil { //定義6個級別 public static final int VERBOSE = 1; public static final int DEBUG = 2; public static final int INFO = 3; public static final int WARN = 4; public static final int ERROR = 5; public static final int NOTHING = 6; //控制允許列印的最低階別 public static int level = VERBOSE; public static void v(String tag,String msg){ if(level<=VERBOSE){ Log.v(tag,msg); } } public static void d(String tag,String msg){ if(level<=DEBUG){ Log.d(tag,msg); } } public static void i(String tag,String msg){ if(level<=INFO){ Log.i(tag,msg); } } public static void w(String tag,String msg){ if(level<=WARN){ Log.w(tag,msg); } } public static void e(String tag,String msg){ if(level<=ERROR){ Log.e(tag,msg); } } }
之後,在其他需要列印日誌的地方,使用:
LogUtil.XX("tag","msg") //XX為具體列印函式
進行列印;
在除錯、故障排查時,我們只需把LogUtil的level改低,即可看到列印資訊;要上線使用時,level設定為NOTHING,即可無列印。
3:Doze模式簡介
Android 6.0以上的裝置,未連線電源並且關閉了螢幕一段時間後,就進入了Doze模式。
Doze模式下,系統會限制CPU、網路、Alarm等活動。
系統採取間歇性退出Doze模式的策略,讓應用可以完成資料同步、alarm定時任務等。
因此,如果需要精確的定時任務,則需要通過AlarmManager的setAndAllowWhileIdle()或setExactAndAllowWhileIdle()方法設定Doze模式下也能工作的定時任務。
4:多視窗分屏
android6.0之後增加了分屏功能:開啟一個應用後,長按底部虛擬導航欄的最右邊overview按鈕,進入分屏。
分屏後的生命週期:使用者互動哪邊螢幕的活動,該活動就處於執行狀態,另一邊螢幕的活動就變成了暫停狀態。
禁用分屏:想要自己的應用禁止分屏模式,只需在AndroidManifest.xml中配置一下即可:application或activity標籤新增屬性:android:resizeableActivity="false"
禁用橫屏:android:screenOrientation="portrait"(意思是:只支援豎屏)
5:Lambda表示式:同RN裡的箭頭函式。
6:定時任務——Alarm
獲取定時工作管理員例項:AlarmManager manager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
設定定時任務:manager.set(工作型別,觸發時間,觸發pendingIntent)
長時間重複執行的定時任務(輪詢):
新建一個服務,繼承自Service——重寫onStartCommand()方法,在其中新建一個執行緒,run()方法中執行具體的執行任務,並且start;然後獲取alarmManager例項,設定多少間隔後的定時任務,pendingIntent為呼叫該服務類.class(呼叫自身:即定時重啟服務,而服務啟動時會建立子執行緒執行具體邏輯);最後,return super.onStartCommand(intent,flag,startID)。