因为目前所在的公司接手的项目中使用的友盟推送,但由于一直忙于版本迭代,没有自己认真配置过友盟推送,正好最近公司打算上线新项目,于是乎自己从头到尾将友盟推送集成了一遍。
遇到的问题
配置什么的基本上都是按照友盟的SDK文档来的,这个我就不多说什么了。比较有代表性的问题是so库的问题,正常情况下,我们导入的PushSDK包里面只有以下两种的so库。
但是在项目中又使用到了百度地图定位的SDK,而百度地图的so库有如下的文件夹。
因为在测试机上运行的时候找不到对应文件夹下的so文件,导致部分测试机上注册友盟推送的时候获取不到deviceToken的值。
其实在友盟的SDK文档中有如下的一个链接
这个链接是下载全平台的so文件,于是笔者将下载后的文件拖入到自己的项目中,如下所示
然后再运行项目,OK,公司现有的测试机均可以获取到deviceToken了。在配置的过程中遇到的比较典型的问题就是这个。
推送的处理
配置完成后,首先编写了一个BaseApplication,代码如下
/**
* @author: Domino
* @className: BaseApplication
* @description:
* @createTime: 2017/3/1 22:51
*/
public class BaseApplication extends Application implements Application.ActivityLifecycleCallbacks {
private boolean mIsAppForeground;//判断app是否在前台
private int mAliveActivityCount;//记录存活的activity数量
public boolean isAppForeground() {
return mIsAppForeground;
}
public boolean isAppDead() {
return mAliveActivityCount == 0;
}
@Override
public void onCreate() {
super.onCreate();
//初始化友盟工具类
UmengManage.init(this);
//注册生命周期回调
registerActivityLifecycleCallbacks(this);
}
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
mAliveActivityCount++;
}
@Override
public void onActivityStarted(Activity activity) {
}
@Override
public void onActivityResumed(Activity activity) {
mIsAppForeground = true;
}
@Override
public void onActivityPaused(Activity activity) {
mIsAppForeground = false;
}
@Override
public void onActivityStopped(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
mAliveActivityCount--;
}
}
用一个boolean类型的变量来标记app是否是在前台运行,用一个int类型的数量来记录存活的Activity的数量,用来判断是否退出了应用。接下来是友盟统计的工具类UmengManage,如下所示
/**
* @author: Domino
* @className: UmengManage
* @description:
* @createTime: 2017/3/1 22:57
*/
public class UmengManage {
private static Context mContext;
private PushAgent mPushAgent;
private UTrack.ICallBack mAliasCallBack;
private UmengManage() {
if (mContext == null) {
throw new RuntimeException("must invoke init() method before using this");
}
mAliasCallBack = new AliasCallbackImpl();
mPushAgent = PushAgent.getInstance(mContext);
if (BuildConfig.IS_ONLINE_ENV) {
mPushAgent.setDebugMode(false);
} else {
mPushAgent.setDebugMode(true);
}
mPushAgent.setMessageHandler(new UmengMsgCallback());
mPushAgent.setNotificationClickHandler(new GsCloudUmengNotificationClickHandler());
}
public static void init(Context context) {
if (context == null) {
return;
}
mContext = context;
}
public static UmengManage getManage() {
return UmengHoder.UmengManage;
}
//注册友盟
public void register() {
if (mPushAgent == null) {
return;
}
mPushAgent.register(new UmengRegisterImpl());
}
//添加别名
public void addAlias(String alias) {
if (mPushAgent == null) {
return;
}
mPushAgent.addExclusiveAlias(alias, UmengConstants.UMENG_ALIAS_TYPE, mAliasCallBack);
}
//移除别名
public void removeAlias(String alias) {
if (mPushAgent == null) {
return;
}
mPushAgent.removeAlias(alias, UmengConstants.UMENG_ALIAS_TYPE, mAliasCallBack);
}
//开启Umeng统计
public void onAppStart() {
if (mPushAgent == null) {
return;
}
mPushAgent.onAppStart();
}
private static class UmengHoder {
public static final UmengManage UmengManage = new UmengManage();
}
private class UmengMsgCallback extends UmengMessageHandler {
@Override
public void handleMessage(Context context, UMessage uMessage) {
//这个方法是每当app收到推送的时候就会调用的
super.handleMessage(context, uMessage);
}
}
private class GsCloudUmengNotificationClickHandler extends UmengNotificationClickHandler {
@Override
public void launchApp(Context context, UMessage uMessage) {
//退出app后点击推送的处理逻辑,比如先跳转到MainActivity,然后将uMessage传递过去,
//在MainActivity中再进行跳转逻辑,这样保证每次跳转界面返回的时候仍旧停留在MainActivity
}
@Override
public void handleMessage(Context context, UMessage uMessage) {
if (mContext != null && mContext instanceof BaseApplication) {
if (((BaseApplication) mContext).isAppForeground()) {
//在前台点击通知的处理逻辑,笔者公司的项目中对前台推送是不做处理的
} else if (((BaseApplication) mContext).isAppDead()) {
//退出app点击推送的处理逻辑,这里会调用launchApp()方法,所以我们重写launchApp方法
super.handleMessage(context, uMessage);
} else {
//app只是退到后台收到点击推送的处理逻辑
}
}
}
}
private class UmengRegisterImpl implements IUmengRegisterCallback {
@Override
public void onSuccess(String deviceToken) {
GsCloudLog.logDebug(UmengConstants.UMENG_LOG_TAG, "deviceToken:" + deviceToken);
}
@Override
public void onFailure(String s, String s1) {
GsCloudLog.logDebug(UmengConstants.UMENG_LOG_TAG, "注册失败,s:" + s + " s1:" + s1);
}
}
private class AliasCallbackImpl implements UTrack.ICallBack {
@Override
public void onMessage(boolean b, String s) {
GsCloudLog.logDebug(UmengConstants.UMENG_LOG_TAG, "别名处理->" + s);
}
}
}
好的,友盟推送的使用就此说完了。–小白的成长日记