极光推送简介

  极光推送,英文简称 JPush,是一个面向普通开发者开放的,免费的第三方消息推送服务。

自动集成

1. 配置 jcenter 支持

在Project 级 build.gradle 中配置jcenter 支持。(新建 project 默认支持)

buildscript {
    repositories {
        jcenter()
    }
    ......
}

allprojects {
    repositories {
        jcenter()
    }
}

2. 添加依赖

在 module级的 build.gradle 中添加依赖和 AndroidManifest 的替换变量。

android {
    ......
    defaultConfig {
        applicationId "com.xxx.xxx" //JPush 上注册的包名.
        ......

        ndk {
            //选择要添加的对应 cpu 类型的 .so 库。
            abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a'
            // 还可以添加 'x86', 'x86_64', 'mips', 'mips64'
        }

        manifestPlaceholders = [
            JPUSH_PKGNAME : applicationId,
            JPUSH_APPKEY : "你的 Appkey ", //JPush 上注册的包名对应的 Appkey.
            JPUSH_CHANNEL : "developer-default", //暂时填写默认值即可.
        ]
        ......
    }
    ......
}

dependencies {
    ......

    compile 'cn.jiguang.sdk:jpush:3.8.6'  // 此处以JPush 3.8.6 版本为例。
    compile 'cn.jiguang.sdk:jcore:2.5.5'  // 此处以JCore 2.5.5 版本为例。
    ......
}

3. 在Application中初始化

MyApplication.java

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        //需在 init 之前调用,避免出现部分日志没打印的情况。多进程情况下建议在自定义的 Application 中 onCreate 中调用。
        JPushInterface.setDebugMode(true);  // 设置开启日志,发布时请关闭日志
        JPushInterface.init(this); // 初始化 JPush
    }
}

同时要在清单文件中配置

android捕捉crash android crush_设置别名

4. 自定义广播和服务类

MyJCommonService.class

/**
 * 自定义广播接收器
 * 增加极光的广播和服务类继承类
 * 服务就是为了让极光服务更加的坚挺,进程不被杀死。
 * 在清单文件中注册
 */
public class MyJCommonService extends JCommonService {
    private static final String TAG = "MyJCommonService";
	//...
}

MyJPushMessageReceiver.class

/**
 * create by 星航指挥官
 * create on 2020/11/19
 * 不过是大梦一场空
 * 课不过是孤影照惊鸿
 */
    /*
    * 状态回调
    * 接受极光添加标签呀接口呀注册成功失败的监听,里面可以重写很多办法,来进行获取操作返回的信息。
    * */
public class MyJPushMessageReceiver extends JPushMessageReceiver {
    private static final String TAG = "MyJPushMessageReceiver";
    /**
     * tag增删查改的操作会在此方法中回调结果
     */
    @Override
    public void onTagOperatorResult(Context context, JPushMessage jPushMessage) {
        super.onTagOperatorResult(context, jPushMessage);
        //下面2个回调类似
//        Log.e(TAG, "onTagOperatorResult查询得到的别名: " + jPushMessage.getAlias());
//        Log.e(TAG, "onTagOperatorResult查询得到的标签: " + jPushMessage.getTags());
        Log.e(TAG, "onTagOperatorResult错误码0为成功: " + jPushMessage.getErrorCode());
//        Log.e(TAG, "onTagOperatorResult传入的标示: " + jPushMessage.getSequence());
        
        
        //如果错误码为6002 请求超时的话 发送一个广播通知MainActivity重新设置别名和标签
        if (jPushMessage.getErrorCode()==6002){
            //新建广播
            Intent intent = new Intent();
            //设置动作
            intent.setAction("SetTagAndAlias");
            //发送广播
            context.getApplicationContext().sendBroadcast(intent);
            //日志提示
            Log.e(TAG, "onTagOperatorResult: 广播已发送");
        }
    }

    /**
     * 查询某个tag与当前用户的绑定状态的操作会在此方法中回调结果
     */
    @Override
    public void onCheckTagOperatorResult(Context context, JPushMessage jPushMessage) {
        super.onCheckTagOperatorResult(context, jPushMessage);
//        Log.e(TAG, "onCheckTagOperatorResult错误码0为成功: " + jPushMessage.getErrorCode());
    }

    /**
     * alias相关的操作会在此方法中回调结果
     */
    @Override
    public void onAliasOperatorResult(Context context, JPushMessage jPushMessage) {
        super.onAliasOperatorResult(context, jPushMessage);
        Log.e(TAG, "onAliasOperatorResult错误码0为成功: " + jPushMessage.getErrorCode());
    }


    /**
     * 收到自定义消息回调
     *
     * @param context
     * @param customMessage
     */
    @Override
    public void onMessage(Context context, CustomMessage customMessage) {
        Log.e(TAG, "[onMessage]收到自定义消息回调" + customMessage);
        //处理自定义消息
        // processCustomMessage(context, customMessage);
    }
    /**
     * 收到通知回调
     *
     * @param context
     * @param message
     */
    @Override
    public void onNotifyMessageArrived(Context context, NotificationMessage message) {
        Log.e(TAG, "[onNotifyMessageArrived]收到通知回调 " + message);
    }
}

