华为推送官方文档
大概流程我就不在赘述了,主要说明一下接入过程成可能遇到的问题。
1.1 从官网下载到套件以后,解压文件后,你会看到这样的目录(copysrc是后面生成的,可以忽略)
1.2 执行GetHMSAgent.bat脚本,根据脚本提示以及自己需求,会生成copysrc文件夹
1.3 然后把copysrc里面的内容拷贝到自己项目里面按
1.4 在Application里面进行初始化
String manufacturer = android.os.Build.MANUFACTURER;
LogUtils.i(TAG, "手机厂商信息:" + manufacturer);
//华为推送
if ("huawei".equals(manufacturer.toLowerCase()) || "honor".equals(manufacturer.toLowerCase())) {
if (getHuaWeiEmui() >= 9) {
HMSAgent.init(this);
return;
}
}
/**
* EMUI版本号判断代码如下:(判断emuiApiLevel>=9即可)
*
* @return
*/
private int getHuaWeiEmui() {
int emuiApiLevel = 0;
try {
Class cls = Class.forName("android.os.SystemProperties");
Method method = cls.getDeclaredMethod("get", new Class[]{String.class});
emuiApiLevel = Integer.parseInt((String) method.invoke(cls, new Object[]{"ro.build.hw_emui_api_level"}));
} catch (Exception e) {
e.printStackTrace();
}
return emuiApiLevel;
}
2.1、在生成的copysrc文件夹下,已经帮你生成相关的manifest的配置信息了
2.2、如果是单点推送的话,可以指定推送目标的token,那这个token从哪里获取呢?这是就需要我们实现PushReceiver。同时还需要我们在Manifest里面进行配置
public class HuaWeiPushReceiver extends PushReceiver {
private static final String TAG=HuaWeiPushReceiver.class.getCanonicalName();
/**
* 供子类继承,用来接收token
*开发者自行实现Token保存逻辑。
* @param context 上下文信息
* @param token push token
* @param extras 附加信息
*/
@Override
public void onToken(Context context, String token, Bundle extras) {
super.onToken(context, token, extras);
LogUtils.i(TAG,"onToken:"+token);
PreferenceImpl.getPreference(context).put(CacheConstants.PUSH_REGISTER_ID,token);
}
}
3.1、从服务端在发送通知的配置字段说明,可以看到,点击通知后,支持三种行为(1、自定义;2、指定URL;3、APP首页),我们常用的是第一个,自定义。
3.1.1 自定义的话,就需要客户端生成intent内容
在客户端先执行下面的代码并打印出intentUri值,然后把生成的intentUri字符串给服务端即可。
Intent intent = new Intent();
intent.setClass(MainActivity.this, 要跳转的Activity);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("ext1","helloExt1");
intent.putExtra("ext2","helloExt2");
String intentUri = intent.toUri(Intent.URI_INTENT_SCHEME);
manifest中 在指定注册Activity的地方(就是ActivityA)加上。
此外需要加上android:launchMode="singleTask"来配合newIntent来使用反复接收Intent。
如果想让服务端携带缺省数据的话,就按照intentUri的格式,把缺省数据拼接到里面,客户端通过Intent即可获取到服务端携带的缺省数据。
intentUri格式:
intentUri:intent:#Intent;launchFlags=0x10000000;component=com.***.***/com.huawei.***. ActivityA;S.ext1=helloExt1;S.ext2=helloExt2;end
缺省数据可以使用S.key=value的方式拼接到intentUri
NotificationManager nm
=(NotificationManager)PushActivity.this.getSystemService(Context.NOTIFICATION_SERVICE);
nm.cancelAll();