主頁 > 移動端開發 > 【好文推薦】Activity之間的資料傳遞方法匯總

【好文推薦】Activity之間的資料傳遞方法匯總

2021-06-15 07:23:50 移動端開發

在Activity間傳遞的資料一般比較簡單,但是有時候實際開發中也會傳一些比較復雜的資料,本節一起來學習更多Activity間資料的傳遞方法,

1、通過 Intent 傳遞

我們在進行 Activity 跳轉時,是要有 Intent,此時 Intent 是可以攜帶資料的,我們可以利用它將資料傳遞給其它Activity,Intent 應該是系統提供的支持型別最廣,功能最全面的傳遞方式了,基本資料型別、復雜資料型別(如陣列、集合)、自定義資料型別等等都能支持,而且使用起來也不復雜,下面將通過幾個小栗子分別介紹一下這幾種方法,

1.1、基本資料型別傳遞

String 不是基本資料型別,Java 的基本資料型別有且僅有8種,Intent 都做了很好的支持,這8種基本型別都有自己的包裝型別(Wrap Class,復雜型別),而且包裝型別也實作了 Serializable 介面(后面再說),使得 Intent 也能很好的支持包裝型別,

8種基本型別及其包裝類對應關系如下:

容我煮個栗子:

假設有 Activity1,Activity2 兩個 Activity;如果要在 Activity1 中啟動 Activity2,并傳過去幾個基本型別的資料,就可以這么寫:

Intent intent = new Intent(this, Activity2.class);
intent.putExtra(String name, boolean value);
intent.putExtra(String name, byte value);
intent.putExtra(String name, char value);
intent.putExtra(String name, short value);
intent.putExtra(String name, int value);
intent.putExtra(String name, float value);
intent.putExtra(String name, long value);
intent.putExtra(String name, double value);
startActivity(intent);

在 Activity2 的 onCreate 中就可以通過如下方式接收:

Intent intent = getIntent();
boolean bool = intent.getBooleanExtra(String name, boolean defaultValue);
byte bt = intent.getByteExtra(String name, byte defaultValue);
char ch = intent.getCharExtra(String name, char defaultValue);
short sh = intent.getShortExtra(String name, short defaultValue);
int i = intent.getIntExtra(String name, int defaultValue);
float fl = intent.getFloatExtra(String name, float defaultValue);
long lg = intent.getLongExtra(String name, long defaultValue);
double db = intent.getDoubleExtra(String name, double defaultValue);

PS:上面發送和接收的時候,同一個欄位必須使用相同的 name,比如:intent.putExtra(“BOOLEAN”, true);intent.getBooleanExtra(“BOOLEAN”, false);

1.2、復雜資料型別傳遞

Java 中也定義了一些常用的復雜型別,比如 String、基本資料型別的陣列、ArrayList、HashMap 等等,Intent 也對它們做了支持,使得我們能很容易的通過 Intent 傳遞這些復雜型別,方法與上面基本型別類似,比如:

intent.putExtra(String name, String value);
intent.putExtra(String name, int[] value);
intent.putExtra(String name, Parcelable value);
intent.putExtra(String name, Serializable value);
intent.putExtra(String name, CharSequence value);
intent.putStringArrayListExtra(String name, ArrayList<String> value);

接收方式也類似,這里就不再一一列舉了,

不過,像 ArrayList、HashMap 這種,本身還能存放復雜型別的資料結構,要想通過 Intent 傳遞,得確保它們內部存放的型別也是能支持序列化和反序列化的,

1.3、自定義資料型別傳遞

上面已經列舉了很多 Intent 支持的型別,但是默認提供的這些型別,總歸是不夠用的,很多時候我們會定義自己的資料型別,比如定義一個 Student:

public class Student{
 public String name;
 public int age;
}

那么這個時候我們應該如何通過Intent來傳遞呢?

1.3.1、實作 Serializable 介面

我們先看一下默認提供并被 Intent 支持的復雜資料型別的實作方式:

public final class String
 implements java.io.Serializable, Comparable<String>, CharSequence
public class ArrayList<E> extends AbstractList<E>
 implements List<E>, RandomAccess, Cloneable, java.io.Serializable
public class HashMap<K,V>
 extends AbstractMap<K,V>
 implements Map<K,V>, Cloneable, Serializable

我們可以看到它們有一個共同的特點,都 implement 了 Serializable 介面,

Serializable 是一個空介面,它沒有定義任何方法,知識用來標記其實作類是支持序列化和反序列化的,

因此當我們想讓自定義的型別也能通過 Intent 傳遞時,只需要讓該類實作 Serializable 介面即可,

依舊用 Student 來煮個栗子:

public class Student implements Serializable{
 private static final long serialVersionUID = 1L;
 public String name;
 public int age;
}

傳遞方法就是:

intent.putExtra(String name, Serializable value);
intent.getSerializableExtra(String name);

PS:關于 Serializable 還有一些知識點,比如:serialVersionUID、靜態變數序列化、transient 關鍵字、繼承問題等等,這里就不介紹了,有興趣的可以自行去查閱,

1.3.2、實作 Parcelable 介面

上面介紹了 Serializable 介面,但 Serializable 是 Java 的實作,Android 下能正常使用,沒毛病,但 Google 覺得 Serializable 在 Android 記憶體不大性能不強的情況下的效率不太夠,于是為 Android 量身定制了一個專用的介面——Parcelable,

還是用 Student 來煮栗子:

要想實作 Parcelable 介面,只需要先寫好 Student 類和屬性,然后讓 Student 實作Parcelable,再然后根據 AS 的兩步提示:第一步重寫 describeContents 和 writeToParcel,第二步創建 CREATOR 就大功告成了,寫好的類如下:

public class Student implements Parcelable{
 public String name;
 public int age;
 protected Student(Parcel in) {
 name = in.readString();
 age = in.readInt();
 }
 public static final Creator<Student> CREATOR = new Creator<Student>() {
 @Override
 public Student createFromParcel(Parcel in) {
 return new Student(in);
 }
 @Override
 public Student[] newArray(int size) {
 return new Student[size];
 }
 };
 @Override
 public int describeContents() {
 return 0;
 }
 @Override
 public void writeToParcel(Parcel dest, int flags) {
 dest.writeString(name);
 dest.writeInt(age);
 }
}

此時通過 Intent 去傳遞就可以使用如下方法:

intent.putExtra(String name, Parcelable value);
intent.getParcelableExtra(String name);

這兩種實作序列化的方法的使用原則:

1)在使用記憶體的時候,Parcelable 比 Serializable 性能高,所以推薦使用 Parcelable,

2)Serializable 在序列化的時候會產生大量的臨時變數,從而引起頻繁的 GC,

3)Parcelable 不能使用在要將資料存盤在磁盤上的情況,因為 Parcelable 不能很好的保證資料的持續性在外界有變化的情況下,盡管 Serializable 效率低點,但此時還是建議使用 Serializable ,

PS:Intent 還支持通過 Bundle 封裝資料,然后傳遞 Bundle,但是查看 intent.putExtra 的實作,我們會發現,其實 intent.putExtra 的內部也是維護的一個 Bundle,因此,通過 putExtra 放入的資料,取出時也可以通過 Bundle 去取,

2、通過全域變數傳遞

顧名思義,就是借助一個全域變數做中轉,去傳遞資料,還是以前面的兩個 Activity 為例,傳遞不支持序列化的 Student 物件,我們可以先創建一個工具類,比如:

public class Transmitter {
 public static Student student;
}

那么傳遞和接收時,就可以這么操作:

//傳遞
Student stu = new Student();
Transmitter.student = stu;
Intent intent = new Intent(this, Activity2);
startActivity(intent);
//接收
onCreate(...){
 Student stu = Transmitter.student;
}

可以看到使用起來非常的方便快捷,

但是,全域變數在 APP 運行期間一直存在,如果通過全域變數存放的資料量比較大,變數個數多;并且在不需要使用后,沒有及時的將全域變數置為 null,好讓 GC 去回收,那么是有可能會引發 OOM 問題的,

因此,如果要使用全域變數來作為資料傳遞方法,那么就一定要注意維護好這些全域變數的狀態,

3、通過 SharedPreferences 傳遞

SharedPreferences 是 Android 提供的一種實作資料存盤的方式,它可以將資料以 xml 格式存盤在機器中,通常用來存盤 APP 的設定資訊,我們也可以用它來實作 Activity 間的資料傳遞,

但是,SharedPreferences 因其特殊的作業方式,只提供了對部分基本型別和 String 的操作,對其它既有復雜型別和自定義型別是不支持的,它所支持的型別只有:

boolean
float
int
long
String
Set<String>

仍舊拿前面的兩個 Activity 煮栗子,要實作它們之間的資料傳遞,只需要現在 Activity1 中,將資料放入 SharedPreferences,如下:

SharedPreferences sp = getSharedPreferences("FILENAME", MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putBoolean(String key, boolean value);
editor.putFloat(String key, float value);
editor.putInt(String key, int value);
editor.putLong(String key, long value);
editor.putString(String key, String value);
editor.putStringSet(String key, Set<String> values);
//editor.commit();
editor.apply();
startActivity(...);

然后在 Activity2 中通過 SharedPreferences 將資料取出來,如下:

SharedPreferences sp = getSharedPreferences("FILENAME", MODE_PRIVATE);
sp.getBoolean(String key, boolean defValue);
sp.getFloat(String key, float defValue);
sp.getInt(String key, int defValue);
sp.getLong(String key, long defValue);
sp.getString(String key, String defValue);
sp.getStringSet(String key, Set<String> defValue);

關于 SharedPreferences 有幾點需要注意:

**1、**getSharedPreferences(“FILENAME”, MODE_PRIVATE) 是通過 Context 呼叫的,發送和接收的 FILENAME、MODE_PRIVATE 都要一致,

2、發送時,往 SharedPreferences 存入資料后,需要提交,提交的方式有兩種:commit、apply,這兩個的區別如下:

**commit:**同步操作,立即將修改寫到 Storage,有 boolean 型別回傳值,

**apply:**立即重繪 In-memory 中的資料,然后啟動異步任務將修改寫到 Storage,無回傳值,

當兩個 apply 同時操作時,后呼叫 apply 的將會被保存到 Storage 中;當有 apply正在執行時,呼叫 commit,commit 將被阻塞,直到 apply 執行完,

因 Android framework 已經做好所有的事情,所以當我們不需要關注提交操作的回傳值時,可以將 commit 無條件替換 apply 使用,而且 AS 也會建議將 commit 替換成 apply,

**3、**SharedPreferences 支持的資料型別都必須是支持序列化操作的,上面提到的 Set是一個 interface,我們并不能直接實體化,但我們可以使用它的直接或間接實作類,比如:HashSet、TreeSet、LinkedHashSet等等,

我們查看這幾個的實作,不難發現,它們也都是實作了 Serializable 介面,支持序列化操作的:

public class HashSet<E>
 extends AbstractSet<E>
 implements Set<E>, Cloneable, java.io.Serializable
public class TreeSet<E> extends AbstractSet<E>
 implements NavigableSet<E>, Cloneable, java.io.Serializable
public class LinkedHashSet<E>
 extends HashSet<E>
 implements Set<E>, Cloneable, java.io.Serializable {

4、通過 SystemProperties 傳遞

這個類可以看做一個維護全域變數的類,只不過這里的全域變數是系統的,它們的值是 build.prop 檔案里面的內容,我們先看一下它的定義:

/**
 * Gives access to the system properties store. The system properties
 * store contains a list of string key-value pairs.
 *
 * {@hide}
 */
public class SystemProperties

沒錯,這玩意是個 hide 的類,那就意味著正常情況下 SDK 里面是沒有的,AS 里面也是訪問不到的,不過我們還是可以通過一些手段去訪問到它,比如反射、將原始碼的庫匯出到 AS 使用、將 APP 放在原始碼中編譯等等,

這里我們就不關注用什么手段去訪問它了,我們重點還是在利用它進行 Activity 之間的資料傳遞,

假設我們是在原始碼中編譯,還是用一開始的兩個 Activity 來煮栗子,發送資料時可以這么操作:

SystemProperties.set("NAME", "Shawn.XiaFei");
startActivity(...);

接收時就可以這么寫:

SystemProperties.get("NAME");
//或者
SystemProperties.get("NAME", "defValue");

是不是很方便呢,不過別激動,我們看下 set 的實作:

/**
 * Set the value for the given key.
 * @throws IllegalArgumentException if the key exceeds 32 characters
 * @throws IllegalArgumentException if the value exceeds 92 characters
 */
public static void set(String key, String val) {
 if (key.length() > PROP_NAME_MAX) {
 throw new IllegalArgumentException("key.length > " + PROP_NAME_MAX);
 }
 if (val != null && val.length() > PROP_VALUE_MAX) {
 throw new IllegalArgumentException("val.length > " +
 PROP_VALUE_MAX);
 }
 native_set(key, val);
}

看注釋,沒錯,key 和 val 都限制了長度的!!!當然,32和92字符,在一般情況下也還是夠用的,但是下面就要說一般 APP 開發可能無法完成的事了,

前面說了,這玩意是 SDK 不可見的,而且它維護的是系統的屬性值,系統屬性值 APP 可以讀,但不能輕易修改,因此上面 set 的時候,如果權限不夠就會報如下錯誤:

Unable to set property "NAME" to "Shawn.XiaFei": connection failed; errno=13 (Permission denied)
type=1400 audit(0.0:167): avc: denied { write } for name="property_service" dev="tmpfs" ino=10696 scontext=u:r:untrusted_app_25:s0:c512,c768 tcontext=u:object_r:property_socket:s0 tclass=sock_file permissive=0

這個錯誤在 Rom 開發中比較常見,解決辦法就是配置相應的 avc 權限,這一操作是一般 APP 開發者無法進行的,有興趣的可以自己去查資料,這里不做介紹,

5、通過 SettingsProvider 傳遞

愛折騰的人可能注意到了 Android 設備上一般都會有這么一個應用,它的作用是通過資料庫去維護一些系統配置資訊,在 Rom 開發中,通常借助它設定首次開機的默認行為,

通過它傳遞資料的關鍵在 android.provider.Settings 類,這個類里面有 3 個常用的靜態內部類,分別是:Global、System、Secure,它們分別對應不同的權限等級,

煮栗子了:

發送時,這么寫就可以了:

/*Settings.System.putInt(ContentResolver cr, String name, int value);
Settings.System.putString(ContentResolver cr, String name, String value);
Settings.System.putFloat(ContentResolver cr, String name, float value);
Settings.System.putLong(ContentResolver cr, String name, long value);*/
Settings.Global.putString(getContentResolver(), "NAME", "Shawn.XiaFei");
startActivity(...);

接收時,就這么寫:

String name = Settings.Global.getString(getContentResolver(), "NAME");

使用起來也是很簡單滴!不過,使用起來雖然簡單,但也并不是那么容易的,它也是要權限的!!!

如果權限不夠,運行的時候就會報如下錯誤:

 java.lang.RuntimeException: Unable to start activity ComponentInfo{xxx.xxx/xxx.xxx.Activity1}: java.lang.SecurityException: Permission denial: writing to settings requires:android.permission.WRITE_SECURE_SETTINGS
 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2805)
 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2883)
 at android.app.ActivityThread.-wrap11(Unknown Source:0)
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1613)
 at android.os.Handler.dispatchMessage(Handler.java:106)
 at android.os.Looper.loop(Looper.java:164)
 at android.app.ActivityThread.main(ActivityThread.java:6523)
 at java.lang.reflect.Method.invoke(Native Method)
 at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:857)

