友盟推送的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fxDes/article/details/59190865

因为目前所在的公司接手的项目中使用的友盟推送,但由于一直忙于版本迭代,没有自己认真配置过友盟推送,正好最近公司打算上线新项目,于是乎自己从头到尾将友盟推送集成了一遍。

遇到的问题

配置什么的基本上都是按照友盟的SDK文档来的,这个我就不多说什么了。比较有代表性的问题是so库的问题,正常情况下,我们导入的PushSDK包里面只有以下两种的so库。
导入PushSDK后的so库
但是在项目中又使用到了百度地图定位的SDK,而百度地图的so库有如下的文件夹。
百度地图的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);
        }
    }
}

好的,友盟推送的使用就此说完了。–小白的成长日记

没有更多推荐了,返回首页