小米推送 简介 集成
介绍
- MIUI上系统级通道:在MIUI上系统级长连接,最大程度提高消息送达率
- iOS/Android全平台支持:支持两大系统的推送服务,iOS开发者还可以将存量用户无缝迁移到小米推送中
- 稳定 安全 高效:每秒百万级推送速度,亿级同时在线,99.8%的消息300毫秒内到达
- 使用简单灵活:客户端0.5天集成,也可通过服务端API与业务逻辑相结合
- 细致全面的统计工具:提供细致全面的统计工具,帮助开发者精准把握推送的使用情况
- 自助调查工具:开发者可以自助查询设备与消息的送达/在线情况
FAQ
- 首先解释一下透传和通知栏方式的原理,透传是指当小米推送服务客户端SDK接收到消息之后,直接把消息通过回调方法发送给应用,不做任何处理;而通知栏方式,则在设备接收到消息之后,首先由小米推送服务SDK弹出标准安卓通知栏通知,在用户点击通知栏之后,激活应用。
- 在非MIUI系统中,由于维护小米推送服务长连接的service是寄生在App的运行空间当中的,因此透传和通知栏方式在送达率上并没有任何区别,都需要应用驻留在后台。即,如果一台设备通知栏消息能够接收到并弹出,那么其透传消息也同样能接收到。
- 在MIUI系统中,由于长连接是由MIUI系统服务建立并维护的,因此在接收消息的时候并不需要应用驻留后台。如果采用通知栏方式接收消息,由于通知栏也是MIUI系统服务弹出的,就可以做到不需要用户后台驻留或者可以自启动消息就能送达。而如果采用透传消息,由于需要直接执行应用的代码,因此即使消息已经到了系统服务,如果应用没有驻留后台或者能自启动,消息依然不能送达,需等下次用户手动点击激活应用后,才能接收到消息。
- 综上,在MIUI系统中,通知栏消息的送达率会远高于透传方式;在非MIUI系统中,通知栏和透传方式的送达率是一样的。
- 1.没有开启推送服务。使用推送服务前需要登录开发者账号、创建应用、开通推送服务3个步骤,缺一不可。
- 2.没有正确配置AndroidManifest.xml文件。需要特别注意包名、权限部分,包名需要跟开发者站点上开通推送服务的一致,权限的前缀需要改成包名。
- 3.系统时间错误。由于小米推送服务需要使用https请求向服务器注册一个匿名账号,在次过程中如果系统时间错误,会引起https过期,导致注册不成功。
- 4.联网被阻止。小米推送服务客户端需要使用5222和443两个端口,如果在公司内网,需要联系IT部门把这两个端口开放。同时需要检查应用的联网是否会被一些手机安全助手阻止。需要特别注意的是,在MIUI系统上,长连接是由“小米服务框架”这个系统应用维护的,因此需要确保这个应用的联网并没有被阻止。
Intent i = new Intent(context, MyActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
Intent i = new Intent(context, MyActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
简洁版自定义消息推送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);}
}
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);
}
}
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;
}
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;
}
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);}
}
/**
* 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))));
}
@Override
protected void onResume() {
isForeground = true;
super.onResume();
}
@Override
protected void onPause() {
isForeground = false;
super.onPause();
}
@Override
protected 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);
}
}
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;}}
}
/**
* 注意,重写的这些方法都运行在非 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;
}
}
}
消息处理类
/*** 处理推送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) {}}
/**
* 处理推送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) {
}
}
配置文件
implementation files('libs/MiPush_SDK_Client_3_6_2.jar')
implementation files('libs/MiPush_SDK_Client_3_6_2.jar')
#这里com.bqt.push.DemoMessageRreceiver改成app中定义的完整类名
-keep class com.bqt.push.receiver.MiPushReceiver {*;}
#可以防止一个误报的 warning 导致无法成功编译,如果编译使用的 Android 版本是 23。
-dontwarn com.xiaomi.push.**
x
#这里com.bqt.push.DemoMessageRreceiver改成app中定义的完整类名
-keep class com.bqt.push.receiver.MiPushReceiver {*;}
#可以防止一个误报的 warning 导致无法成功编译,如果编译使用的 Android 版本是 23。
-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"/><!--华为--><!--魅族-->
x
<!--====================== 推送SDK需要定义的权限【需要更改包名】 =====================-->
<!--极光-->
<!--小米-->
<permission
android:name="com.bqt.push.permission.MIPUSH_RECEIVE"
android:protectionLevel="signature"/>
<uses-permission android:name="com.bqt.push.permission.MIPUSH_RECEIVE"/>
<!--华为-->
<!--魅族-->
<!--========================= 小米推送需要注册的组件 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 =========================-->
x
<!--========================= 小米推送需要注册的组件 start =========================-->
<receiver
android: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>
<receiver
android:name="com.xiaomi.push.service.receivers.NetworkStatusReceiver"
android:exported="true">
<intent-filter>
<action
android:name="android.net.conn.CONNECTIVITY_CHANGE"
tools:ignore="BatteryLife"/>
<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>
<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
android:name="com.xiaomi.push.service.XMPushService"
android:enabled="true"
android:process=":pushservice"/>
<service
android:name="com.xiaomi.mipush.sdk.PushMessageHandler"
android:enabled="true"
android:exported="true"
tools:ignore="ExportedService"/>
<service
android:name="com.xiaomi.mipush.sdk.MessageHandleService"
android:enabled="true"/>
<!--========================= 小米推送需要注册的组件 end =========================-->
小米推送 简介 集成相关推荐
- 华为推送 简介 集成 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- Android 集成华为推送,集成小米推送,集成OPPO推送,集成vivo推送
最近有时间在我们的应用中集成了华为,小米,OPPO,vivo四大平台的推送,一切顺利. 这里做一个记录, 开撸: 一.华为推送 1.下载HMS Agent套件,解压如下: 找到GetHMSAgent_ ...
- 华为推送 简介 集成
账号[谢总@asp.citic.com][icitic52818888] 应用包名:com.bqt.push APP ID:100257971 文档: http://developer.huawei. ...
- 小米推送 java demo_XiaomiPushDemo【小米推送集成,基于V3.6.12版本】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 这个Demo只是记录小米推送的集成,不能运行. 使用步骤 一.项目组织结构图 注意事项: 1. 导入类文件后需要change包名以 ...
- Android 集成小米推送功能教程
1.前言 现在好多手机都有APP推送功能,也有好多第三方的SDK,那为什么还要集成只有小米手机好使的"小米推送"呢?因为在小米手机中,小米推送是"系统级通道", ...
- android 小米推送 no account,XiaomiPushDemo【小米推送集成,基于V3.6.12版本】
前言 这个Demo只是记录小米推送的集成,不能运行.使用步骤 一.项目组织结构图 注意事项: 1. 导入类文件后需要change包名以及重新import R文件路径 2. Values目录下的文件 ...
- Android开发之推送服务(二) 集成小米推送
小米推送主要是用来适配小米手机的.所以,在做的时候,一般会判断当前手机是否是小米手机,如果是小米手机,则去使用小米推送,注册小米推送,如果不是,则默认使用Umeng推送. 在集成小米推送之前,需要先注 ...
- Android消息推送:手把手教你集成小米推送
<script type="text/javascript" src="http://static.blog.csdn.net/scripts/category.j ...
- 友盟小米收不到推送消息_一个轻量级、可插拔的Android消息推送框架。一键集成推送(极光推送、友盟推送、华为、小米推送等)...
XPush 一个轻量级.可插拔的Android消息推送框架.一键集成推送(极光推送.友盟推送.华为.小米推送等),提供有效的保活机制,支持推送的拓展,充分解耦推送和业务逻辑,解放你的双手! 在提iss ...
最新文章
- 【书籍下载链接】_2_第二轮_计算机专业书籍
- Kaldi aishell 200h小时训练问题集合
- 现宣布Windows Azure中SQL数据同步的增强功能
- Docker学习总结(6)——通过 Docker 化一个博客网站来开启我们的 Docker 之旅
- linux 蓝牙编程,实战Linux Bluetooth编程(三) HCI层编程
- iOS后台运行的设置方法
- 巴菲特的价值投资的第二版本
- Spring事务嵌套引发的问题--Transaction rolled back because it has been marked as rollback-only...
- MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践
- 20220202--CTF刷题MISC方向--第5题--反编译
- 每日一问:Android 滑动冲突,你们都是怎样处理的
- revit如何根据坐标进行画线_在工程设计中如何根据工艺阀门的结构与特点来进行设计呢?...
- Vue学习笔记:创建一个Vue实例
- codevs1018 单词接龙(DFS)
- Python排序算法[二]:测试数据的迷雾散去
- 【整数转字符串】LeetCode 9. Palindrome Number
- 学习Java,真的可以月薪过万嘛?真实个人经历告诉你,记录了平时学习的内容以及学习过程中最真实的感受(二)
- 计算机组装主板,组装电脑如何选择合适的主板 组装电脑选择合适主板介绍【详解】...
- FusionChartsFree参数说明
- 项目经理应该具备的四种能力