集成個推推送 SDK 後,在 onReceive 廣播中打印意圖發現有 CID 值,但業務代碼中獲取不到(為 null/空)。
個推 SDK 通過系統廣播異步回調 CID(clientid)。常見錯誤:
Application 初始化或 Activity.onCreate 中同步調用獲取方法,但廣播尚未觸發。<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>
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)) {
// 處理透傳消息
}
}
}
// 任何需要 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); // 綁定別名等操作
}
exported="true" 和正確 permission,確保進程不在也能收到廣播(SDK 會喚醒進程)。Application.onCreate 中調用 PushManager.getInstance().initialize(context),越早越好。