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,关于更多高级功能,请查看下一篇博客:安卓友盟推送集成过程详解(二)