# 小米
## 开启推送服务
1、登录小米开放平台->点击“管理控制台”->点击“消息推送”,若应用已经存在直接点击“启用推送”即可,若不存在则点击“创建应用”,如下图所示:

2、创建新应用,输入应用信息,应用包名是唯一的

3、开启消息推送服务

## 配置AndroidManifest文件
1、在lib包下面添加jar包,并在app目录下的build.gradle中添加依赖

2、在AndroidManifest文件中添加权限
```
```
3、在AndroidManifest文件中配置推送服务需要的service和receiver
```
```
## 应用开发
### 自定义一个BroadcastReceiver类
1、自定义一个BroadcastReceiver类的类名为DemoMessageReceiver。
2、DemoMessageReceiver类继承PushMessageReceiver类,
3、实现其中的onReceivePassThroughMessage,onNotificationMessageClicked,onNotificationMessageArrived,onCommandResult和onReceiveRegisterResult方法。
4、onReceivePassThroughMessage:接收服务器发送的透传消息
5、onNotificationMessageClicked:接收服务器发来的通知栏消息(用户点击通知栏时触发)
6、onNotificationMessageArrived:接收服务器发来的通知栏消息(消息到达客户端时触发,并且可以接收应用在前台时不弹出通知的通知消息)
7、onCommandResult:接收客户端向服务器发送命令消息后返回的响应
8、onReceiveRegisterResult:用来接受客户端向服务器发送注册命令消息后返回的响应
例如: 自定义的BroadcastReceiver
``` java
public class XMPushReceiver extends PushMessageReceiver {
private String mRegId;
private String mTopic;
private String mAlias;
private String mAccount;
private String mStartTime;
private String mEndTime;
@Override
public void onReceivePassThroughMessage(Context context, MiPushMessage message) {
//接收服务器推送的透传消息,消息封装在 MiPushMessage类中
AppSpLog.i("onReceivePassThroughMessage is called. " + message.toString());
if (!TextUtils.isEmpty(message.getTopic())) {
mTopic = message.getTopic();
} else if (!TextUtils.isEmpty(message.getAlias())) {
mAlias = message.getAlias();
} else if (!TextUtils.isEmpty(message.getUserAccount())) {
mAccount = message.getUserAccount();
}
}
@Override
public void onNotificationMessageClicked(Context context, MiPushMessage message) {
//接收服务器推送的通知消息,用户点击后触发,消息封装在 MiPushMessage类中
AppSpLog.i("onNotificationMessageClicked is called. " + message.toString());
if (!TextUtils.isEmpty(message.getTopic())) {
mTopic = message.getTopic();
} else if (!TextUtils.isEmpty(message.getAlias())) {
mAlias = message.getAlias();
} else if (!TextUtils.isEmpty(message.getUserAccount())) {
mAccount = message.getUserAccount();
}
//todo 点击通知栏消息,发送广播给打开自定义页面
Intent intent = new Intent();
intent.setAction("com.anji.plus.ajpushlibrary.PushMessageReceiver");
Bundle bundle = new Bundle();
NotificationMessageModel notificationMessageModel = new NotificationMessageModel();
notificationMessageModel.setTitle(message.getTitle());
notificationMessageModel.setContent(message.getContent());
JSONObject json = new JSONObject(message.getExtra());
notificationMessageModel.setNotificationExtras(json.toString());
notificationMessageModel.setMessageType(3);
bundle.putSerializable(AppParam.HNOTIFICATIONMESSAGE, notificationMessageModel);
intent.putExtras(bundle);
intent.setComponent(new ComponentName(AppParam.packageName, AppParam.packageName + ".PushMessageReceiver"));
context.sendBroadcast(intent);
}
@Override
public void onNotificationMessageArrived(Context context, MiPushMessage message) {
//接收服务器推送的通知消息,消息到达客户端时触发,还可以接受应用在前台时不弹出通知的通知消息,消息封装在 MiPushMessage类中
AppSpLog.i("onNotificationMessageArrived is called. " + message.toString());
if (!TextUtils.isEmpty(message.getTopic())) {
mTopic = message.getTopic();
} else if (!TextUtils.isEmpty(message.getAlias())) {
mAlias = message.getAlias();
} else if (!TextUtils.isEmpty(message.getUserAccount())) {
mAccount = message.getUserAccount();
}
}
@Override
public void onCommandResult(Context context, MiPushCommandMessage message) {
//获取给服务器发送命令的结果,结果封装在MiPushCommandMessage类中
AppSpLog.i("onCommandResult is called. " + message.toString());
String command = message.getCommand();
List 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_SET_ACCOUNT.equals(command)) {
if (message.getResultCode() == ErrorCode.SUCCESS) {
mAccount = cmdArg1;
}
} else if (MiPushClient.COMMAND_UNSET_ACCOUNT.equals(command)) {
if (message.getResultCode() == ErrorCode.SUCCESS) {
mAccount = 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) {
//获取给服务器发送注册命令的结果,结果封装在MiPushCommandMessage类中
AppSpLog.i("onReceiveRegisterResult is called. " + message.toString());
String command = message.getCommand();
List 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;
//收到regId之后,可以设置alias、userAccount、topic,将获取的token传给服务器
AppParam.pushToken = mRegId;
AppSpConfig.getInstance().sendRegTokenToServer(new IAppSpCallback() {
@Override
public void pushInfo(AppSpModel appSpModel) {
}
@Override
public void error(String code, String msg) {
}
});
}
}
}
}
```
### 注册推送服务
通过调用MiPushClient.registerPush来初始化小米推送服务。注册成功后,可以在自定义的onCommandResult和onReceiveRegisterResult中收到注册结果,其中的regId即是当前设备上当前app的唯一标示。可以将regId上传到自己的服务器,方便向其发消息
``` java
@Override
public void onCreate() {
super.onCreate();
//初始化push推送服务
if(shouldInit()) {
MiPushClient.registerPush(this, APP_ID, APP_KEY);
}
private boolean shouldInit() {
ActivityManager am = ((ActivityManager) getSystemService(Context.ACTIVITY_SERVICE));
List processInfos = am.getRunningAppProcesses();
String mainProcessName = getApplicationInfo().processName;
int myPid = Process.myPid();
for (RunningAppProcessInfo info : processInfos) {
if (info.pid == myPid && mainProcessName.equals(info.processName)) {
return true;
}
}
return false;
}
```
注意:
(1)因为推送服务XMPushService在AndroidManifest.xml中设置为运行在另外一个进程,这导致本Application会被实例化两次,所以我们需要让应用的主进程初始化
(2)在非MIUI平台下,如果targetSdkVersion>=23,需要动态申请电话和存储权限,请在申请权限后再调用注册接口,否则会注册失败。
### 点击通知栏打开自定义页面
1、在DemoMessageReceiver中的onNotificationMessageClicked()方法中,添加如下代码
``` java
try {
//打开自定义的Activity
Intent i = new Intent(context, Main3Activity.class);
Bundle bundle = new Bundle();
bundle.putString("XMContent", message.getContent());
i.putExtras(bundle);
context.startActivity(i);
} catch (Throwable throwable) {
}
```
2、在自定义界面中接收数据信息
``` java
private void getXMIntentData(Intent intent) {
TextView tv = new TextView(this);
tv.setText("用户自定义打开的Activity_XM");
if (null != intent) {
Bundle bundle = getIntent().getExtras();
String content = null;
if (bundle != null) {
content = bundle.getString("XMContent");
}
tv.setText("用户自定义打开的Activity_XM,Content : " + content);
}
addContentView(tv, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));
}
```
## 推送测试
1、点击“创建推送”,如下图所示:

2、添加推送消息内容,如下图所示:
