主頁 > 移動端開發 > startActivityForResult被標記為棄用后,如何優雅的啟動Activity?

startActivityForResult被標記為棄用后,如何優雅的啟動Activity?

2021-10-25 07:16:53 移動端開發

文章目錄

    • 一、如何解決 startActivityForResult 被棄用?
    • 二、ActivityResultContract 該如何使用?
    • 三、但是......我就想簡單的使用startActivityForResult怎么辦?
    • 四、總結

轉載請注明出處:https://blog.csdn.net/hx7013/article/details/120916287

Activity Result API已經出來有一段時間了,但是還是有很多朋友對這個API感到使用不便或疑惑,今天盡量用一篇簡短的文章簡述下registerForActivityResult的使用方法,

一、如何解決 startActivityForResult 被棄用?

ManageStartActivity

可以明顯的看到,在androidx.activity1.2.0-alpha04時開始,Android中這位你呼叫過無數次的startActivityForResultonActivityResult,已經被官方標記為棄用了,繼而推出了名為Activity Result API的組件,

棄用原因也許是onActivityResult里需要處理的各種判斷、嵌套,也許是既要處理requestCode也要處理resultCode這種高耦合難以維護的Id判斷模式,但其原因已不重要了,因為既然Android里已提供了更好的方案并把startActivityForResult標記為了棄用,那么我們就應該開始了解一下位于 ComponentActivityFragment 中的registerForActivityResult了,

這里先做一個簡單的對比,來了解下registerForActivityResult的簡單及清爽

// startActivityForResult
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    startActivityForResult(Intent(this, SecondActivity::class.java), REQUEST_CODE)
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)

    when (requestCode) {
        REQUEST_CODE -> {
           val code = resultCode
           val data = data
        }
    }
}

companion object {
    private const val REQUEST_CODE = 1024
}

// registerForActivityResult
private lateinit var resultLauncher: ActivityResultLauncher<Intent>

private val launcherCallback = ActivityResultCallback<ActivityResult> { result ->
    val code = result.resultCode
    val data = result.data
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    resultLauncher = registerForActivityResult(
        ActivityResultContracts.StartActivityForResult(),
        launcherCallback)

    resultLauncher.launch(Intent(this,SecondActivity::class.java))
}

代碼一看完,是不是第一感覺不對啊,怎么感覺比之前還復雜了,其實這里是為了讓你更直觀的了解到這個registerForActivityResult到底是什么東西,所以對載體、定義協定、回呼3個類分別定義寫出來,其實大部分情況我們像以下代碼其實這么寫就可以了

private val launcherActivity = registerForActivityResult(
    ActivityResultContracts.StartActivityForResult()) {
    val code = it.resultCode
    val data = it.data
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    launcherActivity.launch(Intent(this, SecondActivity::class.java))
}

是不是瞬間清爽了許多,但是…你還是覺得比使用startActivityForResult更復雜?其實不然,因為上面代碼的需求是一個單一的回呼,所以看著似乎startActivityForResult更便于維護和使用,但倘若撰寫一個稍復雜的頁面,需要同時請求相冊、需要在其它Activity選擇資料并回呼、需要判斷權限等等時,繼續使用startActivityForResult,會導致onActivityResult里摻雜各種嵌套及判斷,導致代碼難以維護,而使用registerForActivityResult()可以多次呼叫以注冊多個 ActivityResultLauncher 實體,用來處理不同的Activity結果,讓代碼更便于維護,

優勢了解到了,但既然需要使用新的功能,那么我們就必須要先了解以下,剛說到的ActivityResultLauncherActivityResultContractActivityResultCallback到底是些什么東西

  • ActivityResultLauncher 從字面意思其實就能很好理解,可以理解它就是一個Activity的啟動器,它的作用就是承載啟動物件與回傳物件,通過registerForActivityResult回傳該物件,這時并不會立即啟動另一個Activity,
  • ActivityResultContract 是用來協定所需的輸入型別以及結果的輸出型別,Android默認提供了一些常用的定義,例如上面所使用到到ActivityResultContracts.StartActivityForResult(),當然這里你也可以通過繼承ActivityResultContract實作自己的定義,
  • ActivityResultCallback 通過名字就可以了解到這是啟動Activity并回傳到當前Activity時的結果回呼,

