华为,小米,oppo,vivo,魅族,信鸽推送封装整合。

推送集成方案
1.介绍:
首先我们得aar包分为debug包,以及release包,其中release包做了混淆,开发者使用时候需要去混淆配置文件进行单独类配置,以防无法访问相应得类名。我们得aar包支持的推送分为(小米推送,华为推送,魅族推送,vivo推送,oppo推送,以及三方信鸽推送)。
2.使用:
1)将aar包拷贝到我们的项目的lib文件中,然后在我们的app build.gradle文件中添加
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar','*.aar'])
}
然后rebuild一下ok。
2)然后自己定义一个MyApplication继承BasePushApplication,这个是我们aar包自带的封装好的,可以供aar包支持的所有的推送,所以我们只需要继承这一个就ok,而且机型不需要我们自己进行判断了,只需要继承相应的方法就可以实现走相应机型的推送通道,然后别忘了在我们的清单文件中将我们自定义的MyApplication进行注册。
<application
    android:name=".MyApplication"
    xxx...>
    <activity android:name="xxx">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>
3)点击通知栏跳转到指定的Activity:
如果我们的需求有要求点击通知栏跳转到指定的activity界面的时候,需要我们在清单文件中进行跳转activity的注册,供用aar包中包含的所有推送通道的自定义界面。其中PushActivity名字可以根据自己项目自定义取,里面的配置都是
<!--所有推送得公共类。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。-->
<activity
    android:name=".PushActivity"
    android:launchMode="singleTask">
<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <data
        android:host="com.example.hwdemo"
        android:path="/notify_detail"
        android:scheme="customscheme" />
</intent-filter>
</activity>
2.1小米推送:
集成小米推送也很简单,其余复杂的事情我们的aar都处理过了,剩下的只是一些小的细节的问题,这里介绍一下使用小米推送我们要怎么做;
1)清单文件中的配置:
注意:com.xiaomi.mipushdemo 要换成自己项目中的包名
<!--小米推送权限。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.VIBRATE" />
<permission
    android:name="com.xiaomi.mipushdemo.permission.MIPUSH_RECEIVE"
    android:protectionLevel="signature" /> <!-- 这里com.xiaomi.mipushdemo改成app的包名 -->
<uses-permission android:name="com.xiaomi.mipushdemo.permission.MIPUSH_RECEIVE" />

注意:com.xiaomi.mipushdemo.DemoMessageRreceiver要换成自己项目中的自定义的广播的类名。
-->
<!-- 配置小米的推送的服务和广播 -->
<service
    android:name="com.xiaomi.push.service.XMPushService"
    android:enabled="true"
    android:process=":pushservice" />
<service
    android:name="com.xiaomi.push.service.XMJobService"
    android:enabled="true"
    android:exported="false"
    android:permission="android.permission.BIND_JOB_SERVICE"
    android:process=":pushservice" /> <!-- 注:此service必须在3.0.1版本以后(包括3.0.1版本)加入 -->
<service
    android:name="com.xiaomi.mipush.sdk.PushMessageHandler"
    android:enabled="true"
    android:exported="true" />
<service
    android:name="com.xiaomi.mipush.sdk.MessageHandleService"
    android:enabled="true" /> <!-- 注:此service必须在2.2.5版本以后(包括2.2.5版本)加入 -->
<receiver
    android:name="com.xiaomi.push.service.receivers.NetworkStatusReceiver"
    android:exported="true">
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />

        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</receiver>
<receiver
    android:name="com.xiaomi.push.service.receivers.PingReceiver"
    android:exported="false"
    android:process=":pushservice">
    <intent-filter>
        <action android:name="com.xiaomi.push.PING_TIMER" />
    </intent-filter>
</receiver>

<!-- 注册广播接收者 -->
<receiver
    android:name="com.xiaomi.mipushdemo.DemoMessageRreceiver"
    android:exported="true">
    <!-- 这里com.xiaomi.mipushdemo.DemoMessageRreceiver改成app中定义的完整类名 -->
    <intent-filter>
        <action android:name="com.xiaomi.mipush.RECEIVE_MESSAGE" />
    </intent-filter>
    <intent-filter>
        <action android:name="com.xiaomi.mipush.MESSAGE_ARRIVED" />
    </intent-filter>
    <intent-filter>
        <action android:name="com.xiaomi.mipush.ERROR" />
    </intent-filter>
</receiver>

