关于极光推送的集成,以及实现标签、别名、ID的群推或个推的功能

首先我们要申请一个极光推送的账号,用自己项目的包名在控制台里创建一个自己的应用

创建好的应用界面如图下所示,在后面的配置中我们会用到这个appKey和secret    

现在我们就可以在自己的项目里面集成了

我们去下载极光的sdk包,把sdk拷到我们相应的项目文件夹下,如下图所示:

现在我们开始配置我们的清单文件:

必需的权限 少不了:

<permission
    android:name="您的包名.permission.JPUSH_MESSAGE"
    android:protectionLevel="signature" />

<!-- 要求 -->
<uses-permission android:name="您的包名.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.WAKE_LOCK" />
<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.VIBRATE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACTION_APPLICATION_DETAILS_SETTINGS"/>

<!-- Optional. Required for location feature -->
<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_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.GET_TASKS" />

下面是极光推送的核心服务的配置:

<!-- Required SDK 核心功能-->
<!-- 可配置android:process参数将PushService放在其他进程中 -->
<service
    android:name="cn.jpush.android.service.PushService"
    android:enabled="true"
    android:exported="false" >
    <intent-filter>
        <action android:name="cn.jpush.android.intent.REGISTER" />
        <action android:name="cn.jpush.android.intent.REPORT" />
        <action android:name="cn.jpush.android.intent.PushService" />
        <action android:name="cn.jpush.android.intent.PUSH_TIME" />
    </intent-filter>
</service>

<!-- since 3.0.9 Required SDK 核心功能-->
<provider
    android:authorities="com.jspush.jpushdemo.DataProvider"
    android:name="cn.jpush.android.service.DataProvider"
    android:exported="true" />

<!-- since 1.8.0 option 可选项。用于同一设备中不同应用的JPush服务相互拉起的功能。 -->
<!-- 若不启用该功能可删除该组件,将不拉起其他应用也不能被其他应用拉起 -->
<service
    android:name="cn.jpush.android.service.DaemonService"
    android:enabled="true"
    android:exported="true">
    <intent-filter >
        <action android:name="cn.jpush.android.intent.DaemonService" />
        <category android:name="com.jspush.jpushdemo"/>
    </intent-filter>
</service>
<!-- since 3.1.0 Required SDK 核心功能-->
<provider
    android:authorities="您的包名.DownloadProvider"
    android:name="cn.jpush.android.service.DownloadProvider"
    android:exported="true"
    />

<!-- Required SDK核心功能-->
<receiver
    android:name="cn.jpush.android.service.PushReceiver"
    android:enabled="true" >
    <intent-filter android:priority="1000">
        <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" />
        <category android:name="您的包名"/>
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.USER_PRESENT" />
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
    <!-- Optional -->
    <intent-filter>
        <action android:name="android.intent.action.PACKAGE_ADDED" />
        <action android:name="android.intent.action.PACKAGE_REMOVED" />
        <data android:scheme="package" />
    </intent-filter>
</receiver>
<!-- Required SDK核心功能-->
<activity
    android:name="cn.jpush.android.ui.PushActivity"
    android:configChanges="orientation|keyboardHidden"
    android:theme="@android:style/Theme.NoTitleBar"
    android:exported="false" >
    <intent-filter>
        <action android:name="cn.jpush.android.ui.PushActivity" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="您的包名" />
    </intent-filter>
</activity>

<!-- SDK核心功能-->
<activity
    android:name="cn.jpush.android.ui.PopWinActivity"
    android:configChanges="orientation|keyboardHidden"
    android:exported="false"
    android:theme="@style/AppTheme">
    <intent-filter>
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="您的包名" />
    </intent-filter>
</activity>

<!-- Required SDK核心功能-->
<service
    android:name="cn.jpush.android.service.DownloadService"
    android:enabled="true"
    android:exported="false" >
</service>
!-- Required SDK核心功能-->
<receiver android:name="cn.jpush.android.service.AlarmReceiver" />



