介绍

推送文档: https://dev.mi.com/console/doc/detail?pId=230  
控制台: http://admin.xmpush.xiaomi.com/v2/app/nav
SDK下载: https://dev.mi.com/mipush/downpage/
【17329910039】【 bqt中信账号】
小米相比极光等推送SDK的优势:
  • MIUI上系统级通道:在MIUI上系统级长连接,最大程度提高消息送达率
  • iOS/Android全平台支持:支持两大系统的推送服务,iOS开发者还可以将存量用户无缝迁移到小米推送中
  • 稳定 安全 高效:每秒百万级推送速度,亿级同时在线,99.8%的消息300毫秒内到达
  • 使用简单灵活:客户端0.5天集成,也可通过服务端API与业务逻辑相结合
  • 细致全面的统计工具:提供细致全面的统计工具,帮助开发者精准把握推送的使用情况
  • 自助调查工具:开发者可以自助查询设备与消息的送达/在线情况

FAQ

https://dev.mi.com/console/doc/detail?pId=283
https://dev.mi.com/console/doc/detail?pId=66
小米推送服务有哪些限制?
目前针对首批合作开发者,小米推送服务没有设置任何推送频率的使用限制,之后出于防止恶意应用攻击等考虑,可能会增加 对推送消息的频率、对单一用户可以接收的数量等做一些限制,但不会影响开发者的正常使用。而且所提供的推送服务完全免费。 对于单条消息,可携带的数据量最大 不能超过4KB。 
Android版推送中,多个app都使用推送时,他们会共享连接吗?
在最新MIUI上,会直接使用系统长连接通道, 所有app会和系统共享一个长连接;在其他rom上,目前没有共享连接。多通道的设计从通道安全性和流量计算上会更加合理,并且小米推送的多通道实现可以保证多条长连接对系统电量的影响和一条长连接基本相同。
什么是透传?
透传类推送是指开发者可选择不通过任何预定义的方式展现,由应用直接接收推送消息。利用透传消息,开发者可自定义更多使用推送的方式和展现形式,从而能更为灵活地使用消息推送通道。 在一些拥有应用启动管理功能的Android系统上(如MIUI),透传的实现需要应用在后台处于启动状态。 
透传和通知栏,在送达率上有什么分别?
  • 首先解释一下透传和通知栏方式的原理,透传是指当小米推送服务客户端SDK接收到消息之后,直接把消息通过回调方法发送给应用,不做任何处理;而通知栏方式,则在设备接收到消息之后,首先由小米推送服务SDK弹出标准安卓通知栏通知,在用户点击通知栏之后,激活应用。
  • 在非MIUI系统中,由于维护小米推送服务长连接的service是寄生在App的运行空间当中的,因此透传和通知栏方式在送达率上并没有任何区别,都需要应用驻留在后台。即,如果一台设备通知栏消息能够接收到并弹出,那么其透传消息也同样能接收到。
  • 在MIUI系统中,由于长连接是由MIUI系统服务建立并维护的,因此在接收消息的时候并不需要应用驻留后台。如果采用通知栏方式接收消息,由于通知栏也是MIUI系统服务弹出的,就可以做到不需要用户后台驻留或者可以自启动消息就能送达。而如果采用透传消息,由于需要直接执行应用的代码,因此即使消息已经到了系统服务,如果应用没有驻留后台或者能自启动,消息依然不能送达,需等下次用户手动点击激活应用后,才能接收到消息。
  • 综上,在MIUI系统中,通知栏消息的送达率会远高于透传方式;在非MIUI系统中,通知栏和透传方式的送达率是一样的。
使用推送服务demo没有成功是什么原因?
一般注册推送服务没成功,常见的原因如下: 
  • 1.没有开启推送服务。使用推送服务前需要登录开发者账号、创建应用、开通推送服务3个步骤,缺一不可。
  • 2.没有正确配置AndroidManifest.xml文件。需要特别注意包名、权限部分,包名需要跟开发者站点上开通推送服务的一致,权限的前缀需要改成包名。
  • 3.系统时间错误。由于小米推送服务需要使用https请求向服务器注册一个匿名账号,在次过程中如果系统时间错误,会引起https过期,导致注册不成功。
  • 4.联网被阻止。小米推送服务客户端需要使用5222和443两个端口,如果在公司内网,需要联系IT部门把这两个端口开放。同时需要检查应用的联网是否会被一些手机安全助手阻止。需要特别注意的是,在MIUI系统上,长连接是由“小米服务框架”这个系统应用维护的,因此需要确保这个应用的联网并没有被阻止。
如果我使用通知栏类型消息,能否在通知栏消息到达之前,先执行一段app的代码?或者在通知栏到达时,通知app?
在MIUI系统上,通知栏类型的消息,是不需要应用启动就能弹出的(这一特性决定了通知栏消息的弹出可以不受应用自启动管理的影响),因此在整个弹出通知栏消息的过程中,app是完全不可感知的,当用户点击通知栏消息之后,才会执行到app的代码。
为什么onNotificationMessageArrived方法没被调用到?
首先,确定你的接入是否正确,这个方法需要在manifest中添加 <action android:name=”com.xiaomi.mipush.MESSAGE_ARRIVED” /> 这个action。 在接入正确的前提下,这个方法也不是保证一定能被调用的。
在MIUI系统上,这个方法的调用需要同时满足如下两个条件:1.新版的MIUI。这个特性是在2015年才加进小米推送服务的,因此需要MIUI升级到较新的版本才能调用这个方法。2.需要应用驻留后台。小米推送服务的通知栏消息,是可以在应用不启动的前提下,就弹出通知栏消息的,在这种情况下, 由于MIUI的自启动管理,限制了应用不能在被杀后被后台唤醒,所以推送消息不能直接唤醒应用执行这个方法。
为什么我在onNotificationMessageClicked方法中的startActivity不能调起目标界面?
由于onNotificationMessageClicked中传入的context是application context,本身没有activity栈,因此需要在创建activity时候加入NEW_TASK的flag: 
Intent i = new Intent(context, MyActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
3
3

1
Intent i = new Intent(context, MyActivity.class); 

2
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

3
context.startActivity(i);

当我的应用被杀掉之后,还能否接收到小米推送服务的消息?
有如下几种情况:如果是在MIUI系统中,使用通知栏类型的消息,是不需要应用出于启动状态就能接收并弹出通知栏的。使用透传消息,则需要应用驻留后台才能接收,由于MIUI的自启动管理限制,所以如果应用被杀,是收不到透传消息的。而如果是在非MIUI系统中,是需要应用驻留后台才能接收消息的,因此如果应用被杀死并且不能后台自启动的话,是没有办法接收消息的。为了让app尽可能的驻留后台,小米推送服务SDK监听了网络变化等系统事件,并且有应用之间的互相唤醒,但这些措施并不能保证应用可以一直在后台驻留。

简洁版自定义消息推送Demo

在适当的时候初始化
private void initMiPush() {String APP_ID = "1000270";String APP_KEY = "670100056270";// 注册push服务,注册成功后会向Receiver发送广播,可以从onCommandResult方法中的参数中获取注册信息if (PushUtil.shouldInitMiPush(this)) {MiPushClient.registerPush(this, APP_ID, APP_KEY);}
}
9
9

1
private void initMiPush() {

2
    String APP_ID = "1000270";

3
    String APP_KEY = "670100056270";

4
    

5
    // 注册push服务,注册成功后会向Receiver发送广播,可以从onCommandResult方法中的参数中获取注册信息

6
    if (PushUtil.shouldInitMiPush(this)) {

7
        MiPushClient.registerPush(this, APP_ID, APP_KEY);

8
    }

9
}

public static boolean shouldInitMiPush(Context context) {ActivityManager am = ((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE));if (am != null) {List<ActivityManager.RunningAppProcessInfo> processInfos = am.getRunningAppProcesses();String mainProcessName = context.getPackageName();int myPid = Process.myPid();for (ActivityManager.RunningAppProcessInfo info : processInfos) {if (info.pid == myPid && mainProcessName.equals(info.processName)) {return true;}}}return false;
}
14
14

1
public static boolean shouldInitMiPush(Context context) {

2
    ActivityManager am = ((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE));

3
    if (am != null) {

4
        List<ActivityManager.RunningAppProcessInfo> processInfos = am.getRunningAppProcesses();

5
        String mainProcessName = context.getPackageName();

6
        int myPid = Process.myPid();

7
        for (ActivityManager.RunningAppProcessInfo info : processInfos) {

8
            if (info.pid == myPid && mainProcessName.equals(info.processName)) {

9
                return true;

10
            }

11
        }

12
    }

13
    return false;

14
}

Activity

/*** 1、设置 topic 和 alias。 服务器端使用 appsecret 即可以向demo发送广播和单点的消息。<br/>* 2、为了修改本 demo 为使用你自己的 appid,你需要修改几个地方:Application中的 APP_ID 和 APP_KEY*      AndroidManifest.xml 中的 packagename,和权限 permission.MIPUSH_RECEIVE 的前缀为你的 packagename。*/
public class MiPushTestActivity extends ListActivity {public static boolean isForeground = false;protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);String[] array = {"设置别名","撤销别名","设置帐号","撤销帐号","设置标签","撤销标签","设置接收消息时间","暂停推送","重新开始推送",};setListAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, new ArrayList<>(Arrays.asList(array))));}@Overrideprotected void onResume() {isForeground = true;super.onResume();}@Overrideprotected void onPause() {isForeground = false;super.onPause();}@Overrideprotected void onListItemClick(ListView l, View v, int position, long id) {switch (position) {case 0:set_alias();break;case 1:unset_alias();break;case 2:set_account();break;case 3:unset_account();break;case 4:subscribe_topic();break;case 5:unsubscribe_topic();break;case 6:int startHour = 10;int startMin = 0;int endHour = 23;int endMin = 0;MiPushClient.setAcceptTime(this, startHour, startMin, endHour, endMin, null);break;case 7:MiPushClient.pausePush(this, null);break;case 8:MiPushClient.resumePush(this, null);break;}}public void set_alias() {final EditText editText = new EditText(this);new AlertDialog.Builder(this).setTitle("设置别名").setView(editText).setPositiveButton("确认", (dialog, which) -> {String alias = editText.getText().toString();MiPushClient.setAlias(this, alias, null);}).setNegativeButton("取消", null).show();}public void unset_alias() {final EditText editText = new EditText(this);new AlertDialog.Builder(this).setTitle("撤销别名").setView(editText).setPositiveButton("确认", (dialog, which) -> {String alias = editText.getText().toString();MiPushClient.unsetAlias(this, alias, null);}).setNegativeButton("取消", null).show();}public void set_account() {final EditText editText = new EditText(this);new AlertDialog.Builder(this).setTitle("设置帐号").setView(editText).setPositiveButton("确认", (dialog, which) -> {String account = editText.getText().toString();MiPushClient.setUserAccount(this, account, null);}).setNegativeButton("取消", null).show();}public void unset_account() {final EditText editText = new EditText(this);new AlertDialog.Builder(this).setTitle("撤销帐号").setView(editText).setPositiveButton("确认", (dialog, which) -> {String account = editText.getText().toString();MiPushClient.unsetUserAccount(this, account, null);}).setNegativeButton("取消", null).show();}public void subscribe_topic() {final EditText editText = new EditText(this);new AlertDialog.Builder(this).setTitle("设置标签").setView(editText).setPositiveButton("确认", (dialog, which) -> {String topic = editText.getText().toString();MiPushClient.subscribe(this, topic, null);}).setNegativeButton("取消", null).show();}public void unsubscribe_topic() {final EditText editText = new EditText(this);new AlertDialog.Builder(this).setTitle("撤销标签").setView(editText).setPositiveButton("确认", (dialog, which) -> {String topic = editText.getText().toString();MiPushClient.unsubscribe(this, topic, null);}).setNegativeButton("取消", null).show();}@Subscribe(threadMode = ThreadMode.MAIN)public void onPushEvent(BasePushBean bean) {TextView tv = new TextView(this);tv.setTextColor(Color.BLUE);tv.setText(bean.msg);getListView().addFooterView(tv);}
}
161
161

1
/**

2
 * 1、设置 topic 和 alias。 服务器端使用 appsecret 即可以向demo发送广播和单点的消息。<br/>

3
 * 2、为了修改本 demo 为使用你自己的 appid,你需要修改几个地方:Application中的 APP_ID 和 APP_KEY

4
 *      AndroidManifest.xml 中的 packagename,和权限 permission.MIPUSH_RECEIVE 的前缀为你的 packagename。

5
 */

6
public class MiPushTestActivity extends ListActivity {

7
    

8
    public static boolean isForeground = false;

9
    

10
    protected void onCreate(Bundle savedInstanceState) {

11
        super.onCreate(savedInstanceState);

12
        String[] array = {"设置别名",

13
                "撤销别名",

14
                "设置帐号",

15
                "撤销帐号",

16
                "设置标签",

17
                

18
                "撤销标签",

19
                "设置接收消息时间",

20
                "暂停推送",

21
                "重新开始推送",};

22
        setListAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, new ArrayList<>(Arrays.asList(array))));

23
    }

24
    

25
    @Override

26
    protected void onResume() {

27
        isForeground = true;

28
        super.onResume();

29
    }

30
    

31
    @Override

32
    protected void onPause() {

33
        isForeground = false;

34
        super.onPause();

35
    }

36
    

37
    @Override

38
    protected void onListItemClick(ListView l, View v, int position, long id) {

39
        switch (position) {

40
            case 0:

41
                set_alias();

42
                break;

43
            case 1:

44
                unset_alias();

45
                break;

46
            case 2:

47
                set_account();

48
                break;

49
            case 3:

50
                unset_account();

51
                break;

52
            case 4:

53
                subscribe_topic();

54
                break;

55
            case 5:

56
                unsubscribe_topic();

57
                break;

58
            case 6:

59
                int startHour = 10;

60
                int startMin = 0;

61
                int endHour = 23;

62
                int endMin = 0;

63
                MiPushClient.setAcceptTime(this, startHour, startMin, endHour, endMin, null);

64
                break;

65
            case 7:

66
                MiPushClient.pausePush(this, null);

67
                break;

68
            case 8:

69
                MiPushClient.resumePush(this, null);

70
                break;

71
        }

72
    }

73
    

74
    public void set_alias() {

75
        final EditText editText = new EditText(this);

76
        new AlertDialog.Builder(this)

77
                .setTitle("设置别名")

78
                .setView(editText)

79
                .setPositiveButton("确认", (dialog, which) -> {

80
                    String alias = editText.getText().toString();

81
                    MiPushClient.setAlias(this, alias, null);

82
                })

83
                .setNegativeButton("取消", null)

84
                .show();

85
    }

86
    

87
    public void unset_alias() {

88
        final EditText editText = new EditText(this);

89
        new AlertDialog.Builder(this)

90
                .setTitle("撤销别名")

91
                .setView(editText)

92
                .setPositiveButton("确认", (dialog, which) -> {

93
                    String alias = editText.getText().toString();

94
                    MiPushClient.unsetAlias(this, alias, null);

95
                })

96
                .setNegativeButton("取消", null)

97
                .show();

98
        

99
    }

100
    

101
    public void set_account() {

102
        final EditText editText = new EditText(this);

103
        new AlertDialog.Builder(this)

104
                .setTitle("设置帐号")

105
                .setView(editText)

106
                .setPositiveButton("确认", (dialog, which) -> {

107
                    String account = editText.getText().toString();

108
                    MiPushClient.setUserAccount(this, account, null);

109
                })

110
                .setNegativeButton("取消", null)

111
                .show();

112
        

113
    }

114
    

115
    public void unset_account() {

116
        final EditText editText = new EditText(this);

117
        new AlertDialog.Builder(this)

118
                .setTitle("撤销帐号")

119
                .setView(editText)

120
                .setPositiveButton("确认", (dialog, which) -> {

121
                    String account = editText.getText().toString();

122
                    MiPushClient.unsetUserAccount(this, account, null);

123
                })

124
                .setNegativeButton("取消", null)

125
                .show();

126
    }

127
    

128
    public void subscribe_topic() {

129
        final EditText editText = new EditText(this);

130
        new AlertDialog.Builder(this)

131
                .setTitle("设置标签")

132
                .setView(editText)

133
                .setPositiveButton("确认", (dialog, which) -> {

134
                    String topic = editText.getText().toString();

135
                    MiPushClient.subscribe(this, topic, null);

136
                })

137
                .setNegativeButton("取消", null)

138
                .show();

139
    }

140
    

141
    public void unsubscribe_topic() {

142
        final EditText editText = new EditText(this);

143
        new AlertDialog.Builder(this)

144
                .setTitle("撤销标签")

145
                .setView(editText)

146
                .setPositiveButton("确认", (dialog, which) -> {

147
                    String topic = editText.getText().toString();

148
                    MiPushClient.unsubscribe(this, topic, null);

149
                })

150
                .setNegativeButton("取消", null)

151
                .show();

152
    }

153
    

154
    @Subscribe(threadMode = ThreadMode.MAIN)

155
    public void onPushEvent(BasePushBean bean) {

156
        TextView tv = new TextView(this);

157
        tv.setTextColor(Color.BLUE);

158
        tv.setText(bean.msg);

159
        getListView().addFooterView(tv);

160
    }

161
}

Receiver

