安卓友盟推送集成过程详解(一),及推送产生的应用多进程问题处理

1,获取应用对应的Appkey和Umeng Message Secret

登录友盟U-Push官网,创建一个新应用,如下:
在这里插入图片描述
如果你的应用之前已经集成了【友盟+】统计功能,就不用创建新的应用了,直接从已有应用中添加关联即可:
在这里插入图片描述
进入该应用后台,点击左侧菜单:应用管理 --> 应用信息,获取应用对应的Appkey和Umeng Message Secret,这两个值请务必留意,在后续SDK初始化中需要用到。
在这里插入图片描述

2,自动导入PushSDK(该方式不需要在官网下载SDK)

在app的build.gradle配置脚本中添加如下maven远程依赖,导入最新版本PushSDK:

//PushSDK必须依赖基础组件库,所以需要加入对应依赖
compile 'com.umeng.sdk:common:1.5.3'
//PushSDK必须依赖utdid库,所以需要加入对应依赖
compile 'com.umeng.sdk:utdid:1.1.5.3'
//PushSDK
compile 'com.umeng.sdk:push:4.2.0'

如果无法正常集成请在工程目录下的build.gradle添加如下配置:

allprojects {
    repositories {
          mavenCentral()
    }
}

3,初始化PushSDK

在自定义Application类的 onCreate() 方法中执行init初始化方法,这里有两个重载的init方法可供选择:

1. UMConfigure.init(this, "第一步获取的appkey", "自定义的渠道号", UMConfigure.DEVICE_TYPE_PHONE, "第一步获取的secret");
2. UMConfigure.init(this, UMConfigure.DEVICE_TYPE_PHONE, "第一步获取的secret");

参数UMConfigure.DEVICE_TYPE_PHONE表示设备为手机。

可以看到两个重载的方法相比,少了appkey和渠道号两个参数,选择依据就是是否在清单文件Manifest的application标签中配置过了appKey和渠道号,如下:

<manifest>
    <application ……>
        ……
        <meta-data android:value="YOUR_APP_KEY" android:name="UMENG_APPKEY"/> 
        <meta-data android:value="Channel ID" android:name="UMENG_CHANNEL"/> 
    </application>    
</manifest>

如果在Manifest文件中添加了如上配置,那么初始化时可选择使用方法1也可以选择方法2,此时方法2对应位置可以传入null,如果同时设置了则以代码中设置的为准,否则使用方法2。
渠道号命名规范建议:不要使用中文,空格,和纯数字

注意:
添加了友盟推送后,会出现应用多进程的问题,即同时包含应用主进程和推送进程(channel进程),因此会导致在自定义的Application类的onCreate方法中初始化操作都会执行多次,这样重复性的操作在一定程度上浪费了系统资源,因此我们需要进行进程判断,把和主进程相关的初始化操作放到主进程中完成,其他与主进程无关的操作放到指定的进程中去完成,如下示例:

public class MyApp extends MultiDexApplication implements IExceptionHandler {

    private static MyApp instance;

    @Override
    public void onCreate() {
        super.onCreate();

        // 友盟登录分享以及统计和推送
        initUM();
        
        String curProcessName = AppUtils.getProcessName(this, android.os.Process.myPid());
        if (curProcessName != null && curProcessName.equalsIgnoreCase(this.getPackageName())) {
            instance = this;
            // 初始化数据库
            LitePal.initialize(this);
            // 初始化主进程资源
            initOkGo();
            // 配置EventBus
            EventBus.builder().addIndex(new MyEventBusIndex()).installDefaultEventBus();
            // 腾讯的版本更新和bug收集
            initBugly();
//            initLeakCanary();
            initLogger();
            initLoad();
            // 创建通知渠道
//            createNotationChannel();
           
        } else {
            // 初始化其它进程的资源,可以用来进行分类初始化
            // ...
        }
    }

private void initUM() {
        //初始化主线程资源
        UMConfigure.init(this, UMConfigure.DEVICE_TYPE_PHONE, "4048a28*****2adfc1f0");
        //获取消息推送代理示例
        PushAgent mPushAgent = PushAgent.getInstance(this);
        //注册推送服务,每次调用register方法都会回调该接口
        mPushAgent.register(new IUmengRegisterCallback() {
            @Override
            public void onSuccess(String deviceToken) {
                //注册成功会返回deviceToken deviceToken是推送消息的唯一标志
//                Logger.i("注册成功:deviceToken:-------->  " + deviceToken);
            }

            @Override
            public void onFailure(String s, String s1) {
//                Logger.i("注册失败:-------->  " + "s:" + s + ",s1:" + s1);
            }

        });

        // 打开统计SDK调试模式
        UMConfigure.setLogEnabled(true);
        MobclickAgent.setDebugMode(true);

        {
            // 微信
            PlatformConfig.setWeixin("wxb6*****4e752cf", "Ting92***NG927XGSQsFB5c");
            // 微博(第三个参数为回调地址)
            PlatformConfig.setSinaWeibo("39**54", "04b48**32669824ebdad", "http://open.weibo.com/apps/appKey/privilege/oauth");
            // QQ
            PlatformConfig.setQQZone("10***4468", "c739470****b60104f0ba");
        }
    }
}