對于這3個類,其實只需重點了解ActivityResultContract,就能很輕松的理解并使用好Activity Result API了,

同時,參考一個官方檔案的警告 ↓

注意:雖然在 fragment 或 activity 創建完畢之前可安全地呼叫 registerForActivityResult(),但在 fragment 或 activity 的 Lifecycle 變為 CREATED 狀態之前,您無法啟動 ActivityResultLauncher

二、ActivityResultContract 該如何使用?

剛才的例子中,其實已經簡單的使用到Android提供的一個默認協定ActivityResultContracts.StartActivityForResult()來啟動了一個Activity并獲得想要的回傳值,除了StartActivityForResult(),Android還提供了以下的默認協定以便于開發者的使用

ActivityResultContracts.*說明引數回呼
StartActivityForResult可以理解為startActivityForResultIntentActivityResult(code,data)
TakePicture通過MediaStore.ACTION_IMAGE_CAPTURE拍照并保存保存檔案的Uri是否保存成功
TakePicturePreview通過MediaStore.ACTION_IMAGE_CAPTURE拍照null(Void)圖片的Bitmap
CaptureVideo通過MediaStore.ACTION_VIDEO_CAPTURE拍攝視頻并保存(androidx.activity 1.3.0-alpha08后提供,androidx.appcompat好像還沒提供該類)保存檔案的Uri是否保存成功,
RequestPermission請求單個權限Manifest.permission.*用戶是否授予該權限
RequestMultiplePermissions請求多個權限Array<Manifest.permission.*>回呼為map, key為請求的權限,value為用戶是否授予該權限
CreateDocument通過Intent.ACTION_CREATE_DOCUMENT創建一個檔案默認檔案名選擇目錄后回傳該檔案的Uri
GetContent通過Intent.ACTION_GET_CONTENT獲取一個檔案(這個方法可以通過android.content.ContentResolver.openInputStream獲取到檔案的原始資料)MIME型別檔案Uri
GetMultipleContents通過Intent.ACTION_GET_CONTENTIntent.EXTRA_ALLOW_MULTIPLE獲取一個或多個檔案(這個方法可以通過android.content.ContentResolver.openInputStream獲取到檔案的原始資料)MIME型別檔案List
OpenDocument通過Intent.ACTION_OPEN_DOCUMENT選擇檔案MIME型別檔案Uri
OpenDocumentTree通過Intent.ACTION_OPEN_DOCUMENT_TREE選擇一個目錄,回傳一個Uri并得到該目錄下全部檔案的管理權目錄初始位置Uri選擇目錄Uri
OpenMultipleDocuments通過Intent.ACTION_OPEN_DOCUMENTIntent.EXTRA_ALLOW_MULTIPLE獲取一個或多個檔案MIME型別檔案List
PickContact通過Intent.ACTION_PICK從系統通訊錄中獲取聯系人null(Void)聯系人Uri
StartIntentSenderForResult構建IntentSenderPendingIntent使用IntentSenderRequest.Builder構建ActivityResult(code,data)
TakeVideo通過MediaStore.ACTION_VIDEO_CAPTURE拍攝視頻并保存(棄用了,官方解釋是縮略圖的Bitmap的回傳不穩定,替換為上面的CaptureVideo即可)保存檔案的Uri視頻縮略圖Bitmap

以上全部ActivityResultContracts可在GitHub查看完整示例原始碼

OK,到此是不是慢慢開始感覺到Activity Result API的便捷了,
雖然Android提供的默認協定ActivityResultContracts已經很豐富了,但是為了自己應用內Activity型別安全的傳遞或是解耦,有時我們需要自己創建一個ActivityResultContract,其實查看ActivityResultContracts任意一個類的原始碼,發現自己實作ActivityResultContract并不復雜,只需繼承ActivityResultContract,即可實作型別安全的Activity啟動與資料回傳,