2)使用:
非常简单,只需要在我们的自定义的MyApplication中调用BasePushApplication中的方法initXiaoMiPush,然后在initXiaoMiPush这个方法中调用setRegistXiaoMi(appId,appKey);这个方法进行小米推送的注册,其中appId和appKey,是我们在小米推送平台申请推送时候生成的,直接拿过来用就ok。
public class MyApplication extends BasePushApplication {
    @Override
    public void initXiaoMiPush() {
        super.initXiaoMiPush();
        String appId = AppParms.XmAppId;
        String appKey = AppParms.XmAppKey;
        setRegistXiaoMi(appId,appKey);
    }
}
然后是我们自定义的广播接收者,方法要运行在非ui线程中才可以。
public class XmPushReceiver extends PushMessageReceiver {
    /**
     * 1.PushMessageReceiver是一个抽象类,通过集成该类,实现小米推送注册之后的回调
     * 2.需要将IMIPushMessageReceiver注册到Manifest文件中
     * 3.通过onReceivePassThroughMessage方法处理服务器向客户端发送的透传消息
     * 4.通过onNotificationMessageClicked方法服务器向客户端发送通知消息,该回调方法会在用户点击通知之后触发
     * 5.通过onNotificationMessageArrived方法服务器向客户端发送通知消息,该回调方法会在通知消息到达客户端之后触发。另外应用在前台时不展示通知也在该方法中调用
     * 6.通过onCommandResult方法来接收客户端向服务器发送命令后的响应结果
     * 7.通过onReceiveRegisterResult方法接收客户端向服务器注册推送后响应的结果
     * 8.当前所有的操作都没有运行在UI线程
     */
    private String mRegId;
    private long mResultCode = -1;
    private String mReason;
    private String mCommand;
    private String mMessage;
    private String mTopic;
    private String mAlias;
    private String mUserAccount;
    private String mStartTime;
    private String mEndTime;
    @Override
    public void onReceivePassThroughMessage(Context context, 
MiPushMessage message) {
        mMessage = message.getContent();
        if(!TextUtils.isEmpty(message.getTopic())) {
            mTopic=message.getTopic();
        } else if(!TextUtils.isEmpty(message.getAlias())) {
            mAlias=message.getAlias();
        } else if(!TextUtils.isEmpty(message.getUserAccount())) {
            mUserAccount=message.getUserAccount();
        }
    }
    /**
     * 点击通知栏的推送
     * @param context
     * @param message
     */
    @Override
    public void onNotificationMessageClicked(Context context,
MiPushMessage message) {
    }
    @Override
    public void onNotificationMessageArrived(Context context,
MiPushMessage message) {
        mMessage = message.getContent();
        if(!TextUtils.isEmpty(message.getTopic())) {
            mTopic=message.getTopic();
        } else if(!TextUtils.isEmpty(message.getAlias())) {
            mAlias=message.getAlias();
        } else if(!TextUtils.isEmpty(message.getUserAccount())) {
            mUserAccount=message.getUserAccount();
        }
    }
    @Override
    public void onCommandResult(Context context,
MiPushCommandMessage message) {
        String command = message.getCommand();
        List<String> arguments = message.getCommandArguments();
        String cmdArg1 = ((arguments != null && arguments.size() > 0) ?     arguments.get(0) : null);
        String cmdArg2 = ((arguments != null && arguments.size() > 1) ?     arguments.get(1) : null);
        if (MiPushClient.COMMAND_REGISTER.equals(command)) {
            if (message.getResultCode() == ErrorCode.SUCCESS) {
                mRegId = cmdArg1;
            }
        } else if (MiPushClient.COMMAND_SET_ALIAS.equals(command)) {
            if (message.getResultCode() == ErrorCode.SUCCESS) {
                mAlias = cmdArg1;
             }
        } else if (MiPushClient.COMMAND_UNSET_ALIAS.equals(command)) {
            if (message.getResultCode() == ErrorCode.SUCCESS) {
                mAlias = cmdArg1;
              }
        } else if (MiPushClient.COMMAND_SUBSCRIBE_TOPIC.equals(command))
{
            if (message.getResultCode() == ErrorCode.SUCCESS) {
                mTopic = cmdArg1;
             }
        } else if (MiPushClient.COMMAND_UNSUBSCRIBE_TOPIC.equals(command))     {
            if (message.getResultCode() == ErrorCode.SUCCESS) {
                mTopic = cmdArg1;
              }
        } else if (MiPushClient.COMMAND_SET_ACCEPT_TIME.equals(command)) {
            if (message.getResultCode() == ErrorCode.SUCCESS) {
                mStartTime = cmdArg1;
                mEndTime = cmdArg2;
             }
        }
    }
    @Override
    public void onReceiveRegisterResult(Context context,
MiPushCommandMessage message) {
        String command = message.getCommand();
        List<String> arguments = message.getCommandArguments();
        String cmdArg1 = ((arguments != null && arguments.size() > 0) ?     arguments.get(0) : null);
        String cmdArg2 = ((arguments != null && arguments.size() > 1) ?     arguments.get(1) : null);
        if (MiPushClient.COMMAND_REGISTER.equals(command)) {
            if (message.getResultCode() == ErrorCode.SUCCESS) {
                mRegId = cmdArg1;
             }
        }
    }
}
然后在我们的onReceiveRegisterResult方法中拿到mRegId就是我们传递给后台的标识,然后小米的推送就集成完毕了。
3)击状态栏跳转到指定的activity界面:
这需要我们生成一个url给我们的后台,进行activity页面跳转的路径,我们可以在自定义的MyApplication中的小米初始化中进行生成,然后传给我们的后台,如果确定不会改变,那可以直接生成,然后告知后台写死就ok。
Intent intent = new Intent(this,PushActivity.class);
String uriString = intent.toUri(Intent.URI_INTENT_SCHEME);
然后uriString就是我们需要给后台的跳转路径,其中PushActivity是我们想要跳转的指定界面的activity,然后就可以喽。如果想要得到后台传递的key value键值对的话,需要我们在指定的activity中或者在onNotificationMessageArrived 中得到,可以debu断点测试,查看。