/*** 注意,重写的这些方法都运行在非 UI 线程中*/
public class MiPushReceiver extends PushMessageReceiver {@Override/*用来接收服务器向客户端发送的透传消息*/public void onReceivePassThroughMessage(Context context, MiPushMessage message) {if (message == null) return;Log.i("bqt", "【onReceivePassThroughMessage】" + message.toString());printMsg(message);new Handler(Looper.getMainLooper()).post(() -> PushMsgReceiverHelper.getInstance().onMiPushMsgReceiver(message));}@Override/*用来接收服务器向客户端发送的通知消息,这个回调方法会在用户手动点击通知后触发*/public void onNotificationMessageClicked(Context context, MiPushMessage message) {Log.i("bqt", "【onNotificationMessageClicked】" + message.toString());printMsg(message);}@Override/*用来接收服务器向客户端发送的通知消息,这个回调方法是在通知消息到达客户端时触发。另外应用在前台时不弹出通知的通知消息到达客户端也会触发这个回调函数。*/public void onNotificationMessageArrived(Context context, MiPushMessage message) {Log.i("bqt", "【onNotificationMessageArrived】" + message.toString());printMsg(message);}@Override/*用来接收客户端向服务器发送命令后的响应结果*/public void onCommandResult(Context context, MiPushCommandMessage message) {Log.i("bqt", "【onCommandResult】" + message.toString());printCmdMsg(message);}@Override/*用来接收客户端向服务器发送注册命令后的响应结果*/public void onReceiveRegisterResult(Context context, MiPushCommandMessage message) {Log.i("bqt", "【onReceiveRegisterResult】" + message.toString());String command = message.getCommand();List<String> arguments = message.getCommandArguments();String cmdArg1 = ((arguments != null && arguments.size() > 0) ? arguments.get(0) : null);Log.i("bqt", "command=" + command + "  " + cmdArg1);}private void printMsg(MiPushMessage message) {String topic = message.getTopic();String alias = message.getAlias();String content = message.getContent();Log.i("bqt", "topic=" + topic + "  alias=" + alias + "  content=" + content);}private void printCmdMsg(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);Log.i("bqt", "command=" + command + "  " + cmdArg1 + "  " + cmdArg2);switch (command) {case MiPushClient.COMMAND_REGISTER://注册if (message.getResultCode() == ErrorCode.SUCCESS) {Log.i("bqt", "注册成功 mRegId =" + cmdArg1);}break;case MiPushClient.COMMAND_SET_ALIAS://设置别名if (message.getResultCode() == ErrorCode.SUCCESS) {Log.i("bqt", "设置别名成功 mAlias =" + cmdArg1);}break;case MiPushClient.COMMAND_UNSET_ALIAS://取消设置别名if (message.getResultCode() == ErrorCode.SUCCESS) {Log.i("bqt", "取消设置别名成功 mAlias =" + cmdArg1);}break;case MiPushClient.COMMAND_SET_ACCOUNT://设置账户if (message.getResultCode() == ErrorCode.SUCCESS) {Log.i("bqt", "设置账户成功 mAccount =" + cmdArg1);}break;case MiPushClient.COMMAND_UNSET_ACCOUNT://撤销账户if (message.getResultCode() == ErrorCode.SUCCESS) {Log.i("bqt", "撤销账户成功 mAccount =" + cmdArg1);}break;case MiPushClient.COMMAND_SUBSCRIBE_TOPIC://订阅标签if (message.getResultCode() == ErrorCode.SUCCESS) {Log.i("bqt", "订阅标签成功 mTopic =" + cmdArg1);}break;case MiPushClient.COMMAND_UNSUBSCRIBE_TOPIC://撤销标签if (message.getResultCode() == ErrorCode.SUCCESS) {Log.i("bqt", "撤销标签成功 mTopic =" + cmdArg1);}break;case MiPushClient.COMMAND_SET_ACCEPT_TIME://设置接收推送时间if (message.getResultCode() == ErrorCode.SUCCESS) {Log.i("bqt", "设置接收推送时间成功 mStartTime =" + cmdArg1 + "  mEndTime=" + cmdArg2);}break;default:Log.i("bqt", "未知命令,Reason=" + message.getReason());break;}}
}
107
107

1
/**

2
 * 注意,重写的这些方法都运行在非 UI 线程中

3
 */

4
public class MiPushReceiver extends PushMessageReceiver {

5
    

6
    @Override

7
    /*用来接收服务器向客户端发送的透传消息*/

8
    public void onReceivePassThroughMessage(Context context, MiPushMessage message) {

9
        if (message == null) return;

10
        Log.i("bqt", "【onReceivePassThroughMessage】" + message.toString());

11
        printMsg(message);

12
        new Handler(Looper.getMainLooper()).post(() -> PushMsgReceiverHelper.getInstance().onMiPushMsgReceiver(message));

13
    }

14
    

15
    @Override

16
    /*用来接收服务器向客户端发送的通知消息,这个回调方法会在用户手动点击通知后触发*/

17
    public void onNotificationMessageClicked(Context context, MiPushMessage message) {

18
        Log.i("bqt", "【onNotificationMessageClicked】" + message.toString());

19
        printMsg(message);

20
    }

21
    

22
    @Override

23
    /*用来接收服务器向客户端发送的通知消息,这个回调方法是在通知消息到达客户端时触发。

24
    另外应用在前台时不弹出通知的通知消息到达客户端也会触发这个回调函数。*/

25
    public void onNotificationMessageArrived(Context context, MiPushMessage message) {

26
        Log.i("bqt", "【onNotificationMessageArrived】" + message.toString());

27
        printMsg(message);

28
    }

29
    

30
    @Override

31
    /*用来接收客户端向服务器发送命令后的响应结果*/

32
    public void onCommandResult(Context context, MiPushCommandMessage message) {

33
        Log.i("bqt", "【onCommandResult】" + message.toString());

34
        printCmdMsg(message);

35
    }

36
    

37
    @Override

38
    /*用来接收客户端向服务器发送注册命令后的响应结果*/

39
    public void onReceiveRegisterResult(Context context, MiPushCommandMessage message) {

40
        Log.i("bqt", "【onReceiveRegisterResult】" + message.toString());

41
        String command = message.getCommand();

42
        List<String> arguments = message.getCommandArguments();

43
        String cmdArg1 = ((arguments != null && arguments.size() > 0) ? arguments.get(0) : null);

44
        Log.i("bqt", "command=" + command + "  " + cmdArg1);

45
    }

46
    

47
    private void printMsg(MiPushMessage message) {

48
        String topic = message.getTopic();

49
        String alias = message.getAlias();

50
        String content = message.getContent();

51
        Log.i("bqt", "topic=" + topic + "  alias=" + alias + "  content=" + content);

52
    }

53
    

54
    private void printCmdMsg(MiPushCommandMessage message) {

55
        String command = message.getCommand();

56
        List<String> arguments = message.getCommandArguments();

57
        String cmdArg1 = ((arguments != null && arguments.size() > 0) ? arguments.get(0) : null);

58
        String cmdArg2 = ((arguments != null && arguments.size() > 1) ? arguments.get(1) : null);

59
        Log.i("bqt", "command=" + command + "  " + cmdArg1 + "  " + cmdArg2);

60
        

61
        switch (command) {

62
            case MiPushClient.COMMAND_REGISTER://注册

63
                if (message.getResultCode() == ErrorCode.SUCCESS) {

64
                    Log.i("bqt", "注册成功 mRegId =" + cmdArg1);

65
                }

66
                break;

67
            case MiPushClient.COMMAND_SET_ALIAS://设置别名

68
                if (message.getResultCode() == ErrorCode.SUCCESS) {

69
                    Log.i("bqt", "设置别名成功 mAlias =" + cmdArg1);

70
                }

71
                break;

72
            case MiPushClient.COMMAND_UNSET_ALIAS://取消设置别名

73
                if (message.getResultCode() == ErrorCode.SUCCESS) {

74
                    Log.i("bqt", "取消设置别名成功 mAlias =" + cmdArg1);

75
                }

76
                break;

77
            case MiPushClient.COMMAND_SET_ACCOUNT://设置账户

78
                if (message.getResultCode() == ErrorCode.SUCCESS) {

79
                    Log.i("bqt", "设置账户成功 mAccount =" + cmdArg1);

80
                }

81
                break;

82
            case MiPushClient.COMMAND_UNSET_ACCOUNT://撤销账户

83
                if (message.getResultCode() == ErrorCode.SUCCESS) {

84
                    Log.i("bqt", "撤销账户成功 mAccount =" + cmdArg1);

85
                }

86
                break;

87
            case MiPushClient.COMMAND_SUBSCRIBE_TOPIC://订阅标签

88
                if (message.getResultCode() == ErrorCode.SUCCESS) {

89
                    Log.i("bqt", "订阅标签成功 mTopic =" + cmdArg1);

90
                }

91
                break;

92
            case MiPushClient.COMMAND_UNSUBSCRIBE_TOPIC://撤销标签

93
                if (message.getResultCode() == ErrorCode.SUCCESS) {

94
                    Log.i("bqt", "撤销标签成功 mTopic =" + cmdArg1);

95
                }

96
                break;

97
            case MiPushClient.COMMAND_SET_ACCEPT_TIME://设置接收推送时间

98
                if (message.getResultCode() == ErrorCode.SUCCESS) {

99
                    Log.i("bqt", "设置接收推送时间成功 mStartTime =" + cmdArg1 + "  mEndTime=" + cmdArg2);

100
                }

101
                break;

102
            default:

103
                Log.i("bqt", "未知命令,Reason=" + message.getReason());

104
                break;

105
        }

106
    }

107
}

消息处理类

/*** 处理推送SDK推过来的自定义消息(又叫应用内消息,或者透传消息)*/
public class PushMsgReceiverHelper {private static PushMsgReceiverHelper instance = new PushMsgReceiverHelper();private PushMsgReceiverHelper() {}public static PushMsgReceiverHelper getInstance() {return instance;}/*** 处理极光推送推过来的自定义消息*/public void onJPushMsgReceiver(Bundle bundle) {}/*** 处理小米推送推过来的自定义消息*/public void onMiPushMsgReceiver(MiPushMessage message) {Log.i("bqt", "【小米推送】" + message);if (MiPushTestActivity.isForeground) {EventBus.getDefault().post(new BasePushBean(message.getContent(), BasePushBean.TYPE_STRING));}}/*** 处理华为光推送推过来的自定义消息*/public void onHuaweiPushMsgReceiver(String message) {}/*** 处理魅族推送推过来的自定义消息*/public void onMeiZhuPushMsgReceiver(String message) {}}
42
42

1
/**

2
 * 处理推送SDK推过来的自定义消息(又叫应用内消息,或者透传消息)

3
 */

4
public class PushMsgReceiverHelper {

5
    private static PushMsgReceiverHelper instance = new PushMsgReceiverHelper();

6
    

7
    private PushMsgReceiverHelper() {

8
    }

9
    

10
    public static PushMsgReceiverHelper getInstance() {

11
        return instance;

12
    }

13
    

14
    /**

15
     * 处理极光推送推过来的自定义消息

16
     */

17
    public void onJPushMsgReceiver(Bundle bundle) {

18
    }

19
    

20
    /**

21
     * 处理小米推送推过来的自定义消息

22
     */

23
    public void onMiPushMsgReceiver(MiPushMessage message) {

24
        Log.i("bqt", "【小米推送】" + message);

25
        if (MiPushTestActivity.isForeground) {

26
            EventBus.getDefault().post(new BasePushBean(message.getContent(), BasePushBean.TYPE_STRING));

27
        }

28
    }

29
    

30
    /**

31
     * 处理华为光推送推过来的自定义消息

32
     */

33
    public void onHuaweiPushMsgReceiver(String message) {

34
    }

35
    

36
    /**

37
     * 处理魅族推送推过来的自定义消息

38
     */

39
    public void onMeiZhuPushMsgReceiver(String message) {

40
    }

41
    

42
}

配置文件

build.gradle
implementation files('libs/MiPush_SDK_Client_3_6_2.jar')
1
1

1
implementation files('libs/MiPush_SDK_Client_3_6_2.jar')

混淆文件:proguard-android.txt
client sdk已经混淆过了,不需要再混淆。请使用keep命令保留client sdk的内容:
#这里com.bqt.push.DemoMessageRreceiver改成app中定义的完整类名
-keep class com.bqt.push.receiver.MiPushReceiver {*;}
#可以防止一个误报的 warning 导致无法成功编译,如果编译使用的 Android 版本是 23。
-dontwarn com.xiaomi.push.**
x

1
#这里com.bqt.push.DemoMessageRreceiver改成app中定义的完整类名

2
-keep class com.bqt.push.receiver.MiPushReceiver {*;}

3
#可以防止一个误报的 warning 导致无法成功编译,如果编译使用的 Android 版本是 23。

4
-dontwarn com.xiaomi.push.**

AndroidManifest.xml

