首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 個推 推送 CID 獲取為空?廣播接收器正確使用姿勢

     編輯:程式設計綜合問答

問題現象

集成個推推送 SDK 後,在 onReceive 廣播中打印意圖發現有 CID 值,但業務代碼中獲取不到(為 null/空)。

原因分析

個推 SDK 通過系統廣播異步回調 CID(clientid)。常見錯誤:

  • 在 Application 初始化或 Activity.onCreate 中同步調用獲取方法,但廣播尚未觸發。
  • 廣播接收器註冊錯誤(權限、Action 名稱、導出屬性)。
  • 未在清單文件靜態註冊,導致進程被殺後無法接收。

正確實現模式

1. 定義廣播接收器(靜態註冊於 Manifest)

<receiver
    android:name=".push.GTPushReceiver"
    android:exported="true"
    android:permission="com.getui.permission.GT_PUSH_RECEIVE">
    <intent-filter>
        <action android:name="com.getui.action.CLIENT_ID" /> <!-- CID 回調 -->
        <action android:name="com.getui.action.PAYLOAD" />   <!-- 透傳消息 -->
    </intent-filter>
</receiver>

2. 接收器實現

public class GTPushReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if ("com.getui.action.CLIENT_ID".equals(action)) {
            String cid = intent.getStringExtra("clientid");
            // 1. 持久化保存
            SpUtils.putString(context, "GT_CID", cid);
            // 2. 通知業務層(EventBus/RxBus/LiveData/接口回調)
            PushManager.getInstance().onCidReceived(cid);
            Log.d("GT", "CID received: " + cid);
        } else if ("com.getui.action.PAYLOAD".equals(action)) {
            // 處理透傳消息
        }
    }
}

3. 業務層獲取 CID

// 任何需要 CID 的地方
String cid = SpUtils.getString(context, "GT_CID", "");
if (TextUtils.isEmpty(cid)) {
    // 尚未回調,可註冊監聽器等待
    PushManager.getInstance().addCidListener(new OnCidListener() {
        @Override public void onCid(String cid) { /* 使用 CID */ }
    });
} else {
    // 直接使用
    bindAlias(cid); // 綁定別名等操作
}

關鍵點總結

  1. 異步思維: CID 不會瞬間產生,必須通過廣播/回調異步獲取。
  2. 持久化: 保存到 SharedPreferences,應用重啟後直接可用,避免重複等待。
  3. 靜態註冊: Manifest 中聲明 exported="true" 和正確 permission,確保進程不在也能收到廣播(SDK 會喚醒進程)。
  4. 初始化時機: 在 Application.onCreate 中調用 PushManager.getInstance().initialize(context),越早越好。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved