發表文章

Kotlin - 實現Android中的Parcelable

圖片
使用 Parcelable 的最基本用例是當我們需要將模型從一個活動傳遞到另一個活動時。當傳遞原始類型時,很簡單,但是當我們想要傳遞自己的對象時,我們需要對它們做一些事情: class ActivityA : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val intent = Intent(this, ActivityB::class.java) val person = Person("name", 32, "email@email.com", 1234) intent.putExtra("A_STRING", "some string") intent.putExtra("A_NUMBER", 1234) intent.putExtra("AN_OBJECT", person) // compilation error startActivity(intent) } } 如果我們認為我們使用的 Person 對象與上一篇文章相同,則會在第11行收到編譯錯誤,因為我們無法照原樣傳遞 Person 模型。 我們的模型不符合以上任何條件,因此我們需要對此做些事情,我們有一些選擇: Implement Serializable: 希望您不再這樣做,儘管它有效且易於實施,但由於它基於反射,因此性能相當差。 Json String representation : 您也可以這樣做,並將模型作為String傳遞。同樣,這也非常簡單,特別是如果您已經Gson在項目中使用了類似功能,但又不是最佳選擇。 Implement Parcelable: 這顯然是正確的答案。根據官方文檔,這是推薦的方式。它也適用於   marshalling/unmarshallingJava 對象,例如序列化,但性能更高。 因此,Parcelable是最好

Android Coroutine Recipes

圖片
本文的原始碼可以在 YangQiRen/coroutine-recipes 中找到 基於Coroutine v1.0.0版本 引入依賴 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.0.0' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.0.0' 如何啟動協程(Coroutine) 在 kotlinx.coroutines 庫中,您可以使用 launch 或 async 函數來啟動新的協程。 從概念上講, async 就像 launch 。它啟動一個單獨的協程,這是一個輕量級線程,可與所有其他協程同時工作。區別在於, launch 返回一個 Job 且不攜帶任何結果值,而 async 返回一個 Deferred 輕量無阻塞的未來,表示希望稍後提供結果。您可以使用 .await() 延期的值來獲得其最終結果,但是 Deferred 它也是一個 Job ,因此可以根據需要取消它。 ***重點*** 如果裡面的代碼 launch 以異常終止,然後將其視為未捕獲線程中的異常會使Android應用程序崩潰。內部未捕獲的異常 async 代碼存儲在結果中 Deferred 並且不會在其他任何地方交付,除非經過處理,否則它將被靜默丟棄。 協程調度員(Coroutine Dispatcher) 在Android中,我們通常使用兩個調度程序: uiDispatcher將執行分派到Android主UI線程(用於父協程)。 bgDispatcher在後台線程中分派執行(用於子協程)。 //將執行分派到Android主線程中 val uiDispatcher:CoroutineDispatcher = Dispatchers.Main //將共享線程池表示為協程分派器 val bgDispatcher:CoroutineDispatcher = Dispatchers.I0 在下面的例子中,我們將使用 CommonPool 用於 bgContext 這限制並行運行為值64個線程或核的數量

Android Room資料庫的使用