    <!--====================== 推送SDK需要定义的权限【需要更改包名】 =====================--><!--极光--><!--小米--><permissionandroid:name="com.bqt.push.permission.MIPUSH_RECEIVE"android:protectionLevel="signature"/><uses-permission android:name="com.bqt.push.permission.MIPUSH_RECEIVE"/><!--华为--><!--魅族-->
com.bqt.push.
x

1
    <!--====================== 推送SDK需要定义的权限【需要更改包名】 =====================-->

2
    <!--极光-->

3
    <!--小米-->

4
    <permission

5
        android:name="com.bqt.push.permission.MIPUSH_RECEIVE"

6
        android:protectionLevel="signature"/>

7
    <uses-permission android:name="com.bqt.push.permission.MIPUSH_RECEIVE"/>

8
    <!--华为-->

9
    <!--魅族-->

<!--========================= 小米推送需要注册的组件 start =========================--><receiverandroid:name=".receiver.MiPushReceiver"android:exported="true"tools:ignore="ExportedReceiver"><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><receiverandroid:name="com.xiaomi.push.service.receivers.NetworkStatusReceiver"android:exported="true"><intent-filter><actionandroid:name="android.net.conn.CONNECTIVITY_CHANGE"tools:ignore="BatteryLife"/><category android:name="android.intent.category.DEFAULT"/></intent-filter></receiver><receiverandroid: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><serviceandroid:name="com.xiaomi.push.service.XMJobService"android:enabled="true"android:exported="false"android:permission="android.permission.BIND_JOB_SERVICE"android:process=":pushservice"/><serviceandroid:name="com.xiaomi.push.service.XMPushService"android:enabled="true"android:process=":pushservice"/><serviceandroid:name="com.xiaomi.mipush.sdk.PushMessageHandler"android:enabled="true"android:exported="true"tools:ignore="ExportedService"/><serviceandroid:name="com.xiaomi.mipush.sdk.MessageHandleService"android:enabled="true"/><!--========================= 小米推送需要注册的组件 end =========================-->
.receiver.MiPushReceiver
x

1
<!--========================= 小米推送需要注册的组件 start =========================-->

2
        <receiver

3
            android:name=".receiver.MiPushReceiver"

4
            android:exported="true"

5
            tools:ignore="ExportedReceiver">

6
            <intent-filter>

7
                <action android:name="com.xiaomi.mipush.RECEIVE_MESSAGE"/>

8
            </intent-filter>

9
            <intent-filter>

10
                <action android:name="com.xiaomi.mipush.MESSAGE_ARRIVED"/>

11
            </intent-filter>

12
            <intent-filter>

13
                <action android:name="com.xiaomi.mipush.ERROR"/>

14
            </intent-filter>

15
        </receiver>

16
17
        <receiver

18
            android:name="com.xiaomi.push.service.receivers.NetworkStatusReceiver"

19
            android:exported="true">

20
            <intent-filter>

21
                <action

22
                    android:name="android.net.conn.CONNECTIVITY_CHANGE"

23
                    tools:ignore="BatteryLife"/>

24
                <category android:name="android.intent.category.DEFAULT"/>

25
            </intent-filter>

26
        </receiver>

27
28
        <receiver

29
            android:name="com.xiaomi.push.service.receivers.PingReceiver"

30
            android:exported="false"

31
            android:process=":pushservice">

32
            <intent-filter>

33
                <action android:name="com.xiaomi.push.PING_TIMER"/>

34
            </intent-filter>

35
        </receiver>

36
37
        <service

38
            android:name="com.xiaomi.push.service.XMJobService"

39
            android:enabled="true"

40
            android:exported="false"

41
            android:permission="android.permission.BIND_JOB_SERVICE"

42
            android:process=":pushservice"/>

43
        <service

44
            android:name="com.xiaomi.push.service.XMPushService"

45
            android:enabled="true"

46
            android:process=":pushservice"/>

47
        <service

48
            android:name="com.xiaomi.mipush.sdk.PushMessageHandler"

49
            android:enabled="true"

50
            android:exported="true"

51
            tools:ignore="ExportedService"/>

52
        <service

53
            android:name="com.xiaomi.mipush.sdk.MessageHandleService"

54
            android:enabled="true"/>

55
        <!--========================= 小米推送需要注册的组件 end =========================-->

2018-4-18

小米推送 简介 集成相关推荐