2.2 OPPO推送:
集成oppo推送我们需要怎么做;
这里需要注意一下,因为想要集成oppo推送,前提需要我们的app必须发布到oppo应用市场审核通过才可以申请推送,(所以想要测试的小伙伴们,没办法哦,必须拿你的线上应用进行申请测试喽)
1)清单文件中的配置:
<!--oppo推送得权限.....................................................................-->
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <!-- oppo推送权限 -->
<uses-permission android:name="com.coloros.mcs.permission.RECIEVE_MCS_MESSAGE" />

其中OppoPushMessageService是我们自己自定义的服务,一般不会用到里面的方法,oppo推送还是比较特别的,相比其他推送来说。
<!--oppo推送。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。-->
<service
    android:name=".OppoPushMessageService"
    android:permission="com.coloros.mcs.permission.SEND_MCS_MESSAGE">
    <intent-filter>
        <action android:name="com.coloros.mcs.action.RECEIVE_MCS_MESSAGE" />
    </intent-filter>
</service>

2)使用:
因为集成了我们的推送aar包,就可以直接在我们自定义的MyApplication中调用BasePushApplication中的方法initOppo,这也是我们开启oppo推送注册的方法。然后在我们的initOppo方法中调用setRegistOppo(appKey,appSecret)方法,其中appKey和appSecret是我们在推送平台注册申请时候生成的,所以也可以直接拿过来用就OK了,然后再调用
SetOppoRegistListener()回调方法,里面有我们注册成功失败的回调,然后返回registerId提供给后台,得到相应推送的消息。
public class MyApplication extends BasePushApplication {
   @Override
public void initOppo() {
    super.initOppo();
    String appKey = AppParms.OppoAppKey;
    String appSecret = AppParms.OppoAPPSECRET;
    setRegistOppo(appKey,appSecret);  //需要转递的appkey和appSecret
    setOppoRegistListener(new OppoRegistListener() {
        @Override
        public void oppoRegistSucceed(String registerId) {
            //注册成功
            Log.i("NPL", "注册成功,registerId=" + registerId);
        }

        @Override
        public void oppoRegistFaile(String registerId) {
            //注册失败
            Log.i("NPL", "注册失败,registerId=" + registerId);
        }

        @Override
        public void oppoRegistError(String error) {
            //注册异常
            Log.i("NPL", "注册异常,error: "+error.toString());
        }
    });
}
}
然后这样其实就ok了,因为我们自定义的服务,一般不怎么会用到,如果你想用,可以写一下(其中OppoPushMessageService 是我们自己自定义的Service)
public class OppoPushMessageService extends PushService {
    @Override
    public void processMessage(Context context, AppMessage appMessage) {
        super.processMessage(context, appMessage);
    }

    @Override
    public void processMessage(Context context, CommandMessage     commandMessage) {
        super.processMessage(context, commandMessage);
    }

    @Override
    public void processMessage(Context context, SptDataMessage     sptDataMessage) {
        super.processMessage(context, sptDataMessage);
    }
}

3)击状态栏跳转到指定的activity界面:
因为oppo推送点击通知栏跳转到指定的界面,不需要给后台url,只需要给自定义的activity的全路径名就ok了,所以我们只需要把com.example.push.common.PushActivity给后台就ok了,其中com.example.push.common换成我们自己项目的全路径。
然后如果想要获取后台传递的key value键值对,需要我们在相应的activity中的onCreate和onNewIntent中通过getIntent().getExtras().getString("key")中拿到想用的value即可,其中key为我们和后台事前定好的名字。
备注:这里说一下,因为我们应用可能是打开的状态,这时候我们点击通知栏再跳转到指定的activity他可能不会走onCreate,但是因为我们自定义的activity在清单文件中配置启动模式android:launchMode="singleTask",所以当我们界面没销毁,会走onNewIntent这个方法,所以我们在这里也可以拿到相应的key value。

2.3魅族推送:
集成魅族推送我们需要怎么做;
1)清单文件和gradle中的配置:
其中com.example.pushmanager换成你自己项目中的包名。
<!--魅族推送权限。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。-->
<!-- 兼容flyme5.0以下版本,魅族内部集成pushSDK必填,不然无法收到消息-->
<uses-permission android:name="com.meizu.flyme.push.permission.RECEIVE" />
<permission
    android:name="com.example.pushmanager.push.permission.MESSAGE"
    android:protectionLevel="signature" />
<uses-permission android:name="com.example.pushmanager.push.permission.MESSAGE" />
<!--  兼容flyme3.0配置权限-->
<uses-permission android:name="com.meizu.c2dm.permission.RECEIVE" />
<permission
    android:name="com.example.pushmanager.permission.C2D_MESSAGE"
    android:protectionLevel="signature" />
<uses-permission android:name="com.example.pushmanager.permission.C2D_MESSAGE" />