意思很明了,得給它 WRITE_SECURE_SETTINGS 的權限,我們試著在 Manifest 里面添加一下,結果 AS 標紅了,提示如下:

Permissions with the protection level signature or signatureOrSystem are only granted to system apps. If an app is a regular non-system app, it will never be able to use these permissions.

意思就是說,這個權限只有系統 APP 才能獲得,三方 APP 沒戲,

6、通過資料庫傳遞

其實上面介紹的 SettingsProvider 方法,也是通過資料庫實作的,只不過它對資料庫的操作做了封裝,我們感覺不到而已,既然如此,我們也可以在自己 APP 中創建資料庫,然后通過資料庫來實作 Activity 之間的資料傳遞,

栗子煮太多,吃不動,不煮了,有興趣的可以自己去查一下資料庫的知識,

PS:實話實說吧,個人用的不多,忘了怎么玩了……

7、通過檔案傳遞

前面提到的 SharedPreferences 也是基于檔案實作的,只不過 SharedPreferences 是固定成 xml 格式的檔案,我們也可以通過自定義檔案操作方式去實作資料的存取,進而實作 Activity 之間的資料傳遞,

說了栗子不煮了,有興趣自己去查一下吧,

PS:原因同上一條……

總結

其實 Activity 之間資料傳遞的方法還是很多的,也各有優缺點,但最最最最最常用的還是第一種—— Intent,其他方法都是理論可行,實際使用起來都會有點雞肋,或者得不償失,

因此要想掌握好 Activity 之間資料傳遞的技巧,個人覺得只需要掌握 Intent 的用法,能熟練使用,靈活處理就 OK 了,至于其它方法,能說得出來原理就可以了,

最后

針對Android程式員,我這邊給大家整理了一些資料,包括不限于高級UI、性能優化、移動架構師、NDK、混合式開發(ReactNative+Weex)微信小程式、Flutter等全方面的Android進階實踐技術;希望能幫助到大家,也節省大家在網上搜索資料的時間來學習,也可以分享動態給身邊好友一起學習!

  • Android前沿技術大綱

  • 全套體系化高級架構視頻

資料領取方式: 加群免費獲取 Android架構設計大群(185873940)

最后送福利了,現在關注我并且加入群聊可以獲取包含原始碼決議,自定義View,影片實作,架構分享等,
內容難度適中,篇幅精煉,每天只需花上十幾分鐘閱讀即可,
大家可以跟我一起探討,歡迎加群探討,有flutter—底層開發—性能優化—移動架構—資深UI工程師 —NDK相關專業人員和視頻教學資料,還有更多面試題等你來拿

點擊GitHub領取
錄播視頻圖.png

自定義View,影片實作,架構分享等,
內容難度適中,篇幅精煉,每天只需花上十幾分鐘閱讀即可,
大家可以跟我一起探討,歡迎加群探討,有flutter—底層開發—性能優化—移動架構—資深UI工程師 —NDK相關專業人員和視頻教學資料,還有更多面試題等你來拿**
點擊GitHub領取
[外鏈圖片轉存中…(img-1ZVXg49m-1623503402786)]

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

標籤:其他

上一篇:自己寫了個Android添加大圖通知欄訊息的代碼并打包成jar包的

下一篇:Camera:高斯模糊

標籤雲
其他(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