  1. 华为推送 简介 集成 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  2. Android 集成华为推送,集成小米推送,集成OPPO推送,集成vivo推送

    最近有时间在我们的应用中集成了华为,小米,OPPO,vivo四大平台的推送,一切顺利. 这里做一个记录, 开撸: 一.华为推送 1.下载HMS Agent套件,解压如下: 找到GetHMSAgent_ ...

  3. 华为推送 简介 集成

    账号[谢总@asp.citic.com][icitic52818888] 应用包名:com.bqt.push APP ID:100257971 文档: http://developer.huawei. ...

  4. 小米推送 java demo_XiaomiPushDemo【小米推送集成,基于V3.6.12版本】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 这个Demo只是记录小米推送的集成,不能运行. 使用步骤 一.项目组织结构图 注意事项: 1.  导入类文件后需要change包名以 ...

  5. Android 集成小米推送功能教程

    1.前言 现在好多手机都有APP推送功能,也有好多第三方的SDK,那为什么还要集成只有小米手机好使的"小米推送"呢?因为在小米手机中,小米推送是"系统级通道", ...

  6. android 小米推送 no account,XiaomiPushDemo【小米推送集成,基于V3.6.12版本】

    前言 这个Demo只是记录小米推送的集成,不能运行.使用步骤 一.项目组织结构图 注意事项: 1.  导入类文件后需要change包名以及重新import R文件路径 2.  Values目录下的文件 ...

