最近项目要用到小米推送,但是网上关于Xamarin 小米推送的资料真的是少之又少,可以说是没有,非常之蛋疼。在经过本人研究成功推送之后,我觉得要把经验资料分享出来!!!ps:如果是原生Android开发使用小米推送真的是非常方便,SDK Demo下载下来嵌入改一下包名之类的差不多就搞定了,Xamarin开发的话还要改成C#,算了,废话不多说。

1.下载小米推送客户端SDK。

下载网址:http://dev.xiaomi.com/mipush/downpage/

SDK包里有Eclipse和Android Studio的Demo以及MiPush_SDK_Client_3_1_2.jar。Demo只需要简单地改一些参数(类如包名、AppID、AppKey)就可以直接用了,Android原生开发就可以直接使用了,但是是没有Xamarin C#版本的。

2.新建一个Xamarin.Android项目,Bindings Library(Android)。

1 这个是用来制作小米推送SDK,将Jar包转成vs可以引用的.dll

2 将小米推送SDK的jar包加进项目中的jars包下

3 将jar包属性改为EmbeddedJar

4 项目生成,即可获得我们需要的.dll,在项目对应下的mipush\bin\Debug文件夹中。

3.新建一个Android项目。

1 新建一个Android项目,过程省略;
2 添加对mipush.dll的引用;

4.配置AndroidManifest.xml

1.小米推送服务SDK支持的最低安卓版本为2.2。
<uses-sdk android:minSdkVersion="8" />

2.推送服务需要的权限列表