其中MzPushReceiver为自己自定义的接收者类名
<!--魅族推送。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。-->
<!-- push应用定义消息receiver声明 -->
<receiver android:name=".MzPushReceiver">
    <intent-filter>
        <!-- 接收push消息 -->
        <action android:name="com.meizu.flyme.push.intent.MESSAGE" />
        <!-- 接收register消息 -->
        <action android:name="com.meizu.flyme.push.intent.REGISTER.FEEDBACK" />
        <!-- 接收unregister消息-->
        <action android:name="com.meizu.flyme.push.intent.UNREGISTER.FEEDBACK" />
        <!-- 兼容低版本Flyme3推送服务配置 -->
        <action android:name="com.meizu.c2dm.intent.REGISTRATION" />
        <action android:name="com.meizu.c2dm.intent.RECEIVE" />
        <category android:name="package_name"></category>
    </intent-filter>
</receiver>
然后是在我们的app中的build.gradle文件中添加三方依赖库
dependencies {
    api 'com.meizu.flyme.internet:push-internal:3.6.+@aar'
}
然后在我们的project中的build.gradle中添加maven库
allprojects {
    repositories {
        maven {url 'https://oss.jfrog.org/artifactory/oss-snapshot-local'}//魅族maven仓路径
    }
}

2)使用:
在我们的自定义的MyApplication中实现方法initMeiZuPush,然后在此方法中调用setRegistMeiZuPush(appId,appKey)方法,其中appId和appKey是我们在魅族推送平台申请推送的时候生成的,这里可以直接拿过来用。
public class MyApplication extends BasePushApplication {
@Override
public void initMeiZuPush() {
    super.initMeiZuPush();
    String appId = AppParms.MeiZuAppID;
    String appKey = AppParms.MeiZuAppKey;
    setRegistMeiZuPush(appId,appKey);
}
}

然后在我们的自定的MzPushReceiver中实现MzPushMessageReceiver类,然后实现其中的方法,其实我们只需要用到一个方法onRegisterStatus就可以了,在这个方法中打印日志能获取到我们当前设备的pushId,用来推送使用。
public class MzPushReceiver extends MzPushMessageReceiver {
    @Override
    public void onRegister(Context context, String s) {
    }
    @Override
    public void onUnRegister(Context context, boolean b) {
    }
    @Override
    public void onPushStatus(Context context, PushSwitchStatus     pushSwitchStatus) {
    }
    @Override
    public void onRegisterStatus(Context context, RegisterStatus     registerStatus) {
        Log.i("lng", "onRegisterStatus: "+registerStatus);
    }
    @Override
    public void onUnRegisterStatus(Context context, UnRegisterStatus     unRegisterStatus) {
    }
    @Override
    public void onSubTagsStatus(Context context, SubTagsStatus     subTagsStatus) {

    }
    @Override
    public void onSubAliasStatus(Context context, SubAliasStatus     subAliasStatus) {
    }
}

3)击状态栏跳转到指定的activity界面:
因为魅族推送点击通知栏跳转到指定的界面,不需要给后台url,只需要给自定义的activity的全路径名就ok了,所以我们只需要把com.example.push.common.PushActivity给后台就ok了,其中com.example.push.common换成我们自己项目的全路径。
然后如果想要获取后台传递的key value键值对,需要我们在相应的activity中的onCreate和onNewIntent中通过getIntent().getExtras().getString("key")中拿到想用的value即可,其中key为我们和后台事前定好的名字,也可以在广播接收者onNotificationClicked回调方法中的MzPushMessage参数里面拿到,这样就ok了。

2.4 VIVO推送:
集成vivo推送我们应该再怎么做;
备注:因为vivo推送的集成是有限制的,而且我们想要集成vivo推送的app的类型不能是金融财险类的,所以这里需要你注意一下。
1)清单文件中的配置:
<!--vivo推送权限。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。-->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

其中api_key和app_id需要我们在推送平台申请时候自动生成的,直接拿过来用放到value中,VivoPushReceiver是我们自定义的广播接收者,可以自己替换。
<!--vivo推送。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。-->
<!--推送服务需要配置的 service、activity-->
<service
    android:name="com.vivo.push.sdk.service.CommandClientService"
    android:exported="true" />
<activity
    android:name="com.vivo.push.sdk.LinkProxyClientActivity"
    android:exported="false"
    android:screenOrientation="portrait"
    android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<!--推送配置项-->
<meta-data
    android:name="com.vivo.push.api_key"
    android:value="**********" />
<meta-data
    android:name="com.vivo.push.app_id"
    android:value="**********" />
<!-- push 应用定义消息 receiver 声明 -->
<receiver android:name=".VivoPushReceiver" >
    <intent-filter>
        <!-- 接收 push 消息 -->
        <action android:name="com.vivo.pushclient.action.RECEIVE" />
    </intent-filter>
</receiver>

