《第一行程式碼》讀書筆記三

weixin_34259232發表於2017-10-08

一:網路技術

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)。

 

相關文章