<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="19" /><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" /><!-- the following 2 com.xiaomi.mipushdemo should be changed to your package name --><permission android:name="com.Gary.mipushDemo.permission.MIPUSH_RECEIVE" android:protectionLevel="signature" /><uses-permission android:name="com.Gary.mipushDemo.permission.MIPUSH_RECEIVE" /><uses-permission android:name="android.permission.VIBRATE" />
3.推送服务需要配置的service和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" /><service android:name="com.xiaomi.mipush.sdk.MessageHandleService" android:enabled="true" /><receiver android:name="com.gary.mipushdemo.DemoMessageReceiver" android:exported="true"><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" /><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>
4.自定义BroadCastReceiver类
创建一个类并继承PushMessageReceiver类,并重写父类的onCommandResult和onReceiveMessage方法,然后把该receiver注册到AndroidManifest.xml文件中。
a)onCommandResult服务端接收客户端请求后返回的响应消息
b)onReceiveMessage用来接收服务器向客户端发送的即时消息
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Com.Xiaomi.Mipush.Sdk;
using Java.Text;
using Android.Util;
using Android.Text;namespace Gary.mipushDemo
{public class DemoMessageReceiver : PushMessageReceiver{private string mRegId;private string mTopic;private string mAlias;private string mAccount;private string mStartTime;private string mEndTime;public override void OnReceivePassThroughMessage(Context context, MiPushMessage message){if (!TextUtils.IsEmpty(message.Topic)){mTopic = message.Topic;}else if (!TextUtils.IsEmpty(message.Alias)){mAlias = message.Alias;}}public override void OnNotificationMessageClicked(Context context, MiPushMessage message){if (!TextUtils.IsEmpty(message.Topic)){mTopic = message.Topic;}else if (!TextUtils.IsEmpty(message.Alias)){mAlias = message.Alias;}}public override void OnNotificationMessageArrived(Context context, MiPushMessage message){if (!TextUtils.IsEmpty(message.Topic)){mTopic = message.Topic;}else if (!TextUtils.IsEmpty(message.Alias)){mAlias = message.Alias;}}// 用来接收客户端向服务器发送命令消息后返回的响应public override void OnCommandResult(Context context, MiPushCommandMessage message){string command = message.Command;IList<string> arguments = message.CommandArguments;string cmdArg1 = ((arguments != null && arguments.Count() > 0) ? arguments[0] : null);string cmdArg2 = ((arguments != null && arguments.Count() > 1) ? arguments[1] : null);string log;if (MiPushClient.CommandRegister.Equals(command)){if (message.ResultCode == ErrorCode.Success){mRegId = cmdArg1;}else{}}else if (MiPushClient.CommandSetAlias.Equals(command)){if (message.ResultCode == ErrorCode.Success){mAlias = cmdArg1;}else{}}else if (MiPushClient.CommandUnsetAlias.Equals(command)){if (message.ResultCode == ErrorCode.Success){mAlias = cmdArg1;}else{}}else if (MiPushClient.CommandSetAccount.Equals(command)){if (message.ResultCode == ErrorCode.Success){mAccount = cmdArg1;}else{}}else if (MiPushClient.CommandUnsetAccount.Equals(command)){if (message.ResultCode == ErrorCode.Success){mAccount = cmdArg1;}else{}}else if (MiPushClient.CommandSubscribeTopic.Equals(command)){if (message.ResultCode == ErrorCode.Success){mTopic = cmdArg1;}else{}}else if (MiPushClient.CommandUnsubscribeTopic.Equals(command)){if (message.ResultCode == ErrorCode.Success){mTopic = cmdArg1;}else{}}else if (MiPushClient.CommandSetAcceptTime.Equals(command)){if (message.ResultCode == ErrorCode.Success){mStartTime = cmdArg1;mEndTime = cmdArg2;}else{}}else{log = message.Reason;}}public override void OnReceiveRegisterResult(Context context, MiPushCommandMessage message){string command = message.Command;IList<string> arguments = message.CommandArguments;string cmdArg1 = ((arguments != null && arguments.Count() > 0) ? arguments[0] : null);string log;if (MiPushClient.CommandRegister.Equals(command)){if (message.ResultCode == ErrorCode.Success){mRegId = cmdArg1;}else{}}else{log = message.Reason;}}}
}

5.将自定义的BroadcastReceiver注册到AndroidManifest.xml文件中

<receiver android:name="com.gary.mipushdemo.DemoMessageReceiver" android:exported="true"><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>

6.推送服务初始化
通过调用MiPushClient.registerPush来初始化小米推送服务。笔者建议在应用的Application类的onCreate()方法内进行注册,这样注册成功后只要应用进程不被结束,那么推送服务就是一直可用的。不建议在某一个Activity中进行注册,因为随着Activity生命周期的结束,推送服务很可能会失效。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Com.Xiaomi.Mipush.Sdk;
using Android.Text;
using static Android.App.ActivityManager;
using Com.Xiaomi.Channel.Commonutils.Logger;
using Android.Util;
using Java.Lang;namespace Gary.mipushDemo
{public class DemoApplication : Application{// user your appid the key.private static string APP_ID = "2882303761517520746";// user your appid the key.private static string APP_KEY = "5731752028746";// 此TAG在adb logcat中检索自己所需要的信息, 只需在命令行终端输入 adb logcat | grep// com.xiaomi.mipushdemopublic static string TAG = "com.Gary.mipushDemo";private static DemoHandler sHandler = null;public override void OnCreate(){base.OnCreate();// 注册push服务,注册成功后会向DemoMessageReceiver发送广播// 可以从DemoMessageReceiver的onCommandResult方法中MiPushCommandMessage对象参数中获取注册信息if (shouldInit()){MiPushClient.RegisterPush(this, APP_ID, APP_KEY);}if (sHandler == null){sHandler = new DemoHandler(this);}}private bool shouldInit(){ActivityManager am = ((ActivityManager)GetSystemService(ActivityService));IList<RunningAppProcessInfo> processInfos = am.RunningAppProcesses;string mainProcessName = PackageName;int myPid = Android.OS.Process.MyPid();foreach (RunningAppProcessInfo info in processInfos){if (info.Pid == myPid && mainProcessName.Equals(info.ProcessName)){return true;}}return false;}public static DemoHandler getHandler(){return sHandler;}public class DemoHandler : Handler{private Context context;public DemoHandler(Context context){this.context = context;}public override void HandleMessage(Message msg){string s = (string)msg.Obj;if (!TextUtils.IsEmpty(s)){Toast.MakeText(context, s, ToastLength.Long).Show();}}}}
}

5.测试截图

1.登录上小米开发者站(需要注册小米账号并且申请开发者);
2.发送推送;
3.手机接收到推送。(小米推送在MIUI的小米手机上有比较好的体验,APP退出后仍然可以接收到推送,其他牌子手机可能就接收不到)
有不懂的同学可以讨论一下,希望大家都能在Xamarin用上小米推送。

Xamarin Android使用小米推送相关推荐

  1. mix2s 升级android p,小米推送小米MIX2S 安卓P稳定版更新 这两个隐藏升级你发现了吗?...

    原标题:小米推送小米MIX2S 安卓P稳定版更新 这两个隐藏升级你发现了吗? 今天上午,小米推送了小米MIX2S的稳定版更新,版本号为MIUI V10.0.4.0,体积为2GB,这一次更新将系统底层更 ...

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

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

  3. Android 集成小米推送

    前言 在Android开发中,消息推送功能的使用非常常见. 为了降低开发成本,使用第三方推送是现今较为流行的解决方案. 今天,我将手把手教大家如何在你的应用里集成小米推送 该文档基于小米推送官方Dem ...

  4. android利用小米推送保活自已应用,Android--利用第三方推送实现APP伪保活(小米篇)...

    此文只是讲述如何使用云巴自带的包实现该功能,核心技术并不是博主写的.此功能实现首先实现基础的推送,没有实现的请看SDK快速入门,实现了的可以直接去官方文档怎么集成第三方,云巴文档传送门,那我为什么要写 ...

  5. android oreo小米推送,去年年底终于履行承诺:小米A1现已吃上奥利奥

    第1页去年年底终于履行承诺:小米A1现已吃上奥利奥 小米旗下第一款Android One智能手机Mi A1在经过一段时期的测试之后,昨日终于正式迎来了Android 8.0 Oreo升级.值得一提的是 ...

  6. Flutter集成推送功能-小米推送集成

    Dart4Flutter -01 – 变量, 类型和 函数 Dart4Flutter – 02 –控制流 和异常 Dart4Flutter – 03 – 类和泛型 Dart4Flutter – 04 ...

  7. Android集成华为推送教程

    前言 目前Android应用在后台杀死进程之后,就收不到通知了,想要接收消息推送,需要集成各个厂商的推送SDK,本次讲解华为集成最新教程 1.配置AppGallery Connect 1)注册成为开发 ...

  8. android 通知 广告,解决三星/小米等Android手机通知栏推送广告的问题

    三星和小米都是使用安卓系统的手机,有时候突然在手机通知栏弹出很多的广告,而且广告是不定时的弹出,你把消息清理掉之后,过段时间还是会弹出广告. 而且下载的都是一些乱七八糟的东西,对手机没有什么用处,想完 ...

  9. Android接入极光推送,接入华为,小米,OPPO,VIVO厂商通道

    极光推送作用: 极光推送(JPush)是一个端到端的推送服务,使得服务器端消息能够及时地推送到终端用户手机上,让开发者积极地保持与用户的连接,从而提高用户活跃度.提高应用的留存率 主要作用: 保持与服 ...

最新文章

  1. OpenCV | 分水岭算法进行图像分割
  2. 分拆之后又有大动作,惠普的下一步怎么走?
  3. CV之YOLOv3:深度学习之计算机视觉神经网络Yolov3-5clessses训练自己的数据集全程记录
  4. C语言实现面向接口编程
  5. txt文件可存储最大值_Verilog边码边学:十六进制文件读取$readmemh
  6. 一张图学会python应用到excel-简单使用python做excel多文件批量搜索(带图形界面)(已更新)...
  7. 不到 20 人的互联网公司该去吗?
  8. php txt bom,使用 PHP 函数或者软件去除文件的 BOM 头字符 - 文章教程
  9. ajax性能测试脚本,mqtt性能测试工具
  10. FPGA布局及资源优化
  11. 九宫格摆法_九张照片墙怎么摆放图,1的九宫格效果图
  12. 【ChatGPT】实用 Prompt 指令大全 —— 一文教你如何更好地挖掘 GPT 的价值
  13. 小白学python(爬虫知识1(大体框架)
  14. 数字图像处理(第二章)
  15. 手机 html病毒,超级手机病毒
  16. BP神经网络隐藏层单元数的选择--(1)
  17. 海底捞,我们该学什么?--《海底捞你学不会》读后感
  18. python培训费用大概多少-Python培训学费需要多少钱?
  19. 计算机二级和三级哪个厉害,计算机二级和三级哪个更有用啊?没
  20. PP-YOLOE实现自动驾驶场景检测

热门文章

  1. 右边maven中没有Dependencies
  2. MySQL常用命令学习笔记
  3. CUDA Graph图详解
  4. 风尚云网学习-H5+css3+js上传文件页面提交不跳转
  5. Unity修改默认脚本编辑器
  6. #444 – DockPanel 中的子元素不一定一直都是平铺显示(Children of DockPanel Don’t Always Have to be Stretched)
  7. python中文词组统计次数_python统计中文词组出现次数
  8. 创建hive表,指定存储和压缩格式
  9. 申明(声明)、定义及默认参数
  10. 上海交大SEED-IV数据集眼动信号介绍