<!-- Required since 3.0.7 -->
<!-- 新的tag/alias接口结果返回需要开发者配置一个自定的广播 -->
<!-- 该广播需要继承JPush提供的JPushMessageReceiver类, 并如下新增一个 Intent-Filter -->
<receiver
    android:name=".MyJPushMessageReceiver"
    android:enabled="true" >
    <intent-filter>
        <action android:name="cn.jpush.android.intent.RECEIVE_MESSAGE" />
        <category android:name="您的包名" />
    </intent-filter>
</receiver>

<!-- User defined. 用户自定义的广播接收器-->
<receiver
    android:name=".MyReceiver"
    android:enabled="true">
    <intent-filter>
        <!--Required 用户注册SDK的intent-->
        <action android:name="cn.jpush.android.intent.REGISTRATION" />
        <!--Required 用户接收SDK消息的intent-->
        <action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED" />
        <!--Required 用户接收SDK通知栏信息的intent-->
        <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED" />
        <!--Required 用户打开自定义通知栏的intent-->
        <action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" />
        <!-- 接收网络变化 连接/断开 since 1.6.3 -->
        <action android:name="cn.jpush.android.intent.CONNECTION" />
        <category android:name="您的包名" />
    </intent-filter>
</receiver>
<!-- Required. For publish channel feature -->
<!-- JPUSH_CHANNEL 是为了方便开发者统计APK分发渠道。-->
<!-- 例如: -->
<!-- 发到 Google Play 的APK可以设置为 google-play; -->
<!-- 发到其他市场的 APK 可以设置为 xxx-market。 -->
<meta-data android:name="JPUSH_CHANNEL" android:value="developer-default"/>
<!-- 设置 AppKey -->
<meta-data android:name="JPUSH_APPKEY" android:value="您的APP_KEY"/>

好了现在我们的清单文件就配置完了,下面看一下主要的服务类的代码

一定要在APPlication里面初始化极光

下面的是广播的一个接收器

/**
 * 自定义广播接收器
 */
public class MyReceiver extends BroadcastReceiver {

    private static final String TAG = "MyReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle bundle = intent.getExtras();
        if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) {

            String regId = bundle.getString(JPushInterface.EXTRA_REGISTRATION_ID);
            Log.e(TAG, "JPush用户注册成功id: " + regId);
        } else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) {

            Log.e(TAG, "接受到推送下来的自定义消息id: " + bundle.getString(JPushInterface.EXTRA_MESSAGE));
        } else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) {

            int notifactionId = bundle.getInt(JPushInterface.EXTRA_NOTIFICATION_ID);
            Log.e(TAG, "接受到推送下来的通知id: " + notifactionId);
        } else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {

//                Intent i = new Intent(context, TestActivity.class);
//                i.putExtras(bundle);
//                i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//                context.startActivity(i);
            Log.e(TAG, "用户点击打开了通知跳转的Activity: ");
        } else if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(intent.getAction())) {

            Log.e(TAG, "onReceive: " + bundle.getString(JPushInterface.EXTRA_EXTRA));
        } else if (JPushInterface.ACTION_CONNECTION_CHANGE.equals(intent.getAction())) {
            boolean connected = intent.getBooleanExtra(JPushInterface.EXTRA_CONNECTION_CHANGE, false);

            Log.e(TAG, "onReceive: " + intent.getAction() + " 连接状态变化 " + connected);
        } else {
            Log.e(TAG, "onReceive:  未处理的意图- " + intent.getAction());
        }
    }
}

下面的是标签、别名、ID个推和群推的一个服务的接收器

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());
    }

    /**
     * 查询某个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());
    }
}

最后写一个判断通知栏是否已经开启的通知栏的一个工具类,就OK了

下面我们在MainActivity里面用一下:

首先判断下通知栏是否开启,只有在开启的情况下才能用标签、别名、ID推送

我的demo里面是标签推送,下面我添加了几个标签

ok,完了,功能也实现了

本demo已经测试完毕,已经运用到自己的项目中,可以放心使用!

本博客只是记录开发的点滴,不喜勿喷!

下面是demo下载地址,有意愿的朋友可以下载:https://download.csdn.net/download/android123it/10546271 

谢谢!!!!

猜你喜欢

转载自blog.csdn.net/android123it/article/details/81080554
今日推荐