1,在进行友盟推送时,官方在文档第一句是这样说的:注意:关于集成友盟SDK时添加的初始化方法一定要在主进程进行该项操作,如果您使用到PUSH,还需在推送进程(channel进程)同样进行该项操作,所以上面的initUM()方法的调用应该放到进程判断的外面,这样该初始化操作在各个进程都会被执行到,测试设备才能正常接收到推送消息。
2,上面的继承MultiDexApplication是为了进行应用分包,解除24K方法数的限制,具体可查看我的另一篇博文:使用 MultiDex 解决 64K 限制

工具类AppUtils如下:

public class AppUtils {
  
    // 获取进程名
    public static String getProcessName(Context cxt, int pid) {
        android.app.ActivityManager am = (android.app.ActivityManager) cxt.getSystemService(Context.ACTIVITY_SERVICE);
        List<android.app.ActivityManager.RunningAppProcessInfo> runningApps = am.getRunningAppProcesses();
        if (runningApps == null) {
            return null;
        }
        for (android.app.ActivityManager.RunningAppProcessInfo procInfo : runningApps) {
            if (procInfo.pid == pid) {
                return procInfo.processName;
            }
        }
        return null;
    }
    
}

4,注册推送服务

务必在工程的自定义Application类的 onCreate() 方法中注册推送服务,无论推送是否开启都需要调用此方法:

PushAgent mPushAgent = PushAgent.getInstance(this);
//注册推送服务,每次调用register方法都会回调该接口
mPushAgent.register(new IUmengRegisterCallback() {

    @Override
    public void onSuccess(String deviceToken) {
        // 注册成功会返回devicetoken
        // 参数devicetoken是【友盟+】消息推送生成的用于标识设备的id,长度为44位,不能定制和修改。同一台设备上不同应用对应的device token不一样。
        // 直接打印Toast不会生效
        new Handler(getMainLooper()).post(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(MyApp.this, "deviceToken:"+deviceToken, Toast.LENGTH_SHORT).show();
                    }
                });
    }

    @Override
    public void onFailure(String s, String s1) {

    }
});

如需在其他地方获取device token,可以调用mPushAgent.getRegistrationId()方法进行手动获取(需在注册成功后调用)。

5,应用数据统计接口

在所有的Activity 的onCreate 方法或在应用的BaseActivity的onCreate方法中添加如下代码:

PushAgent.getInstance(context).onAppStart();

该方法是【友盟+】Push后台进行日活统计及多维度推送的必调用方法,请务必调用!

6,混淆配置

如果App需要使用proguard进行混淆打包,请添加以下混淆代码,测试这步可暂时省略:

-dontwarn com.umeng.**
-dontwarn com.taobao.**
-dontwarn anet.channel.**
-dontwarn anetwork.channel.**
-dontwarn org.android.**
-dontwarn org.apache.thrift.**
-dontwarn com.xiaomi.**
-dontwarn com.huawei.**
-dontwarn com.meizu.**

-keepattributes *Annotation*

-keep class com.taobao.** {*;}
-keep class org.android.** {*;}
-keep class anet.channel.** {*;}
-keep class com.umeng.** {*;}
-keep class com.xiaomi.** {*;}
-keep class com.huawei.** {*;}
-keep class com.meizu.** {*;}
-keep class org.apache.thrift.** {*;}

-keep class com.alibaba.sdk.android.**{*;}
-keep class com.ut.**{*;}
-keep class com.ta.**{*;}

-keep public class **.R$*{
   public static final int *;
}

经过以上前5步的配置,运行应用我们可以发现此时已经成功获取到了deviceToken!接下来我们马上可以向这台设备推送消息了,接着往下看:


开始消息推送

1,添加测试设备
在【友盟+】消息推送服务Push后台的“测试模式”中填写上面获取到的deviceToken,将该设备添加为测试设备:
在这里插入图片描述
在这里插入图片描述
然后切换到“测试消息”选项,消息推送服务后台创建一条消息,详细过程如下所示:
在这里插入图片描述
然后在我们的手机上就可以成功接收到推送的消息了。

注意:
以上成功集成推送功能没有添加任何权限(网络权限也没有添加)也没有在libs目录下导入任何jar包,只要保证测试手机有网络即可。

至此我们已经详细讲解了如何快速集成友盟推送SDK,关于更多高级功能,请查看下一篇博客:安卓友盟推送集成过程详解(二)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智玲君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值