class ContractActivity : AppCompatActivity() {

......

    /**
     * 繼承[ActivityResultContract]
     *
     * 泛型第一個引數為傳入到 [ContractActivity] 的引數
     * 第二個引數為 [ContractActivity] 回傳給啟動Activity的回傳值
     */
    class Contract : ActivityResultContract<String, String>() {
        /**
         * 創建啟動Intent
         * @param context [Context]
         * @param input 當前類的第一個泛型參, 這里自己實作傳遞程序
         */
        override fun createIntent(context: Context, input: String): Intent =
            Intent(context, ContractActivity::class.java).apply {
                putExtra(EXTRA_NAME, "$input - ${System.currentTimeMillis()}")
            }

        /**
         * 決議結果
         * @param resultCode [Activity.setResult] 的 resultCode
         * @param intent [Activity.setResult] 的 intent
         * 其實這里類似 [Activity.onActivityResult] 處理程序,只是由于回傳是明確的,所以少了requestCode
         */
        override fun parseResult(resultCode: Int, intent: Intent?): String {
            return if (resultCode == Activity.RESULT_OK && intent != null) {
                "${intent.getStringExtra(EXTRA_RESULT)} - ${System.currentTimeMillis()}"
            } else {
                "error"
            }
        }

        companion object {
            /** EXTRA */
            const val EXTRA_NAME = "extra_name"
            const val EXTRA_RESULT = "extra_result"
        }
    }
}

定義好一個Contract后,在使用Activity Result API啟動ContractActivity時,只需呼叫

val launcherContractActivity = registerForActivityResult(ContractActivity.Contract()) { result: String -> }

launcherContractActivity.launch("hi, Activity Result API!")

怎么樣,是不是瞬間覺得特別方便?而且這種方式讓啟動Activity解耦得很徹底,啟動方能明確的知道該傳什么值給被啟動的Activity,也能明確的知道被啟動Activity會回傳什么資料,

以上全部ActivityResultContracts可在GitHub查看完整示例原始碼

三、但是…我就想簡單的使用startActivityForResult怎么辦?

雖然Activity Result API非常強大與便捷,但在國內各廠商深度定制系統的情況下,權限申請操作一般我們還是會使用到第三方框架,拍照、視頻錄制大部分情況使用系統界面操作肯定也不適用,所以Activity Result API里,我的剛需似乎只是一個startActivityForResult那么簡單, 那有更便捷的方法嗎?

首先,嘗試一個直接在按鈕點擊時創建一個ActivityResultLauncher并啟動

viewBinding.btnStartActivityForResult.setOnClickListener {
    registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result->
       val code = result.resultCode
       val data = result.data
     }.launch(Intent(this@ActivityResultContractsActivity, SecondActivity::class.java))
}

看著似乎很方便,又不需要提前注冊,即用即回呼,但是很不幸,這樣使用你會識訓一個IllegalStateException,例外里也說得很明白LifecycleOwner xxx is attempting to register while current state is RESUMED. LifecycleOwners must call register before they are STARTED.,必須在STARTED前呼叫registerForActivityResult

看來我們必須每次都必須通過registerForActivityResult預定一個ActivityResultLauncher,在需要的時候再去launch,這…似憾訓是比較麻煩,那么來看看一個ManageStartActivity小框架吧,

👉 ManageStartActivity - Github 一個基于Activity Result API搭建的純粹啟動Activity的小框架,

何為純粹?就是只負責啟動Acitivity,權限、拍照、錄像等等雖然Activity Result API都支持,但是該框架都不去實作這些功能,原因一,剛也描述過,這些預定的Contract可能在國內大環境下兼容不一定好,或者UI及功能上過于簡單不能滿足實際功能需求,原因二,是若想自己呼叫,使用其實也很簡單,只需呼叫Android提供的這些默認協定即可,所以ManageStartActivity只是純粹的為了減輕使用Activity Result API啟動Activity時過于繁瑣的那些步驟,

只需兩步,輕松實作startActivityForResult

  1. ComponentActivityFragment 實作 IMangeStartActivity介面,并委托給MangeStartActivity處理
  2. onCreate時呼叫initManageStartActivity()即可
