开发者社区 问答 正文

移动推送Android SDK:在Activity中初始化推送SDK,无法接收到推送通知为什么?



1.问题


在Activity中执行了推送的初始化逻辑,SDK的接入按照集成文档操作确认无误,为什么推送消息接收不到,或者有时能接收到有时接收不到?相关初始化代码如下:

  1. [backcolor=transparent]public[backcolor=transparent] [backcolor=transparent]class[backcolor=transparent] [backcolor=transparent]MyActivity[backcolor=transparent] [backcolor=transparent]extends[backcolor=transparent] [backcolor=transparent]Activity[backcolor=transparent] [backcolor=transparent]{
  2. [backcolor=transparent]   [backcolor=transparent]@override
  3. [backcolor=transparent]   [backcolor=transparent]public[backcolor=transparent] [backcolor=transparent]void[backcolor=transparent] onCreate[backcolor=transparent]([backcolor=transparent]Bundle[backcolor=transparent] savedInstanceState[backcolor=transparent])[backcolor=transparent] [backcolor=transparent]{
  4. [backcolor=transparent]       [backcolor=transparent]super[backcolor=transparent].[backcolor=transparent]onCreate[backcolor=transparent]([backcolor=transparent]savedInstanceState[backcolor=transparent]);
  5. [backcolor=transparent]       initCloudChannel[backcolor=transparent]([backcolor=transparent]getApplicationContext[backcolor=transparent]());
  6. [backcolor=transparent]       [backcolor=transparent]......
  7. [backcolor=transparent]   [backcolor=transparent]}
  8. [backcolor=transparent]   [backcolor=transparent]......
  9. [backcolor=transparent]}


2.问题背景,原因


推送SDK为了提高推送到达率做了进程保活,除了应用进程之外,还有辅助进程channel。在诸如应用退到后台,设备锁屏或者应用杀死等场景都是通过channel进程接收推送消息的。而channel进程的正常工作是依赖于channel的成功初始化。如果您在Activity中执行了推送的初始化逻辑将导致channel进程无法完成初始化操作。channel进程无法正常工作将严重影响推送到达率。

3.解决方案


将推送初始化逻辑移至Application中,并保证主进程和channel进程均可以执行相关代码:
  1. [backcolor=transparent]public[backcolor=transparent] [backcolor=transparent]class[backcolor=transparent] [backcolor=transparent]MyApplication[backcolor=transparent] [backcolor=transparent]extends[backcolor=transparent] [backcolor=transparent]Application[backcolor=transparent] [backcolor=transparent]{
  2. [backcolor=transparent]   [backcolor=transparent]@override
  3. [backcolor=transparent]   [backcolor=transparent]public[backcolor=transparent] [backcolor=transparent]void[backcolor=transparent] onCreate[backcolor=transparent]()[backcolor=transparent] [backcolor=transparent]{
  4. [backcolor=transparent]       [backcolor=transparent]super[backcolor=transparent].[backcolor=transparent]onCreate[backcolor=transparent]();
  5. [backcolor=transparent]       [backcolor=transparent]if[backcolor=transparent](如果是主进程或[backcolor=transparent]channel[backcolor=transparent]进程)[backcolor=transparent] [backcolor=transparent]{
  6. [backcolor=transparent]           initCloudChannel[backcolor=transparent]([backcolor=transparent]this[backcolor=transparent]);
  7. [backcolor=transparent]       [backcolor=transparent]}
  8. [backcolor=transparent]   [backcolor=transparent]}
  9. [backcolor=transparent]   [backcolor=transparent]......
  10. [backcolor=transparent]}

展开
收起
猫饭先生 2017-10-23 14:14:37 1730 分享 版权
阿里云 AI 助理回答

根据您提供的问题描述和解决方案,问题的关键在于推送消息接收的不稳定性源于初始化逻辑放置在了Activity中,而非Application。这可能导致在某些应用生命周期的状态下,如后台或被杀死时,负责接收消息的channel进程无法正确初始化,从而影响了推送消息的到达率。

解决方案回顾

您已经提出了正确的解决方向:将推送初始化逻辑从Activity迁移到自定义的MyApplication类中的onCreate()方法。这样可以确保无论应用处于何种状态,只要应用启动,相关的初始化操作就能在主进程以及channel进程中正确执行。

实现细节补充

  1. 判断是否为主进程或channel进程:在实际代码实现中,可以通过检查当前进程名与清单文件中声明的进程名来确定。例如:

    public void onCreate() {
        super.onCreate();
    
        // 获取当前进程名
        String currentProcessName = getProcessName(this);
    
        // 判断是否为主进程或者channel进程
        if ("your.package.name".equals(currentProcessName) || "your.package.name:channel".equals(currentProcessName)) {
            initCloudChannel(this);
        }
    }
    
    // 获取进程名的方法
    public static String getProcessName(Context context) {
        int pid = android.os.Process.myPid();
        ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        for (ActivityManager.RunningAppProcessInfo appProcess : activityManager.getRunningAppProcesses()) {
            if (appProcess.pid == pid) {
                return appProcess.processName;
            }
        }
        return null;
    }
    
  2. 权限检查:确保您的应用具有必要的权限,比如网络权限,以保证推送服务能正常工作。

  3. 注意Android 8.0及以上版本的限制:对于Android 8.0(API级别26)及更高版本,需要在清单文件中声明通知渠道,并且用户需要为应用授予显示通知的权限。

  4. 兼容性处理:考虑到不同Android版本和设备可能存在的差异,进行充分的兼容性测试是非常重要的,确保在各种环境下推送服务都能稳定运行。

通过上述调整和注意事项,可以显著提高推送消息的到达率和稳定性。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答