Android 一分钟快速使用极光推送

之前一直都是在项目中,直接把jpush下载的资源直接放在主module,每次感觉需要配置的东西很多,有时候会担心缺少什么导致最后跑不通。

如果你是老手,每个人都各有各的风格习惯,相互学习的可以了解下

如果你是新手,个人觉得以下的集成方式应该会帮到你避免很多坑

极光推送官方文档

集成方式

1、jcenter 自动集成

2、手动集成

虽然现在支持了jcenter,相比手动少了很多,还是需要在gradle和AndroidManifest.xml中配置很多东西,有些时候可能会少写一些配置,导致最后失败

个人集成思路

既然需要集成这么多,为啥不写成一个module,把必要的lib、res、AndroidManifest.xml等等配置好,这样复用性也很强。如果开启一个新项目只需gradle引用一下就ok了。可能是习惯性,个人喜欢用手动集成的方式把他们写到module

jpush版本更新,你也只需替换对应的文件即可,轻轻松松解决

资源下载

1、官方Demo

2、应用快速集成Demo

获取方式:

可以新建应用,然后在“应用设置”——>“应用信息”——>“推送设置”,配置一下Android应用包名,这里也可以下载快速集成的Demo

3、个人Demo(一分钟快速集成使用)

jpush版本更新,可以直接下载官方Demo,进行资源替换,方便快捷

定义module(Jpush)

目录结构

Android 一分钟快速使用极光推送_第1张图片
这里就不一一说明了,这些大都是官方存在的,但是JPushSetUtil还是有必要说一下

JPushSetUtil

自定义的极光推送工具类,代码如下

/**
 * Description : JPush工具
 *
 * @author WSoban
 * @date 2019/8/23
 */
public class JPushSetUtil {

    private static JPushSetUtil sInstance;
    private int sequence = 1;
    private Context mContext;

    public static synchronized JPushSetUtil getInstance() {
        if (sInstance == null) {
            sInstance = new JPushSetUtil();
        }
        return sInstance;
    }

    /**
     * 在项目Application中做初始化
     *
     * @param context
     */
    public void init(Context context) {
        this.mContext = context;
        JPushInterface.setDebugMode(true);    // 设置开启日志,发布时请关闭日志
        JPushInterface.init(context);            // 初始化 JPush
    }

    /**
     * 获取RegistrationID
     *
     * @return
     */
    public String getRegistrationID() {
        return JPushInterface.getRegistrationID(mContext);

    }

    /**
     * 设置设备别名
     *
     * @param alias
     */
    public void setAlias(String alias) {
        onTagAliasAction(alias, true, TagAliasOperatorHelper.ACTION_SET);
    }

    /**
     * 设置设备标签
     *
     * @param tags
     */
    public void setTags(String tags) {
        onTagAliasAction(tags, false, TagAliasOperatorHelper.ACTION_SET);
    }

    /**
     * 删除别名
     *
     * @param alias
     */
    public void deleteAlias(String alias) {
        onTagAliasAction(alias, true, TagAliasOperatorHelper.ACTION_DELETE);
    }

    /**
     * 删除标签
     *
     * @param tags
     */
    public void deleteTags(String tags) {
        onTagAliasAction(tags, false, TagAliasOperatorHelper.ACTION_DELETE);
    }

    /**
     * 执行设置事件
     *
     * @param aliasOrTags
     * @param isAliasAction
     * @param action
     */
    private void onTagAliasAction(String aliasOrTags, boolean isAliasAction, int action) {
        TagAliasOperatorHelper.TagAliasBean tagAliasBean = new TagAliasOperatorHelper.TagAliasBean();
        if (isAliasAction) {
            tagAliasBean.alias = getAlias(aliasOrTags);
        } else {
            tagAliasBean.tags = getTags(aliasOrTags);
        }
        tagAliasBean.isAliasAction = isAliasAction;
        tagAliasBean.action = action;
        sequence++;
        TagAliasOperatorHelper.getInstance().handleAction(mContext, sequence, tagAliasBean);
    }

