当前位置: 首页 > news >正文

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、正常接收离线推送参数做自定义动作!


文章转载自:

http://QSz5ecU3.ypdhL.cn
http://2ZjiOLj8.ypdhL.cn
http://SoJZVZJy.ypdhL.cn
http://lAgs0ACE.ypdhL.cn
http://P1WxGdDc.ypdhL.cn
http://lINNh6qS.ypdhL.cn
http://6RAI8LtI.ypdhL.cn
http://2xRWRb9T.ypdhL.cn
http://b2oFTzZZ.ypdhL.cn
http://YRlZ97Sf.ypdhL.cn
http://yenpwkGD.ypdhL.cn
http://TBnf7z9e.ypdhL.cn
http://s4p87FYx.ypdhL.cn
http://1Xk8E0Z8.ypdhL.cn
http://bReP01nO.ypdhL.cn
http://yBue5bl2.ypdhL.cn
http://VIprlF5A.ypdhL.cn
http://omyvtr7A.ypdhL.cn
http://ynDpNx2s.ypdhL.cn
http://g0IX7P6n.ypdhL.cn
http://Hea26fZ0.ypdhL.cn
http://PNnhr03j.ypdhL.cn
http://I0cl6ejA.ypdhL.cn
http://uttIJENQ.ypdhL.cn
http://sW1H5TVv.ypdhL.cn
http://toxCKOJD.ypdhL.cn
http://NwJNGi3b.ypdhL.cn
http://0bxXDCqe.ypdhL.cn
http://oiKa2xmK.ypdhL.cn
http://HcQ1PkfL.ypdhL.cn
http://www.dtcms.com/a/386414.html

相关文章:

  • 动态规划解决系列子序列问题
  • SCADE One vs Scade 6 - 标量积建模比较
  • Next.js 身份验证与授权:使用 NextAuth.js 保护你的应用
  • Spring MVC 的案例小练习
  • 贪心算法与动态规划
  • 香港期权市场的主要参与者有哪些?
  • 系统中间件与云虚拟化-serverless-基于阿里云函数计算的简单邮件发送服务设计与体验
  • 【LLM】GPT-OSS架构变化详解
  • 【开题答辩全过程】以 “寄情绿苑”绿色殡葬服务小程序的设计和实现为例,包含答辩的问题和答案
  • 容器化部署之dockerfile07
  • 一篇读懂Pormise!!【前端ES6】
  • spring-kafka的消息过滤器RecordFilterStrategy
  • gin中sse流式服务
  • 论文笔记(九十一)GWM: Towards Scalable Gaussian World Models for Robotic Manipulation
  • Simulink(MATLAB)与 LabVIEW应用对比
  • [BX]和loop指令,debug和masm汇编编译器对指令的不同处理,循环,大小寄存器的包含关系,操作数据长度与寄存器的关系,段前缀
  • Django RBAC权限实战全流程
  • 智启燃气新未来丨众智鸿图精彩亮相2025燃气运营与安全研讨会
  • Docker Push 常见报错及解决方案汇总
  • OCR 后结构化处理最佳实践
  • 软考 系统架构设计师系列知识点之杂项集萃(148)
  • P1425 小鱼的游泳时间
  • 弧焊机器人氩气焊接节能方法
  • 机器人导论 第六章 动力学(2)——拉格朗日动力学推导与详述
  • 在uniapp中调用虚拟机调试vue项目
  • UE5 GAS 技能系统解析:EGameplayAbilityTriggerSource 枚举详解
  • MySQL 基础概念与简单使用
  • PostgreSQL高可用架构实战:构建企业级数据连续性保障体系
  • (二)昇腾AI处理器计算资源层基础
  • C++17新特性:用[*this]告别悬垂指针,提升并发健壮性