2)使用:
在我们自定义的MyApplication继承BasePushApplication中实现initVivoPush方法,然后在这个方法中调用setOnVivoRegistListener这个方法,得到俩个回调,代表注册成功和失败,然后通过state状态码进行判断。
public class MyApplication extends BasePushApplication {
@Override
public void initVivoPush() {
    super.initVivoPush();
    setOnVivoRegistListener(new VivoRegistListener() {
        @Override
        public void onVivoSucceed(String state) {
            Log.i("viv_push", "onVivoSucceed: "+state);
        }
        @Override
        public void onVivoFaile(String state) {
            Log.i("viv_push", "onVivoFaile: "+state);
        }
    });
}
}
然后让我自定义的VivoPushReceiver继承OpenClientPushMessageReceiver然后实现里面自带的俩个方法其中在onReceiveRegId这个方法中拿到s值就是regid ,然后根据regid传递给后台进行消息的推送。
public class VivoPushReceiver extends OpenClientPushMessageReceiver {
    @Override
    public void onNotificationMessageClicked(Context context,     UPSNotificationMessage upsNotificationMessage) {
    }
    @Override
    public void onReceiveRegId(Context context, String s) {
    if (TextUtils.isEmpty(s)) {
        //获取regId失败
        Log.i("NPL", "获取RegId失败");
    } else {
        Log.i("NPL", "获取RegId成功,regid = " + s);
    }
    }
}
3)点击状态栏跳转到指定的activity界面:
如果我们想要跳转到指定的activity界面的时候,是需要我们自己生成相应的跳转url才可以,当然,这里需要我们在我们目标activity中进行一些action的配置,因为我们的公共PushActivity在清单文件中已经做了很详细的配置了,我们自己用的话,可以直接仿照我们的PushActivity的配置,所以这里就直接生成url就可以了。
其中com.example.hwdemo 是我们PushActiivty在清单文件中配置的host notify_detail是我们的PushActiivty在清单文件中配置的path然后将得到的intentUrl传递给我们的后台服务器,然后后台就可以配置,跳转到我们指定的PushActivity了。
Intent intent1 = new Intent(this, PushActivity.class);
intent1.setData(Uri.parse("customscheme://com.example.hwdemo/notify_detail?key=value"));
intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
String intentUrl = intent1.toUri(Intent.URI_INTENT_SCHEME);
Log.i("intent_url", "vivo_intent_url: "+intentUrl);
如果想要在我们PushActivity中拿后台传递给我我们的key value 键值对的,需要我们在PushActivity中的onCreat或者onNewIntent中通过getIntent().getStringExtra("key");获取相应的数据,其中key是我们和后台事前定义好的写死的,也可以在广播回调onNotificationMessageClicked方法的UPSNotificationMessage参数里拿到相应的数据。这样就ok了。

2.5 信鸽推送:
集成信鸽推送我们需要怎么做;
1)清单文件和gradle中的的配置:
其中XinGeReceiver是我们自定义的广播接收者,可以自己定义名字。
<!--信鸽推送。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。-->
<receiver android:name=".XinGeReceiver"
    android:exported="true" >
    <intent-filter>
        <!-- 接收消息透传 -->
        <action android:name="com.tencent.android.tpush.action.PUSH_MESSAGE" />
        <!-- 监听注册、反注册、设置/删除标签、通知被点击等处理结果 -->
        <action android:name="com.tencent.android.tpush.action.FEEDBACK" />
    </intent-filter>
</receiver>

然后在我们的app的build.gradle文件中的android中的defaultConfig中需要添加配置,而且manifestPlaceholders 中的XG_ACCESS_ID以及XG_ACCESS_KEY是我们在推送平台申请推送的时候生成的,直接拿来使用就ok了,以及dependencies中添加依赖库。
android {
    defaultConfig {
        ndk {
            //根据需要 自行选择添加的对应cpu类型的.so库。
            abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a'
            // 还可以添加 'x86', 'x86_64', 'mips', 'mips64'
        }
        manifestPlaceholders = [
                XG_ACCESS_ID : "******",
                XG_ACCESS_KEY: "******",
        ]
    }
}

dependencies {
    //信鸽jar
    api 'com.tencent.xinge:xinge:3.2.7-Release'
    //jg包
    api 'com.tencent.jg:jg:1.1'
    //wup包
    api 'com.tencent.wup:wup:1.0.0.E-Release'
    //mid包
    api 'com.tencent.mid:mid:4.0.6-release'
}

2)使用:
在我们自定义的MyApplication继承BasePushApplication中实现initXinGe方法,然后在这个方法中调用setXinGeRegistListener这个方法,得到俩个回调,代表注册成功和失败,成功之后会在成功的回调中拿到token,也就是我们需要给后台传递的唯一标识获取推送消息。
public class MyApplication extends BasePushApplication {
@Override
public void initXinGe() {
    super.initXinGe();
    setXinGeRegistListener(new XinGeRegistListener() {
        @Override
        public void xinGeRegistSucceed(String token) {
            //token在设备卸载重装的时候有可能会变
            Log.i("xgTPush", "注册成功,设备token为:" + token);
        }
        @Override
        public void xinGeRegistFalie(String message) {
            Log.i("xgTPush", message);
        }
    });
}
}