  7. Android开发之推送服务(二) 集成小米推送

    小米推送主要是用来适配小米手机的.所以,在做的时候,一般会判断当前手机是否是小米手机,如果是小米手机,则去使用小米推送,注册小米推送,如果不是,则默认使用Umeng推送. 在集成小米推送之前,需要先注 ...

  8. Android消息推送:手把手教你集成小米推送

    <script type="text/javascript" src="http://static.blog.csdn.net/scripts/category.j ...

  9. 友盟小米收不到推送消息_一个轻量级、可插拔的Android消息推送框架。一键集成推送(极光推送、友盟推送、华为、小米推送等)...

    XPush 一个轻量级.可插拔的Android消息推送框架.一键集成推送(极光推送.友盟推送.华为.小米推送等),提供有效的保活机制,支持推送的拓展,充分解耦推送和业务逻辑,解放你的双手! 在提iss ...

最新文章

  1. 【书籍下载链接】_2_第二轮_计算机专业书籍
  2. Kaldi aishell 200h小时训练问题集合
  3. 现宣布Windows Azure中SQL数据同步的增强功能
  4. Docker学习总结(6)——通过 Docker 化一个博客网站来开启我们的 Docker 之旅
  5. linux 蓝牙编程,实战Linux Bluetooth编程(三) HCI层编程
  6. iOS后台运行的设置方法
  7. 巴菲特的价值投资的第二版本
  8. Spring事务嵌套引发的问题--Transaction rolled back because it has been marked as rollback-only...
  9. MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践
  10. 20220202--CTF刷题MISC方向--第5题--反编译
  11. 每日一问:Android 滑动冲突,你们都是怎样处理的
  12. revit如何根据坐标进行画线_在工程设计中如何根据工艺阀门的结构与特点来进行设计呢?...
  13. Vue学习笔记:创建一个Vue实例
  14. codevs1018 单词接龙(DFS)
  15. Python排序算法[二]:测试数据的迷雾散去
  16. 【整数转字符串】LeetCode 9. Palindrome Number
  17. 学习Java,真的可以月薪过万嘛?真实个人经历告诉你,记录了平时学习的内容以及学习过程中最真实的感受(二)
  18. 计算机组装主板,组装电脑如何选择合适的主板 组装电脑选择合适主板介绍【详解】...
  19. FusionChartsFree参数说明
  20. 项目经理应该具备的四种能力

热门文章

  1. ffmpeg剪辑小试试
  2. Spring-spring
  3. 为何新能源汽车用户在寒风中哀嚎?
  4. 无线传感器网络标准化与协议分析
  5. Mybatis中oracle、mysql、db2、sql server的like模糊查询
  6. asp.net员工考勤管理系统案例
  7. java中如何获取字符的ASCII码
  8. 在vue项目或者react项目中实现图形验证码功能
  9. 《数字时代数据抓取类不正当竞争纠纷的司法裁判检视》——孙晋、冯涛
  10. Graveyard Design