1月收穫與體會

平時都會在印象筆記寫日報和週報,現在嘗試寫一寫月報,總結1月份的收穫與體會,具體的內容:

自我學習: 本月在工作之餘,學習了什麼知識

遇到的問題: 本月在工作中遇到的技術問題及解決方法

收穫體會: 本月在工作學習過程中,有哪些收穫或者感悟體會,有哪些優秀點,繼續堅持。

待改進的地方: 本月工作學習過程中,有哪些地方做的不好,以後需要改進。

自我學習

學習清單


5、RN學習

RN 集成到現有原生應用

https://reactnative.cn/docs/integration-with-existing-apps/

運行命令

在RN根目錄下執行 >react-native run-android

注意RN版本問題,可以從packaget.json看到
如果是低版本(如低於0.49 ),有個問題:(沒有這個方法setJSMainModulePath,改成這個setJSMainModuleName)(也沒有index.js,而是index.android.js)

mReactInstanceManager = ReactInstanceManager.builder()
        .setApplication(getApplication())
        .setBundleAssetName("index.android.bundle")
        .setJSMainModuleName("index.android") 
        .addPackage(new MainReactPackage())
        .setUseDeveloperSupport(BuildConfig.DEBUG)
        .setInitialLifecycleState(LifecycleState.RESUMED)
        .build();

iOS 和 Android 開發的 React Native 入門指南

https://danleechina.github.io/A-Guide-of-React-Native-for-iOS-And-Android-developer/

  1. 建議在原生項目上添加 RN 支持,文檔地址集成到現有原生應用。
    如果使用 create-react-native-app AwesomeProject 命令來生成一個 RN 項目,會引入 Expo 這種東西,我個人不建議使用此類框架。
  2. 不建議使用 NavigatorIOS 這類組件,推薦 React Navigation,但是這個開源組件坑也比較多,不過個人認爲還是比 RN 提供的組件要好。

一些參考:

(1)RN集成原生Android開發 https://www.jianshu.com/p/2fbdf5a12922

(2)【React Native】環境搭建的error

calling AppRegistery.runApplication

解決辦法
[https://blog.csdn.net/colinandroid/article/details/71539168
http://localhost:8081/index.android.bundle?platform=android](https://blog.csdn.net/colinandroid/article/details/71539168
http://localhost:8081/index.android.bundle?platform=android)

可以驗證自己的packager是否是可以用的

React Native的WebStorm基本設置

https://blog.csdn.net/xiangzhihong8/article/details/52293896

在webstorm熱加載:在手機搖一搖出設置彈窗,選擇Live Reload(全局刷新,寫完代碼保存一下就會自動更新)

ReactNative入門-用webstorm調試

遇到的問題

1、某個手機的TextView不可點擊,其他手機可以

解決方法:首先確定點擊屬性是有的(AS>Tools>LayoutInspector),嘗試各個方法(implement View.onClickListener / xmlz中onclick / kotilin代碼轉java) 均無效

最後,把TextView的位置上移,發現可以點擊了(進而把TextView換成Button,也可以點擊) ,猜測是手機觸摸區域問題

2、Uri.fromFile(file)在Android8.0手機報崩潰

解決方法:關於Android 7.0 適配中 FileProvider 部分的總結

http://yifeng.studio/2017/05/03/android-7-0-compat-fileprovider/

另外解決微信不能分享問題
https://www.jianshu.com/p/a950f5596a01

用系統提供的URI方式

content://media/external/video/media/44224

而不用自定義fileprovider方式

content://{applicationId}.provider/external_files/video/xxx.mp4

private fun getVideoContentUri(context: Context, videoFile: File): Uri? {
    val filePath = videoFile.absolutePath
    val cursor = context.contentResolver.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
            arrayOf(MediaStore.Video.Media._ID), MediaStore.Video.Media.DATA + "=? ",
            arrayOf(filePath), null)
    var uri: Uri? = null

    if (cursor != null) {
        if (cursor.moveToFirst()) {
            val id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID))
            val baseUri = Uri.parse("content://media/external/video/media")
            uri = Uri.withAppendedPath(baseUri, "" + id)
        }
        cursor.close()
    }

    if (uri == null) {
        val values = ContentValues()
        values.put(MediaStore.Video.Media.DATA, filePath)
        uri = context.contentResolver.insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values)
    }

    return uri
}    

3、崩潰問題

解決方法:這個是kotlin的安全檢查問題,修改判null即可

反思:這個問題解決比較慢,50分鐘左右,其實20分鐘應該就足夠了

爲什麼解決這麼慢?沒有仔細看崩潰日誌,被混淆的日誌干擾

爲什麼會混淆的日誌干擾?對混淆日誌的反編譯,比較麻煩,有抵觸心理

爲什麼不找簡單的方法,有沒有不麻煩的方法?有的,比如下面這個日誌,分析下,應該是ui.browser包下,a類下的onActivityResult方法,這個可以onActivityResult出發

java.lang.IllegalArgumentException: Parameter specified as non-null is null: method com.xxx.xxx.ui.browser.a.onActivityResult

用搜索,然後找ui.browser包下

4、發出三個通知,不同的Pending,但只有點擊第1個通知有效,其他兩個無效

解決方法:這種問題是因爲pending的跳轉對象是一樣的,然後設置的requestCode也是一樣導致的,修改成不同的requestCode即可

5、icepick恢復數據無效

原因:不支持kotlin

https://github.com/frankiesardo/icepick/issues/47

解決方法:現在直接用onSaveInstanceState保存數據,在onCreated恢復數據

另外可用開源庫(支持kotlin)

https://github.com/evernote/android-state

需要注意在build因緩存無效問題

6、在Android 8.0上的禁止通知聲音有問題

解決方法:

在Android8.0以下的系統:不設置NotificationCompat.Builder.setSound(或者setSound(null))可以禁止通知聲音

這種方法在Android8.0及以上無效,需要用NotificationChannel的方式,設置importance參數爲NotificationManager.IMPORTANCE_LOW

NotificationChannel(channelId, channelName,  NotificationManager.IMPORTANCE_LOW)

這時候才能禁止Android8.0及以上系統通知的聲音

收穫體會

1、整理詳細業務的感悟
前期在寫日報的時候,太過於簡單,只是一句話(還是描述性語句),沒有寫到詳細的過程,比如debug Android源碼,沒有寫到debug的最關鍵代碼,最終得出什麼結論。
還是要認真對待自己的工作,日報是一個很好的表現,不要偷懶。

2、幫同事解決問題,幫他梳理解決驗證方案,並傳授經驗,解決問題的三步驟:分析問題、列舉方案、逐一驗證

3、在對需求時候通過畫邏輯流程圖,幫助梳理保活邏輯

4、前端 WEBVIEW 指南之 ANDROID 交互篇

webview的客戶端調用js

方法1:loadUrl()

方法2:evaluateJavascript() 異步,有回調方法

js調用客戶端Java:

注入映射方法:addJavascriptInterface() (將 Java 對象和 JS 對象進行映射)

5、requestLayout() and invalidate()的區別

invalidate()只是執行了onDraw方法,而requestLayout方法執行onMeasure、onLayout、onDraw方法

https://stackoverflow.com/questions/13856180/usage-of-forcelayout-requestlayout-and-invalidate

待改進的地方

再接再厲

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章