    /**
     * 检查别名格式
     *
     * @param alias
     * @return
     */
    private String getAlias(String alias) {
        if (TextUtils.isEmpty(alias)) {
            return null;
        }
        if (!ExampleUtil.isValidTagAndAlias(alias)) {
            return null;
        }
        return alias;
    }

    /**
     * 检查标签格式
     *
     * @param tags
     * @return
     */
    private Set getTags(String tags) {
        if (TextUtils.isEmpty(tags)) {
            return null;
        }
        // "|"隔开的多个转换成 Set
        String[] sArray = tags.split("\\|");
        Set tagSet = new LinkedHashSet();
        for (String sTagItme : sArray) {
            if (!ExampleUtil.isValidTagAndAlias(sTagItme)) {
                return null;
            }
            tagSet.add(sTagItme);
        }
        if (tagSet.isEmpty()) {
            return null;
        }
        return tagSet;
    }

    /**
     * 设置推送服务开关
     *
     * @param isOpenPush 是否开启推送
     */
    public void setPushMessage(boolean isOpenPush) {
        if (isOpenPush) {
            //恢复推送服务
            JPushInterface.resumePush(mContext);
        } else {
            //停止推送服务
            JPushInterface.stopPush(mContext);
        }
    }

    /**
     * 用来检查推送服务是否已经被停止
     */
    public boolean isPushStopped() {
        return JPushInterface.isPushStopped(mContext);
    }
}

AndroidManifest.xml

这里写了一些不会变的权限、service、provider、receiver,这样避免在主module中可能会遗漏

集成与使用

这里可以说是一分钟直接集成并使用,真不吹

gradle引用

dependencies {
    ......
    api project(':jpush')
}

AndroidManifest.xml

只需替换JPUSH_APPKEY的value即可

 
        
        

        
            
                 
                 
                 
                 
                 
                
            
        

自定义Application

public class App extends Application {

    public static App mInstance;

    public App() {
    }

    public static App getInstance() {
        return mInstance;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        mInstance = this;
        JPushSetUtil.getInstance().init(this);
    }
}

自定义接收器