然后根据自己的需求可以自定义广播接收者,一般不会用到这个。
public class XinGeReceiver extends XGPushBaseReceiver {
    @Override
    public void onRegisterResult(Context context, int i,     XGPushRegisterResult xgPushRegisterResult) {
    }
    @Override
    public void onUnregisterResult(Context context, int i) {
    }
    @Override
    public void onSetTagResult(Context context, int i, String s) {
    }
    @Override
    public void onDeleteTagResult(Context context, int i, String s) {
    }
    @Override
    public void onTextMessage(Context context, XGPushTextMessage     xgPushTextMessage) {
    }
    @Override
    public void onNotifactionClickedResult(Context context,     XGPushClickedResult xgPushClickedResult) {
    }
    @Override
    public void onNotifactionShowedResult(Context context,     XGPushShowedResult xgPushShowedResult) {
    }
}

3)击状态栏跳转到指定的activity界面:
因为信鸽推送点击通知栏跳转到指定的界面,不需要给后台url,只需要给自定义的activity的全路径名就ok了,所以我们只需要把com.example.push.common.PushActivity给后台就ok了,其中com.example.push.common换成我们自己项目的全路径。然后在我们的目标activity中的onCreate和onNewIntent方法中通过方法获取指定的key value。
备注:这里注意一下,其中key1和key2是我们事先知道的,这个是我们双方定义好有几个key,key的名字是什么,都是定好的。然后我们根据key拿到相应的value。
//this必须为点击消息要跳转到页面的上下文。
XGPushClickedResult clickedResult = XGPushManager.onActivityStarted(PushActivity.this);
//获取消息附近参数
String ster = clickedResult.getCustomContent();
JsonObject returnData = new JsonParser().parse(ster).getAsJsonObject();
String key11 = returnData.get("key1").getAsString();
String key12 = returnData.get("key2").getAsString();

2.6 华为推送:
集成华为推送我们需要怎么做;
1)清单文件的配置:
其中com.example.hwdemo要换成你自己项目的包名。
<!--华为推送权限。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。-->
<!--在manifest节点下增加所需权限-->
<!--HMS-SDK引导升级HMS功能,访问OTA服务器需要网络权限-->
<uses-permission android:name="android.permission.INTERNET" />
<!--HMS-SDK引导升级HMS功能,保存下载的升级包需要SD卡写权限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--检测网络状态-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--检测wifi状态-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--为了获取用户手机的IMEI,用来唯一的标识用户。-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!--如果是安卓8.0,应用编译配置的targetSdkVersion>=26,请务必添加以下权限 -->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<!-- 接收PUSH TOKEN的广播以及PUSH消息需要定义该权限 ${PACKAGE_NAME} 要替换上您应用的包名 -->
<permission
    android:name="com.example.hwdemo.permission.PROCESS_PUSH_MSG"
    android:protectionLevel="signatureOrSystem" />
<!--接收PUSH TOKEN的广播以及PUSH消息需要定义该权限 ${PACKAGE_NAME} 要替换上您应用的包名 -->
<uses-permission android:name="com.example.hwdemo.permission.PROCESS_PUSH_MSG" />

然后注册广播和服务
备注:其中BaseHuaWeiPushReceiver换成自己自定义的服务接收者,然后将com.example.hwdemo换成自己项目的包名,以及appid中的value******换成推送平台申请成功的appid。其中HuaWeiReceiver和HuaWeiNotifyReceiver是我们自定义的广播接收者,用来处理回调消息的,HuaWeiNotifyReceiver用来接收点击推送消息通知栏的回调。
<!-- value的值“xxx”用实际申请的应用ID替换,来源于开发者联盟网站应用的服务详情。-->
<meta-data
    android:name="com.huawei.hms.client.appid"
    android:value="*****"></meta-data>
<!-- ● 如果您的应用使用以下能力:
       获取unionId。
       使用getPurchaseInfo接口。
     ● 请在application节点下增加"com.huawei.hms.version"信息。-->
<meta-data
    android:name="com.huawei.hms.version"
    android:value="2.6.1"></meta-data>

<!--BridgeActivity定义了HMS SDK中一些跳转所需要的透明页面-->
<activity
    android:name="com.huawei.hms.activity.BridgeActivity"
    android:configChanges="orientation|locale|screenSize|layoutDirection|fontScale"
    android:excludeFromRecents="true"
    android:exported="false"
    android:hardwareAccelerated="true"
    android:theme="@android:style/Theme.Translucent">
    <meta-data
        android:name="hwc-theme"
        android:value="androidhwext:style/Theme.Emui.Translucent" />
</activity>

<!-- AppUpdateActivity和PackageInstallActivity是应用自升级接口所需要使用的页面-->
<activity
    android:name="com.huawei.updatesdk.service.otaupdate.AppUpdateActivity"
    android:configChanges="orientation|screenSize"
    android:exported="false"
    android:theme="@style/upsdkDlDialog">

    <meta-data
        android:name="hwc-theme"
        android:value="androidhwext:style/Theme.Emui.Translucent.NoTitleBar" />
</activity>

<activity
    android:name="com.huawei.updatesdk.support.pm.PackageInstallerActivity"
    android:configChanges="orientation|keyboardHidden|screenSize"
    android:exported="false"
    android:theme="@style/upsdkDlDialog">
    <meta-data
        android:name="hwc-theme"
        android:value="androidhwext:style/Theme.Emui.Translucent" />