前言 Google終於釋出了一個和SQLite相關的庫了。之前一直都是在SQLite、XUtils、greenDao、Realm這些資料庫之間來回折騰。現在終於有一個更“正統”資料庫了。 Room是什麼? 2017 年 5 月,Google I/O ’17 發佈了 Room,至此 persistence 歸於一統 — Room。Room 具有良好的擴充性及彈性,對於多個 Table 間的複合查詢也相當的容易,簡單的標示即可產生Database、Table,對於SQL 語法頭疼的人乃一大福音。 使用Room 1、在app/build.gradle中新增以下依賴 implementation 'android.arch.persistence.room:runtime:1.1.1' annotationProcessor 'android.arch.persistence.room:compiler:1.1.1' 2、建立JavaBean @Entity public class User { @PrimaryKey(autoGenerate = true) // 主鍵是否自動增加,預設為false @ColumnInfo(name = "id") private int id; private String name; private int age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age;

Kotlin - Convert Unix Timestamp to Date 時間戳記的轉換

What is a Unix Timestamp 參考連結 直接進入程式碼的部分: object TimeUtil { @JvmStatic fun StampToDate(time: Long, locale: Locale): String { // 進來的time以秒為單位,Date輸入為毫秒為單位,要注意 val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", locale) return simpleDateFormat.format(Date(time)) } @JvmStatic fun DateToStamp(date: String, locale: Locale): Long { val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", locale) /// 輸出為毫秒為單位 return simpleDateFormat.parse(date).time } } 使用: println(TimeUtil.StampToDate(1560839160000, Locale.TAIWAN)) println(TimeUtil.DateToStamp("2019-06-18 14:26:00", Locale.TAIWAN)) 以台灣為例,GMT+8  Date 格式是 "yyyy-MM-dd HH:mm:ss" 假如 台灣 Date = "2020-10-21 18:00:00" 轉換成時間戳是  1603274400 同時間 在 GMT +0 時區的地方 Date =  "2020-10-21 10:00:00" 轉換成時間戳也是  1603274400

Android - 使用 adb 安装apk

adb就是Android debug bridge的簡寫,用來和模擬器或實機互動的工具,可以參考 官方文件 。 adb在 \sdk\platform-tools 目錄底下,直接點選是無法正常使用的,一定要透過 命令提示字元 。 啟動 命令提示字元 的方法: windowsKey + R,然後輸入cmd.exe。 或是找到命令提示字元的捷徑點開。 啟動後,會看到目前的目錄,請將目錄改到\sdk\platform-tools,方法是輸入cd <path>。 確定目錄在\sdk\platform-tools下面後,輸入adb shell,adb就會 啟動 。 通常我們是要使用adb去安裝apk檔案到手機內。先將手機設定好,開啟debug偵錯,然後透過adb來確認有無連接上手機,輸入: adb devices 。若有連接上的話,會看到手機的序號,是一串字碼,反之,則什麼都沒有。 安裝apk 的方法是, 先把apk檔案放到\sdk\platform-tools下, 或是把目錄改到apk檔案所在的目錄。 然後輸入 adb install name.apk ,就會安裝,安裝完會顯示success。 若是要重新安裝,不須解除安裝,僅需輸入adb install  -r  name.apk。多一個-r。 原文連結如下:http://wisdomskyduan.blogspot.com/2014/10/android-adbapkusb.html

Godot 使用Android module 踩坑步驟,一踩就上手

圖片
範例影片: https://www.youtube.com/watch?v=rbr3a7xh4dk 參考網址: https://docs.godotengine.org/en/3.1/development/compiling/compiling_for_android.html 作業系統:Mac OSX 由於我需要修改 godot 對輸出 Android 平台的設置,需要修改Android manifest 並且使用Android Class(Content provider) 去達到 多個應用程式共用資料,需要使用 godot GitHub 上的 Godot IDE source 。 Step 1. 打開Terminal,git clone https://github.com/godotengine/godot.git Step 2.  cd godot/ Step 3. 這時候你可以先在godot/ 資料夾內,這邊使用scons自動構建工具去安裝平台的套件套件,輸入scons看看,如果找不到,需要上網搜尋如何安裝scons。 Step 4. 安裝好scons後,輸入scons看看有幾個平台,如果沒有Android,你要先把SDK、NDK路徑先設定好, 這篇 給你參考。 *** 注意這邊我為什麼用ndk-r15c(第一坑)呢,因為我遇到 這個問題 *** 順邊貼上我自己的設定 Step 5. 設定完成後發現輸入scons 有多一個Android平台跑出來,此時輸入 scons platform = android Step 6. 安裝完成後, cd godot/bin/ chmod +x godot.osx.tools.64 ./godot.osx.tools.64 即可開啟Godot IDE Step 7. 接下來要 Building the export templates Step 8. 接下來  Installing the templates 設定debug release apk Step 9. Setting it up in Godot ,設定Adb Jarsigner Debug keystore,

Android FirebaseInstanceIdService is deprecated 已棄用

最近開啟專案發現 FirebaseInstanceIdService onTokenRefresh() 方法已棄用了。 查詢一下 官方文件 發現將此方法改用 FirebaseMessagingService onNewToken  取代 這意味著無需使用 FirebaseInstanceIdService 服務來獲取FCM令牌。您可以安全地刪除   FirebaseInstanceIdService 服務 範例代碼: public class MyFirebaseMessagingService extends FirebaseMessagingService { @Override public void onNewToken(String s) { super.onNewToken(s); Log.e("NEW_TOKEN",s); } @Override public void onMessageReceived(RemoteMessage remoteMessage) { super.onMessageReceived(remoteMessage); } } 希望你能在這裡得到解決方案。