/**
 * 自定义接收器
 * 

* 如果不定义这个 Receiver,则: * 1) 默认用户会打开主界面 * 2) 接收不到自定义消息 */ public class JPushReceiver extends BroadcastReceiver { private static final String TAG = "JIGUANG-Example"; // 打印所有的 intent extra 数据 private static String printBundle(Bundle bundle) { StringBuilder sb = new StringBuilder(); for (String key : bundle.keySet()) { if (key.equals(JPushInterface.EXTRA_NOTIFICATION_ID)) { sb.append("\nkey:" + key + ", value:" + bundle.getInt(key)); } else if (key.equals(JPushInterface.EXTRA_CONNECTION_CHANGE)) { sb.append("\nkey:" + key + ", value:" + bundle.getBoolean(key)); } else if (key.equals(JPushInterface.EXTRA_EXTRA)) { if (TextUtils.isEmpty(bundle.getString(JPushInterface.EXTRA_EXTRA))) { Logger.i(TAG, "This message has no Extra data"); continue; } try { JSONObject json = new JSONObject(bundle.getString(JPushInterface.EXTRA_EXTRA)); Iterator it = json.keys(); while (it.hasNext()) { String myKey = it.next(); sb.append("\nkey:" + key + ", value: [" + myKey + " - " + json.optString(myKey) + "]"); } } catch (JSONException e) { Logger.e(TAG, "Get message extra JSON error!"); } } else { sb.append("\nkey:" + key + ", value:" + bundle.getString(key)); } } return sb.toString(); } @Override public void onReceive(Context context, Intent intent) { try { Bundle bundle = intent.getExtras(); Logger.d(TAG, "[JPushReceiver] onReceive - " + intent.getAction() + ", extras: " + printBundle(bundle)); if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) { String regId = bundle.getString(JPushInterface.EXTRA_REGISTRATION_ID); Logger.d(TAG, "[JPushReceiver] 接收Registration Id : " + regId); //send the Registration Id to your server... } else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) { Logger.d(TAG, "[JPushReceiver] 接收到推送下来的自定义消息: " + bundle.getString(JPushInterface.EXTRA_MESSAGE)); processCustomMessage(context, bundle); } else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) { Logger.d(TAG, "[JPushReceiver] 接收到推送下来的通知"); int notifactionId = bundle.getInt(JPushInterface.EXTRA_NOTIFICATION_ID); Logger.d(TAG, "[JPushReceiver] 接收到推送下来的通知的ID: " + notifactionId); } else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) { Logger.d(TAG, "[JPushReceiver] 用户点击打开了通知"); openNotification(context, bundle, Constant.SEND_NOTICE); } else if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(intent.getAction())) { Logger.d(TAG, "[JPushReceiver] 用户收到到RICH PUSH CALLBACK: " + bundle.getString(JPushInterface.EXTRA_EXTRA)); //在这里根据 JPushInterface.EXTRA_EXTRA 的内容处理代码,比如打开新的Activity, 打开一个网页等.. } else if (JPushInterface.ACTION_CONNECTION_CHANGE.equals(intent.getAction())) { boolean connected = intent.getBooleanExtra(JPushInterface.EXTRA_CONNECTION_CHANGE, false); Logger.w(TAG, "[JPushReceiver]" + intent.getAction() + " connected state change to " + connected); } else { Logger.d(TAG, "[JPushReceiver] Unhandled intent - " + intent.getAction()); } } catch (Exception e) { } } //send msg to MainActivity private void processCustomMessage(Context context, Bundle bundle) { /*if (MainActivity.isForeground) { String message = bundle.getString(JPushInterface.EXTRA_MESSAGE); String extras = bundle.getString(JPushInterface.EXTRA_EXTRA); Intent msgIntent = new Intent(MainActivity.MESSAGE_RECEIVED_ACTION); msgIntent.putExtra(MainActivity.KEY_MESSAGE, message); if (!ExampleUtil.isEmpty(extras)) { try { JSONObject extraJson = new JSONObject(extras); if (extraJson.length() > 0) { msgIntent.putExtra(MainActivity.KEY_EXTRAS, extras); } } catch (JSONException e) { } } LocalBroadcastManager.getInstance(context).sendBroadcast(msgIntent); }*/ openNotification(context, bundle, Constant.SEND_MESSAGE); } /** * 点击通知,进行内部跳转 * * @param context * @param bundle */ private void openNotification(Context context, Bundle bundle, String notice) { Intent i = new Intent(context, MainActivity.class); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); i.putExtra(Constant.KEY_TYPE, notice); i.putExtra(Constant.KEY_JPUSH, bundle); context.startActivity(i); } }

获取RegistrationID

JPushSetUtil.getInstance().getRegistrationID()

一般app获取RegistrationID的会与后台的useid进行绑定,然后通过后台推送数据给移动端

开关推送服务

JPushSetUtil.getInstance().setPushMessage(boolean isOpenPush)
public void setPushMessage(boolean isOpenPush) {
        if (isOpenPush) {
            //恢复推送服务
            JPushInterface.resumePush(mContext);
        } else {
            //停止推送服务
            JPushInterface.stopPush(mContext);
        }
    }

如果接通推送之后,如果你停止推送服务,那么jpush是不会发送给你消息

平台上离线保留时长默认(1天),所以在时间范围内再恢复推送服务,它还是会把之前的通知或者信息发给你

示例

1、发送消息
Android 一分钟快速使用极光推送_第2张图片
2、发送通知
Android 一分钟快速使用极光推送_第3张图片
3、接收数据过程

step 1.在平台上发送信息在app上显示发送的数据

step 2.在平台上发送通知,点击通知,在app上显示发送的数据

step 3.停止推送服务,app没有收到通知

step 4.恢复推送服务,app重新收到刚刚没接收的通知
Android 一分钟快速使用极光推送_第4张图片

你可能感兴趣的:(Android)