</activity>

<!--用于HMS SDK引导升级HMS APK,提供给系统安装器读取升级文件-->
<!--“xxx.xxx.xxx”用实际的应用包名替换-->
<provider
    android:name="com.huawei.hms.update.provider.UpdateProvider"
    android:authorities="com.example.hwdemo.update.provider"
    android:exported="false"
    android:grantUriPermissions="true"></provider>

<!--如果应用或者游戏使用了如下接口,HMSAgent.checkUpdate(Activity activity,CheckUpdateHandler callback),则此步骤必选。-->
<!--“xxx.xxx.xxx”用实际的应用包名替换-->
<provider
    android:name="com.huawei.updatesdk.fileprovider.UpdateSdkFileProvider"
    android:authorities="com.example.hwdemo.updateSdk.fileProvider"
    android:exported="false"
    android:grantUriPermissions="true"></provider>
<!--在application节点下增加Service,用于应用自升级-->
<!-- 应用下载服务 -->
<service
    android:name="com.huawei.updatesdk.service.deamon.download.DownloadService"
    android:exported="false" />

<!-- 接入HMSSDK PUSH模块需要注册,第三方相关 :接收Push消息(注册、透传消息、通知栏点击事件)广播,此receiver类需要开发者自己创建并继承com.huawei.hms.support.api.push.PushReceiver类,参考示例代码中的类:com.huawei.hmsagent.HuaweiPushRevicer-->

<!--“xxx”用实际的类名替换, ${PACKAGE_NAME} 要替换上您应用的包名-->
<!--在application节点下声明2个receiver和1个service,用于接收广播信息。-->
<!--用于接收PUSH Token,透传消息和通知栏点击消息用来接收PUSH消息的receiver:-->
<receiver
    android:name=".HuaWeiReceiver"
    android:permission="com.example.hwdemo.permission.PROCESS_PUSH_MSG">
    <intent-filter>
        <!-- 必须,用于接收token -->
        <action android:name="com.huawei.android.push.intent.REGISTRATION" />
        <!-- 必须, 用于接收透传消息 -->
        <action android:name="com.huawei.android.push.intent.RECEIVE" />
        <!-- 必须, 用于接收通知栏消息点击事件 此事件不需要开发者处理,只需注册就可以-->
        <action android:name="com.huawei.intent.action.PUSH_DELAY_NOTIFY" />
    </intent-filter>
</receiver>

<!--用于接收通知栏消息的点击事件 onEvent-->
<receiver android:name=".HuaWeiNotifyReceiver">
    <intent-filter>
        <!-- 用于点击通知栏或通知栏上的按钮后触发onEvent回调 -->
        <action android:name="com.huawei.android.push.intent.CLICK" />
        <!-- 查看push通道是否连接, 不查看则不需要 -->
        <action android:name="com.huawei.intent.action.PUSH_STATE" />
    </intent-filter>
</receiver>

<!--如果应用需要在非华为设备上使用PUSH,需要声明HmsMsgService-->
<!--接入HMSSDK PUSH模块需要注册该service,不需要开发者处理-->
<service
    android:name="com.huawei.hms.support.api.push.service.HmsMsgService"
    android:enabled="true"
    android:exported="true"
    android:process=":pushservice">
    <intent-filter>
        <action android:name="com.huawei.push.msg.NOTIFY_MSG" />
        <action android:name="com.huawei.push.msg.PASSBY_MSG" />
    </intent-filter>
</service>
<!--解决华为移动服务升级问题的透明界面-->
<activity
    android:name="com.huawei.android.hms.agent.common.HMSAgentActivity"
    android:configChanges="orientation|locale|screenSize|layoutDirection|fontScale"
    android:excludeFromRecents="true"
    android:exported="false"
    android:hardwareAccelerated="true"
    android:theme="@android:style/Theme.Translucent">
    <meta-data
        android:name="hwc-theme"
        android:value="androidhwext:style/Theme.Emui.Translucent" />
</activity>

然后在我们的项目的gradle中添加华为maven仓库
allprojects {
    repositories {
        jcenter()
        google()
        maven {url 'http://developer.huawei.com/repo/'} 
    }
}
然后在我们的app的gradle中添加依赖
api 'com.huawei.android.hms:push:2.6.3.301'