abstract class BaseActivity : AppCompatActivity(), IMsa by msa() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        initManageStartActivity()
    }
}

推薦在BaseActivityBaseFragment里實作 IMangeStartActivity介面, 這樣就能愉快的在任意繼承Base的頁面中使用startActivityForResult

// 注意實作 `IMsa by msa()`
class SampleActivity : AppCompatActivity(), IMsa by msa() {

    override fun onCreate(savedInstanceState: Bundle?) {
        // 推薦在super.onCreate 前初始化 `initMangeStartActivity`
        // 這樣就能防止還未初始化`ActivityResultLauncher`就呼叫`launch`導致`UninitializedPropertyAccessException`例外
        initManageStartActivity()
        super.onCreate(savedInstanceState)
    }

    /**
     * 直接啟動Activity
     * 3 種方式
     */
    fun startActivity() {
        // Android習慣模式,傳入KClass即可
        startActivity(MainActivity::class) {
            putExtra("key", "value")
        }

        // KClass擴展方法模式
        MainActivity::class.start {
            putExtra("key", "value")
        }

        // Intent擴展方法模式
        Intent(this, MainActivity::class.java).apply {
            putExtra("key", "value")
        }.start()
    }

    /**
     * 啟動Activity并需要回呼結果
     * 4 種方法
     */
    fun startActivityForResult() {
        // Android習慣模式,傳入KClass即可
        startActivityForResult(MainActivity::class, {
            putExtra("key", "value")
        }) { code: Int, data: Intent? ->
            // code = resultCode
        }

        // KClass擴展方法模式
        MainActivity::class.startForResult({
            putExtra("key", "value")
        }) {code: Int, data: Intent? ->
            // code = resultCode
        }

        // Android習慣模式,傳入Intent即可
        startActivityForResult(Intent(this, MainActivity::class.java).apply {
            putExtra("key", "value")
        }){ code: Int, data: Intent? ->
            // code = resultCode
        }

        // Intent擴展方法模式
        Intent(this, MainActivity::class.java).apply {
            putExtra("key", "value")
        }.startForResult { code: Int, data: Intent? ->
            // code = resultCode
        }
    }

    /**
     * Kotlin協程掛起函式
     * 4 種方式
     */
    fun startActivityForResultCoroutine() {
        lifecycleScope.launch {
            // Android習慣模式,傳入KClass即可
           val (code1: Int, data1: Intent?) = startActivityForResultSync(MainActivity::class) {
               putExtra("key", "value")
           }

            // KClass擴展方法模式
            val (code2: Int, data2: Intent?) = MainActivity::class.startForResultSync {
                putExtra("key", "value")
            }

            // Android習慣模式,傳入Intent即可
            val (code3: Int, data3: Intent?) = startActivityForResultSync(Intent(this@SampleActivity, MainActivity::class.java).apply {
                putExtra("key", "value")
            })

            // Intent擴展方法模式
            val (code4: Int, data4: Intent?) = Intent(this@SampleActivity, MainActivity::class.java).apply {
                putExtra("key", "value")
            }.startForResultSync()
        }
    }
}

對的,要的就是這種純粹的startActivityForResult的感覺,

四、總結

Activity Result API和更優雅的使用startActivityForResult現在想必你都已經會使用了,是不是比你想象的更簡單?
如果有需要,我會再寫一篇使用較少的在單獨的類中接收 Activity 結果Activity Result API的原始碼決議,技術有限,若文中有錯誤遺漏之處,盡情諒解,也歡迎指正共同進步,

轉載請注明出處:https://blog.csdn.net/hx7013/article/details/120916287

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/335193.html

標籤:其他

上一篇:Android初學三之仿微信APP實作對有recycleView的頁面進行點擊跳轉設計

下一篇:全網最新Unity-Vuforia(高通)環境配置心得及使用教程(2021.10)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:40:31 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:40:11 more
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:39:36 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:39:13 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:16:23 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:16:15 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:15:46 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:14:53 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:14:08 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:08:34 more