Android 安卓 问题解决记录 腾讯IM和厂商离线推送问题 点击离线推送无法唤醒APP启动页但某些Service服务和Application被启动
文章目录
- 工程描述
- 问题描述
- 问题解决思路
- 思路一(成立但难用)
- 思路二(不成立)
- 思路三(成立)
工程描述
时间 2025年09月16日
维护一个旧的安卓工程,项目中集成了腾讯IM、友盟、厂商通道离线推送等SDK。
项目之前腾讯IM的厂商通道集成方式是注册厂商推送通道相关APPID、Key等,填写在腾讯IM后台,然后前端注册厂商推送Token并上报给腾讯云,未集成腾讯IM push相关SDK,但集成了友盟的推送,以及厂商,现在修改成集成腾讯IM的push+离线厂商。
问题描述
当完成剔除友盟推送SDK以及友盟中集成厂商的SDK后,集成了腾讯IM push和腾讯IM的厂商SDK,然后申请了自定义消息分类,各个厂商离线推送都能够正常推送后,却发现离线推送点击怎么也调不起来APP启动页,但某些Service服务和Application正常被启动,IMSDK正常收到了一些不在线时的消息回调。
问题解决思路
共尝试了三种不同的解决方案,以供参考。
思路一(成立但难用)
还是以旧的继承方式,通过友盟注册推送Token,然后交给腾讯IM,达到离线推送效果。
由于是旧的工程,相关腾讯IM SDK旧的文档、友盟推送旧的文档已经完全找不到了,只能在工程内进行尝试性修改,虽然能够正常接收,唤醒APP,但是手动维护了很多厂商的Service,旧的工程中那时还没有SDK统一维护厂商Service,改起来相当繁琐且难懂,后期维护成本相对较高。
思路二(不成立)
既然IMSDK正常收到了一些不在线时的消息回调,是否可以在这个方法中启动一个新的Activity栈,从而来达到启动App的效果呢?
答案是,可以!但是效果不尽人意。
我在这个回调中添加了启动首页Activity,也判断了站内是否已经存在首页Activity、防止重复启动。但实际效果是启动起来了,但启动速度一言难尽。
思路三(成立)
既然前两种方法都不行,那就大改一番,方便更好的维护!继续解决启动不起来APP!
修改方式:去除友盟推送,去除相关厂商Services,升级腾讯IM SDK到最新版本,按最新集成方式来。
按照此时腾讯IM SDK最新离线推送文档集成确实很方便,SDK自己维护了启动类和相关Service,注册很方便,只有一个入口:
TIMPushManager.getInstance().registerPush(context, 您的 sdkAppId, "客户端密钥", new TIMPushCallback() {@Override public void onSuccess(Object data) {} @Override public void onError(int errCode, String errMsg, Object data) { }
});//获取自定义的推送内容
TIMPushManager.getInstance().addPushListener(new TIMPushListener() {@Overridepublic void onNotificationClicked(String ext) {Log.d(TAG, "onNotificationClicked =" + ext);// 获取 ext 自定义跳转}
});
使用adb工具筛查,使用命令:
adb logcat | grep -E "Starting: Intent|cmp=com\.xxxx\.xxxxx"
发现启动的都是:
09-15 16:22:14.261 1574 2259 I ActivityTaskManager: START u0 {act=android.intent.action.VIEW flg=0x14000000 hwFlg=0x110 pkg=com.xxxx.xxxxxcmp=com.xxxx.xxxxx/com.tencent.qcloud.tim.push.TIMPushOpenActivity (has extras)} from uid 10033
09-15 16:22:15.914 12371 12371 D imsdk : TIM: |-TIMPush-TIMPushOpenActivity |onCreateIntent { act=android.intent.action.VIEW dat=pushscheme://com.tencent.qcloud.uniapp/detail flg=0x14000000 hwFlg=0x100 pkg=com.xxxx.xxxxxcmp=com.xxxx.xxxxx/com.tencent.qcloud.tim.push.TIMPushOpenActivity clip={text/plain=1 T:anything} (has extras) }
已知TIMPushOpenActivity 是一个腾讯IM Push SDK中的跳板页面,经过尝试,在腾讯IM后台无论配置什么点击后续动作,最终都是走的TIMPushOpenActivity,且点击离线推送没有任何反应,可能是和旧的工程某些配置有关,此时我无法准确定位这个问题!
它的代码是这样的:
public class TIMPushOpenActivity extends Activity {private static final String a = TIMPushOpenActivity.class.getSimpleName();public TIMPushOpenActivity() {}public void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);TIMPushLog.d(a, "onCreate" + ((Activity)this).getIntent());TIMPushManagerImpl.c().a(((Activity)this).getIntent());((Activity)this).finish();}
}
那我就大概明白了,既然后台配置自己的不行,那就干脆后台全部配置成打开应用,拦截掉TIMPushOpenActivity 走自己自定义的启动页!
在AndroidManifest.xml中,使用如下代码:
<!--将TIMPushOpenActivity进行remove-->
<activityandroid:name="com.tencent.qcloud.tim.push.TIMPushOpenActivity"tools:node="remove"/><!--使用别名拦截使其跳转到自己的Activity-->
<activity-aliasandroid:name="com.tencent.qcloud.tim.push.TIMPushOpenActivity"android:exported="true"android:enabled="true"android:targetActivity="自己的启动页Activity" />
最终成功唤醒了App,然后在自己启动页中调用腾讯SDK方法中的这个方法,就能在注册onNotificationClicked方法中收到自定义参数:
TIMPushManagerImpl.c().a(((Activity)this).getIntent());
这是一个腾讯IM Push SDK中 TIMPushOpenActivity 类一个混淆的方法,就是把各个厂商离线推送点击唤醒后的参数整理然后交给onNotificationClicked回调的。官方文档上没有体现。
至此,完美解决!正常收到离线推送、点击直接唤醒App、正常接收离线推送参数做自定义动作!