Kotlin教程
https://www.cnblogs.com/Jetictors/p/8647888.html
帶接收者的函數字面值
https://blog.csdn.net/OneDeveloper/article/details/82907555
Section1
有關java的final和Kotlin的val
- val:常量
- var:變量
- Java的final
不可修改
編譯的時候會把引用的值中基本類型進行copy - Kotlin中的val如果要像java中的final一樣前面要加關鍵字const,並且要定義到類外面,就像python裏類外面的
- Kotlin中的函數可以同python和C++一樣當成參數傳遞
lambda表達式
https://www.cnblogs.com/Jetictors/p/8647888.html
- 函數入口參數->返回值
java 和kotlin比較
- 字符串==在kotlin使用相當於java裏的equals方法,在Java裏是比較地址是否相等
空值處理
- 函數的參數後面加上?就是代表可以傳空值
when 表達式
- 參數->結果: 類似java裏的switch
定義區間
- 1 until 100 :[1,100)
- 1…16:[1,16]
交互式命令行(就是python的ipython)
- bin目錄要加入環境變量
- 下載鏈接github:https://github.com/JetBrains/kotlin/releases/tag/v1.2.71
list
- withIndex
map
函數式表達式
- 當函數體只有一行代碼,可以去掉括號直接用“=”爲函數聲明賦值
- 在Kotlin中函數也是變量可以直接賦值給一個變量:
var i ={x:Int,y:Int ->x+y}
繼承
- 父類要打開加open,子類才能繼承
- 重寫方法要加override
接口表示能力,抽象類表示本質
代理,委託
- 下面這個的bug解決
- 把大頭兒子聲明成單例把類class關鍵字緩存object,調用就被創建了。調用的位置就不用()來new了,本身就是object而不是類了。
枚舉
-定義
- 使用
印章類(密封類)
sealed class Son {
fun sayHello(){
Log.e("111","大家好");
}
class xiaoxiaolv:Son();
class xiaoxiaoma:Son();
data class 數據類
- 類似java裏的bean,背後已經實現好了
- equals()/hashCode()
- toString()方法
- componentN()方法
- copy()方法
高階函數
- 行爲參數化:就是把函數當參數使用,就是numpy,和pandas數據分析工具
關於“?”
-
?在類名後表示:類可以爲空
-
?在對象名後表示:對象爲空jvm不處理
-
A?:B表示:A對象爲空用B代替
-
!!.A():表示不爲空在走方法A()
對比代碼 -
代碼1
val roomList: ArrayList<Room>? = null
// ?表示roomList爲空,不執行,roomList?.size返回空
//?:表示roomList?.size爲空,用0代替
if (roomList?.size ?: 0 > 0) {
Log.d("TAG", "-->> 房間數不是0")
}
- 代碼2
fun showToast(json:String){
//?表示後面的代碼不執行
mContext?.toast(json)
//?表示不爲空的時候才調後面的
mContext?.let { it.toast(json) }
}
有關泛型
public inline fun <T, R> Iterable<T>.map(transform: (T) -> R): List<R> {
return mapTo(ArrayList<R>(collectionSizeOrDefault(10)), transform)
}
-
fun <T, R> :聲明函數
-
Iterable.map:函數名
-
(transform: (T) -> R):參數(是一個函數引用)
-
List返回值類型
-
infix 中綴表達式
Section02
函數式編程
-
閉包:
- 複習python的閉包
-
閉包:實例對象()對調用類中的__call__方法(本質是把調對象方法<對象()然後調用__call __>的過程優化,更加節省空間)
第一調用外層的方法,返回裏面一層的方法(函數名指向函數),並且爲裏面的變量付了值。
類似於局部修改全局變量加全局,閉包修改外面加nolocal(python3才能用)
-----特別注意:閉包返回的內函數變量指向的一個單獨的空間包含了外函數設置的變量和內函數函數體本身;他與函數的區別就是除了擁有函數體本身,還擁有函數執行時特有的一些變量
-
裝飾器:爲了滿足開發 - 閉合原則,把本想加在函數內部的代碼寫到函數上面(用@引入)
實現原理:採用閉包把等待裝飾的函數變量傳入閉包內的函數;把閉包返回的內函數變量賦值給待裝飾函數同名的變量,覆蓋原變量(最終調的是內函數);效果就是原函數和調用方式完全不變,達到增加功能的目的,其他不用修飾的位置也不用修改。
等價於:待裝飾函數變量=閉包外函數(待裝飾函數變量)【就像把待裝飾函數包裝了一下,就是java的的裝飾設計模式】,蟒解釋器看到@ ***就執行上邊等價的式子,跟調不調用待裝飾函數沒有關係
還可以用對象()的方式取__call__的方式調用(@類名)
如果要對裝飾器加參數,流程是:先調參數傳入參數,把返回的函數用來對待裝飾的函數進行裝飾
-
- 複習python的閉包
-
Kotlin中的閉包:類似
Gradle 腳本構建
- 傳統的工作:代碼編寫-編譯-測試-手動依賴管理-打包-上傳服務器
- 構建工具ant,maven,Gradle就是自動完成(編譯-測試-手動依賴管理-打包-上傳服務器)
- 支持kotlin管理腳本構建
project and task
- project:編寫的代碼以任務task的方式插入到project類裏面,通過插件的方式完成task工作
- task
-任務可以依賴管理
- 任務task的生命週期
- 掃描:掃描腳本文件,把閉包裏的聲明邏輯執行一遍
- - 可以把聲明式代碼改成運行時代碼
- 掃描:掃描腳本文件,把閉包裏的聲明邏輯執行一遍
- 總結 task的兩個階段:掃描,運行
- gradle 可以把多個任務卸載一個閉包裏,組成任務集
增量式更新
-
- gradle 插件
- 一般有application,java,war
- 一般有application,java,war
依賴管理
- 依賴:compile ‘com.android.support:appcompat-v7:23.+’
- compile 'com.android.support:組織,開發的公司
- appcompat-v7:包名
- 23.+:版本號
- 依賴分爲:測試時依賴 和 編譯時依賴
- gradle的依賴管理,讓之前混亂的依賴管理變的有序,
- 並且當出現依賴衝突,gradle還會主動依賴最高版本的庫
- -可以採用閉包的方式把依賴包依賴的包取消
增量更新
- https://github.com/jiyouliang2/SmartUpdateDemo
- adb shell dumpsys window w |findstr / |findstr name= 獲取當前應用程序的包名
- 用包系統的包安裝者安裝
熱修復(原理動態加載的方式把自己的新方法文件排到前面,來代替有問題的文件)
- 採用AndFix:https://github.com/alibaba/AndFix
class MyApplication: Application() {
override fun onCreate() {
super.onCreate()
val patchManager = PatchManager(this);
patchManager.init("1.0");//current version
patchManager.loadPatch();
val path = File(Environment.getExternalStorageDirectory(),"fixbug.apatch")
patchManager.addPatch(path.absolutePath);//path of the patch file that was downloaded
}
}
- 生成更新包;apkpatch.bat -f new.apk -t old.apk -o out -k debug.keystore -p android -a androiddebugkey -e android
- 添加更新包:adb push fixbug.apatch sdcard/
支付寶支付 客戶端(服務端到pytnon 處理)
- 支付的信息不要放在代碼裏,放在服務器,比如,商戶私鑰商戶id(這樣安全),服務器簽好名,把簽名信息發過來就行。
- 第一次請求商戶的服務器,拿到商品信息
- 下面用到了支付寶的SDK
- 第二次請求支付寶服務器,調取支付
- 處理狀態返回:成功,失敗,取消(注意此時只是客戶端知道了支付結果,公司的服務器還不知道這是:同步通知)
- 支付寶會:異步通知 商家服務器:
Kotlin與H5混合開發
- 去掉標題欄
1.Kotlin調用與js通信的接口
- h5調用Kotlin:對象就是傳給h5用的,直接用對象名調就行
mWebView.addJavascriptInterface(object 對象,string 對象別名)
- 記得提供的方法上要加註解 @JavascriptInterface
@JavascriptInterface
class JavaScriptMethods{
var mContext: Context?=null
constructor(mContext: Context?) {
this.mContext = mContext
}
@JavascriptInterface
fun showToast(json:String){
Toast.makeText(mContext,json,Toast.LENGTH_SHORT).show()
}
}
- h5頁面調用:記住方法前要加上window
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>contlinjs</title>
<script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script>
</head>
<body>
<h1>js</h1>
<button id="btn1">js調用Kotlin方法</button><br />
<br />
<br />
<button id="btn2">js調用Kotlin方法(callback)</button>
</body>
<script >
$($("#btn1").on("click",function(){
var string ="jscontent\n"
window.h5usecoklin.showToast(string)
}))
</script>
</html>
2.Kotlin調用js的代碼
- 直接在Kotlin webview頁面加載完成的回調中調用js的代碼
inner private class MyWebViewClient : WebViewClient() {
override fun onPageFinished(view: WebView?, url: String?) {
super.onPageFinished(view, url)
var json = JSONObject()
json.put("name", "Kotlin")
mWebView.loadUrl("javascript:showMessage("+json.toString()+")")
}
}
3.h5 callback 調用 Kotlin
- 1.就是H5用Kotlin寫好的方法請求網絡:h5->Kotlin
- 2.Kotlin把請求到的結果result,通過h5的方法返回給h5:Kotlin->h5
- 但是Kotlin調用h5要用到webview所以要把webview傳入到對象當中
- webview的方法一定要在主線程,就是loadUrl()
mWebView.loadUrl("javascript:showMessage("+json.toString()+")")
- 注意:爲了解耦h5同kotlin,在第一步h5請求kotlin的時候,把回調的方法名“callback”也傳過去 ```
在線模板
- 由於Kotlin代碼沒有變,js代碼是在服務器的,所以,不用app重新編譯,可以直接執行
設置dialog 顯示在底部。
-
動畫的實習可以:
- 首先採用anim文件夾定義進入,退出的xml動畫,
- 然後在style文件中寫自定義動畫的樣式(引入剛剛的動畫),
- 最後在動畫運行的target view的style文件中引入動畫樣式;
-
相對在線模板,還有本地模板
- 就是把html放在本地,然後請求服務器的數據,填充到模板上,這個技術可以提高加載速度。
- 方法就是創建assets目錄
- 把html項目放在項目裏
- 然後調用loadurl
https安全編程
- keystore:用jdk裏的工具keytool生成
- keytool -genkeypair -alias alipay -keyalg RSA -validity 3650 -keystore alipay.keystore
- 通過keystore生成證書
- 注意對明文簽名:用了md5(不可逆)和私鑰加密,只能保證明文不能被串改。
- https大體步驟
- ssl 上下文
- 信任管理器
- 添加數字證書
- 主機名校驗
加密總結
- 對稱(des aes):更難破解(一般用來加密消息傳遞 )
- 非對稱(RSA):一般用來數字簽名(結合消息摘要)
- 消息摘要(md5,sha1,sha256):登錄註冊
- 數字簽名
- Android 端實現https:https://blog.csdn.net/yehui928186846/article/details/78321769