5. 清单文件配置

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="qiyuan.lin.sky">


    <!-- Required -->
    <permission
        android:name="${applicationId}.permission.JPUSH_MESSAGE"
        android:protectionLevel="signature" />

    <!-- Required  一些系统要求的权限,如访问网络等-->
    <uses-permission android:name="${applicationId}.permission.JPUSH_MESSAGE" />
    <uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

    <!--华为角标-->
    <uses-permission android:name="com.huawei.android.launcher.permission.CHANGE_BADGE" />


    <!-- Optional for location -->
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <!-- 用于开启 debug 版本的应用在6.0 系统上 层叠窗口权限 -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /><!-- Android Q后台定位权限-->
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.GET_TASKS" />
    <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />


    <application
        android:name=".common.MyApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!-- Since JCore2.0.0 Required SDK核心功能-->
        <!-- 可配置android:process参数将Service放在其他进程中;android:enabled属性不能是false -->
        <!-- 这个是自定义Service,要继承极光JCommonService,可以在更多手机平台上使得推送通道保持的更稳定 -->
        <service
            android:name="qiyuan.lin.sky.jpush.MyJCommonService"
            android:enabled="true"
            android:exported="false"
            android:process=":pushcore">
            <intent-filter>
                <action android:name="cn.jiguang.user.service.action" />
            </intent-filter>
        </service>
        <!-- Required since 3.0.7 -->
        <!-- 新的 tag/alias 接口结果返回需要开发者配置一个自定的广播 -->
        <!-- 3.3.0开始所有事件将通过该类回调 -->
        <!-- 该广播需要继承 JPush 提供的 JPushMessageReceiver 类, 并如下新增一个 Intent-Filter -->
        <receiver
            android:name="qiyuan.lin.sky.jpush.MyJPushMessageReceiver"
            android:enabled="true"
            android:exported="false">
            <intent-filter>
                <action android:name="cn.jpush.android.intent.RECEIVE_MESSAGE" />
                <!-- 您应用的包名-->
                <category android:name="${applicationId}" />
            </intent-filter>
        </receiver>
    </application>

</manifest>

6. 设置别名与标签

MainActivity.class

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //经过测试  一上来就直接设置标签和别名总会报6002
        //先等4秒再设置基本能成功
        mHandler.sendEmptyMessageDelayed(100, 4000);
        //注册JPush报6002超时的广播 重新设置别名与标签
        initbroadcastReceiver();
    }
    /*
    * 注册广播
    * */
    private void initbroadcastReceiver() {
        //注册JPush报6002超时的广播 重新设置别名与标签
        IntentFilter filter = new IntentFilter();
        filter.addAction("SetTagAndAlias");
        registerReceiver(broadcastReceiver6002, filter);

    }

    /*
     * JPush报6002超时的广播 重新设置别名与标签
     * */
    BroadcastReceiver broadcastReceiver6002 = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.e(TAG, "onReceive: 6002广播已收到");
            //重新设置别名与标签
            setBasicSetup(1);
            //查看一下别名与标签
            setBasicSetup(4);
        }

    };

    /**
     * 1-2-3-4
     * 增、删、改、查
     */
    public void setBasicSetup(int type) {
        if (type == 1) {
            //设置别名(新的调用会覆盖之前的设置)
//            JPushInterface.setAlias(this, 0, "0x123");
//            Log.e(TAG, "setBasicSetup: 已设置别名");
            //设置标签(同上)
            JPushInterface.setTags(this, 0, setUserTags());
            Log.e(TAG, "setBasicSetup: 已设置标签");
        } else if (type == 2) {
            //删除别名
            JPushInterface.deleteAlias(this, 0);
            //删除指定标签
            JPushInterface.deleteTags(this, 0, setUserTags());
            //删除所有标签
            JPushInterface.cleanTags(this, 0);
        } else if (type == 3) {
            //增加tag用户量(一般都是登录成功设置userid为目标,在别处新增加比较少见)
            JPushInterface.addTags(this, 0, setUserTags());
        } else if (type == 4) {
            //查询所有标签
            JPushInterface.getAllTags(this, 0);
            //查询别名
            JPushInterface.getAlias(this, 0);
            //查询指定tag与当前用户绑定的状态(MyJPushMessageReceiver获取)
            JPushInterface.checkTagBindState(this, 0, "0x123");
            //获取注册id
            JPushInterface.getRegistrationID(this);
        }
    }

    /**
     * 标签用户
     */
    private static Set<String> setUserTags() {
        //添加3个标签用户(获取登录userid较为常见)
        Set<String> tags = new HashSet<>();
        tags.add("0x412");
        tags.add("0x908");
        tags.add("0x201");
        return tags;
    }

    private final Handler mHandler = new Handler() {
        @Override
        public void handleMessage(android.os.Message msg) {
            super.handleMessage(msg);
            if (msg.what == 100) {
                setBasicSetup(1);
                setBasicSetup(4);
            }
        }
    };


    @Override
    protected void onDestroy() {
        super.onDestroy();
        //解绑广播
        unregisterReceiver(broadcastReceiver6002);
    }
}

服务端集成

SpringBoot服务端集成极光推送

End