2)使用:
然后将我们提供的HMSAgent_2.6.3.306.zip压缩文件解压然后双击GetHMSAgent_cn.bat文件生成doc命令,在命令里面根据提示一步一步操作,然后最终操作完毕会生成copysrc文件,将这个文件里面的项目代码拷贝到我们自己项目中就ok了。
然后我们需要在我们自定义的MyApplication中实现方法initHuaWeiPush。
public class MyApplication extends BasePushApplication {
@Override
public void initHuaWeiPush() {
    super.initHuaWeiPush();
    HMSAgent.init(this);
}

然后是我们自定义的广播接收者,直接继承BaseHuaWeiPushReceiver 就ok,不需要做任何处理。
public class HuaWeiReceiver extends BaseHuaWeiPushReceiver {
}

然后是我们点击状态栏的回调的广播接收者,这里继承BaseHuaWeiNotifyReceiver 
然后实现里面的方法onEvent点击状态栏就会触发此方法。
public class HuaWeiNotifyReceiver extends BaseHuaWeiNotifyReceiver {
    @Override
    public void onEvent(Context context, Event event, Bundle extras) {
        super.onEvent(context, event, extras);
    }
}

然后在我们应用中启动的第一个activity中进行的一些配置:
都在onCreate方法中进行配置(为了注册广播接收者)然后调用此方法会让我们当前的activity 实现 BaseHuaWeiPushReceiver.IPushCallback这个接口,然后实现他的方法onReceive(),然后此方法是在onCreate外面的。
/**
 * 以下代码为sample自身逻辑,和业务能力不相关
 * 作用仅仅为了在sample界面上显示push相关信息
 */
BaseHuaWeiPushReceiver.setReceiver(new BaseHuaWeiPushReceiver.OnReceive() {
    @Override
    public void Receivers(String tokenIn) {
        Log.i("tokens", "Receivers: " + tokenIn);
        return;
    }
});
BaseHuaWeiPushReceiver.registerPushCallback(this);

然后
HMSAgent.Push.enableReceiveNotifyMsg(true, new EnableReceiveNotifyMsgHandler() {
    @Override
    public void onResult(int rst) {
        Log.i("tokens", "onResult: "+rst);
    }
});

然后
HMSAgent.connect(this, new ConnectHandler() {
    @Override
    public void onConnect(int rst) {
        Log.i("tokens", "onConnect: "+rst);
    }
});

然后
HMSAgent.Push.getToken(new GetTokenHandler() {
    @Override
    public void onResult(int rtnCode) {
        Log.i("tokens", "get token: end " + rtnCode);
    }
});

以上的方法都在onCreate方法中进行的,目的就是为了获取token,然后用于推送,其中token在我们的Receivers方法中得到。

然后是我们onCreate外面的方法。
@Override
public void onReceive(Intent intent) {
    if (intent != null) {
        String action = intent.getAction();
        Bundle b = intent.getExtras();
        if (b != null && ACTION_TOKEN.equals(action)) {
            token = b.getString(ACTION_TOKEN);
        } else if (b != null && ACTION_UPDATEUI.equals(action)) {
            String log = b.getString("log");
            Log.i("tokens", "onReceive:" + log);
        }
    }
}
然后执行onDestroy() 方法是为了销毁当前activity的时候广播也注销掉。
@Override
protected void onDestroy() {
    super.onDestroy();
    BaseHuaWeiPushReceiver.unRegisterPushCallback(this);
}

3)点击状态栏跳转到指定的activity界面:
如果我们想要跳转到指定的activity界面的时候,是需要我们自己生成相应的跳转url才可以,当然,这里需要我们在我们目标activity中进行一些action的配置,因为我们的公共PushActivity在清单文件中已经做了很详细的配置了,我们自己用的话,可以直接仿照我们的PushActivity的配置,所以这里就直接生成url就可以了。
其中com.example.hwdemo 是我们PushActiivty在清单文件中配置的host notify_detail是我们的PushActiivty在清单文件中配置的path,然后customscheme是我们清单文件中的配置scheme,然后我们将得到的intentUrl传递给我们的后台服务器,然后后台就可以配置,跳转到我们指定的PushActivity了。
其中生成url方法:
Intent intents = new Intent(Intent.ACTION_VIEW, Uri.parse("customscheme://com.example.hwdemo/notify_detail"));
intents.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
String toUri = intents.toUri(Intent.URI_INTENT_SCHEME);
Log.i("to_url", "initHuaWeiPush: "+toUri);

如果我们想要获取后台传递给我们的key value的话,我们只能在广播接收的回调中得到,上面我们已经说了那个方法。
public class HuaWeiNotifyReceiver extends BaseHuaWeiNotifyReceiver {
    @Override
    public void onEvent(Context context, Event event, Bundle extras) {
        super.onEvent(context, event, extras);
    }
}

然后在这个onEvent方法将extras直接解析就ok了,其中key1和key2是我们自己和后台事先定义好的,直接写死就ok,然后根据key获取相应的value。当然这里用到了gson解析,所以需要你们自己项目里要有gson的库,这里不做多的介绍了。
public class HuaWeiNotifyReceiver extends BaseHuaWeiNotifyReceiver {
    @Override
    public void onEvent(Context context, Event event, Bundle extras) {
        super.onEvent(context, event, extras);
        JsonObject returnData = new     JsonParser().parse(extras).getAsJsonObject();
        String key11 = returnData.get("key1").getAsString();
        String key12 = returnData.get("key2").getAsString();
    }
}

3 总结:
相应的文档以及aar包和需要的zip包下载地址:https://download.csdn.net/download/mintent/11422639
这里简单总结一下,因为我们的项目中是将我所介绍的推送全部整合在一起,为了方便使用,其中大多数的配置都是我们需要自己去手动操作,所以我介绍的稍详细了一些,如有不必清楚的地方可以与我互相讨论交流,邮箱地址:pw1305559621@163.com 谢谢!

©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值