Android手机端小米推送Demo解析和实现方法

最近这几个月都是在准备找工作和找工作中,付出了很多,总算是有点收获,所以都没有怎么整理笔记。到了最近才有空把自己的笔记整理一下发上来,分享一下我的学习经验。

推送
由于最近项目要用到Android的消息推送,关于Android推送的解决方案有很多种,有C2DM,轮询, SMS,MQTT协议,XMPP协议和第三方平台,经过我们对项目需求的考虑之后我们选择了第三方平台推送的小米推送,下面就是小米推送的实现方法。

实现准备

想要用小米推送首先要去小米开发者平台注册申请开发者账号,经过1到3天的审核之后就会通过,然后就可以申请推送服务。申请一个App的推送服务之后,获得AppID和AppKey就可以去学习它给Demo来使用了,下面我主要就是讲一下我对Demo的理解。

推送说明

推送的内容可以由后台服务端利用小米推送的SDK实现发送,也可以在小米的推送平台发送,发送的消息有两种:通知消息和透传信息。

通知消息:

就是会显示在Android系统通知栏的消息,用户点击它的响应事件要自己实现或者在发送的时候说明点击打开App。

透传消息:

即是透明传送,即传送网络无论传输业务如何,只负责将需要传送的业务传送到目的节点,同时保证传输的质量即可,而不对传输的业务进行处理。就是直接把消息传给App,不会自动在通知栏上显示。

官方Demo说明

官方给出的Demo里面简单地为我们展示了一下小米推送的各种设置和怎样实现接收推送。Demo首先把小米推送的SDK加入Library,然后里面有4个Java文件,如图

第4个Dialog可以不用看,关键是DemoMessageReceiver这个广播接收器,接收推送到的各种信息然后进行处理。还有那个DemoApplication和MainActivity就是用来实现接收到信息的显示。

然后界面是这样的(demo没做屏幕适配,所以就那样了):

一堆关于推送的配置,和一个显示Log的TextView。主要为我们展示了小米推送的使用过程。

DemoMessageReceiver广播接收器

要实现小米推送的移动端接收,核心就是上面说到最主要的DemoMessageReceiver这个广播接收器。这个继承了小米SDK里面的PushMessageReceiver类里面,这个广播接收器可以通过重写下面这5个回调方法来实现对推送的处理。

@Override public void onReceivePassThroughMessage(Context context, MiPushMessage miPushMessage) { //用来接收服务器向客户端发送的透传消息,收到透传消息会触发。 } @Override public void onNotificationMessageClicked(Context context, MiPushMessage miPushMessage) { //用来接收服务器向客户端发送的通知消息,这个回调方法会在用户手动点击通知后触发。 } @Override public void onNotificationMessageArrived(Context context, MiPushMessage miPushMessage) { //用来接收服务器向客户端发送的通知消息,这个回调方法是在通知消息到达客户端时触发。另外应用在前台时不弹出通知的通知消息到达客户端也会触发这个回调函数 } @Override public void onReceiveRegisterResult(Context context, MiPushCommandMessage miPushCommandMessage) { //用来接收客户端向服务器发送注册命令后的响应结果 } @Override public void onCommandResult(Context context, MiPushCommandMessage miPushCommandMessage) { //用来接收客户端向服务器发送命令后的响应结果。这里可以收到到各种命令的返回结果,例如注册服务、设置别名之类的结果,在这里可以实现初始化错误然后重启之类的功能。 }

DemoApplication继承Application类

这个Application类的主要功能有设置App的ID和KEY,还有在onCreate方法里面注册推送服务。

在这个Demo里面,它还在里面弄了一个Handler来让广播接收器可以使用它来发Toast和让MainActivity打印Log在TextView上。

// user your appid the key. private static final String APP_ID = "1000270"; // user your appid the key. private static final String APP_KEY = "670100056270"; // 此TAG在adb logcat中检索自己所需要的信息, 只需在命令行终端输入 adb logcat | grep // com.xiaomi.mipushdemo public static final String TAG = "com.xiaomi.mipushdemo"; private static DemoHandler sHandler = null; private static MainActivity sMainActivity = null; @Override public void onCreate() { super.onCreate(); // 注册push服务,注册成功后会向DemoMessageReceiver发送广播 // 可以从DemoMessageReceiver的onCommandResult方法中MiPushCommandMessage对象参数中获取注册信息 if (shouldInit()) { MiPushClient.registerPush(this, APP_ID, APP_KEY); } LoggerInterface newLogger = new LoggerInterface() { @Override public void setTag(String tag) { // ignore } @Override public void log(String content, Throwable t) { Log.d(TAG, content, t); } @Override public void log(String content) { Log.d(TAG, content); } }; Logger.setLogger(this, newLogger); if (sHandler == null) { sHandler = new DemoHandler(getApplicationContext()); } } //这里是检测进程是否处于前台的方法 private boolean shouldInit() { ActivityManager am = ((ActivityManager) getSystemService(Context.ACTIVITY_SERVICE)); List<RunningAppProcessInfo> processInfos = am.getRunningAppProcesses(); String mainProcessName = getPackageName(); int myPid = Process.myPid(); for (RunningAppProcessInfo info : processInfos) { if (info.pid == myPid && mainProcessName.equals(info.processName)) { return true; } } return false; }

MainActivity

Demo里面的MainActivity主要是实现界面的那些按钮的处理,借此来告诉我们怎样设置本地的推送方案,具体的设置有

设置、撤销别名:别名(Alias)是除了Regid(自动生成的)和UserAccount之外的用户标识,可以通过MiPushClient.setAlias()方法和MiPushClient.unsetAlias()来设定和撤销。 设置、撤销用户账号(UserAccoun):可以通过MiPushClient.setUserAccount()方法和MiPushClient.unsetUserAccount()方法来设定和撤销。 订阅、撤销标签:开发者可以结合自己的业务特征,给用户打上不同的标签(Topic)。消息推送时,开发者可以结合每条消息的内容和目标用户,为每条消息选择对应的标签,向打了该标签的所有用户推送消息。可以通过MiPushClient.subscribe()和MiPushClient.unsubscribe()来订阅和取消。 暂停、恢复推送,设置推送时间:设置推送时间Demo用到了一个自制的Dialog类TimeIntervalDialog来让用户设置(强行增大了代码量),可以通过MiPushClient.setAcceptTime()来设置,暂停和恢复是通过pausePush()和resumePush()设置。  不过暂停和恢复底层上的实现其实还是调用设置推送时间为00:00 - 00:00和00:00 - 23:59而已,而且还要注意的是不处在接收时段是暂时不接收推送消息而已,一旦到了接收时段那个消息还是会陆续推送到来。

AndroidManifest文件的配置

首先小米推送支持最低的Android版本是2.2,所以要

<uses-sdk android:minSdkVersion="8"/>

后需要的是如下权限:

<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" /> <uses-permission android:name="android.permission.VIBRATE" /> <permission android:name="com.xiaomi.mipushdemo.permission.MIPUSH_RECEIVE" android:protectionLevel="signature" /> <!--这里com.xiaomi.mipushdemo改成app的包名--> <uses-permission android:name="com.xiaomi.mipushdemo.permission.MIPUSH_RECEIVE" /> <!--这里com.xiaomi.mipushdemo改成app的包名-->

然后就是要注册一堆的BroadcastReceiver(都是静态注册,因为要长期处在后台运行,还有继承了PushMessageReceiver的DemoMessageReceiver也需要注册不要忘了)和Service,一共是3个广播接收器和4个服务。

<service android:enabled="true" android:process=":pushservice" android:name="com.xiaomi.push.service.XMPushService"/> <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必须在3.0.1版本以后(包括3.0.1版本)加入--> <service android:enabled="true" android:exported="true" android:name="com.xiaomi.mipush.sdk.PushMessageHandler" /> <service android:enabled="true" android:name="com.xiaomi.mipush.sdk.MessageHandleService" /> <!--注:此service必须在2.2.5版本以后(包括2.2.5版本)加入--> <receiver android:exported="true" android:name="com.xiaomi.push.service.receivers.NetworkStatusReceiver" > <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </receiver> <receiver android:exported="false" android:process=":pushservice" android:name="com.xiaomi.push.service.receivers.PingReceiver" > <intent-filter> <action android:name="com.xiaomi.push.PING_TIMER" /> </intent-filter> </receiver> <receiver android:name="com.xiaomi.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>

只要把demo的AppId和AppKey改好成自己的(记得是对应好包名和应用名字的),然后就能够接收相应的推送了。

移动端移植实现

大概理解了这个Demo之后,就可以把小米推送移植到自己的App上去实现自己的需求了,移植的时候要注意:

首先要想好应用的包名,从小米推送平台那里注册,获得AppID和AppKey。 然在把小米推送的SDK加入库。 AndroidManifest文件里面配置好权限(在Android6.0里面的权限可能需要动态获取),注册好那些Service和BroadcastReceiver 在应用开始的时候记得初始化注册小米推送服务。 最后就可以继承一个PushMessageReceiver,在里面为所欲为了。 最后提供一个我写的简化之后的Demo,理解了上面之后可以参考我这个简化的移植了,毕竟上面的太全面,我们实际看需求实现就行。

时间: 2024-12-06 16:20:24

Android手机端小米推送Demo解析和实现方法的相关文章

Android手机端小米推送Demo解析和实现方法_Android

最近这几个月都是在准备找工作和找工作中,付出了很多,总算是有点收获,所以都没有怎么整理笔记.到了最近才有空把自己的笔记整理一下发上来,分享一下我的学习经验. 推送 由于最近项目要用到Android的消息推送,关于Android推送的解决方案有很多种,有C2DM,轮询, SMS,MQTT协议,XMPP协议和第三方平台,经过我们对项目需求的考虑之后我们选择了第三方平台推送的小米推送,下面就是小米推送的实现方法. 实现准备 想要用小米推送首先要去小米开发者平台注册申请开发者账号,经过1到3天的审核之后

Android消息推送:手把手教你集成小米推送(附demo)_Android

前言 在Android开发中,消息推送功能的使用非常常见. 为了降低开发成本,使用第三方推送是现今较为流行的解决方案. 今天,我将手把手教大家如何在你的应用里集成小米推送 目录 1. 官方Demo解析 首先,我们先对小米官方的推送Demo进行解析. 请先到官网下载官方Demo和SDK说明文档 1.1 Demo概况 目录说明: DemoApplication类 继承自Application类,其作用主要是:设置App的ID & Key.注册推送服务 DemoMessageReceiver类 继承自

Android消息推送:手把手教你集成小米推送(附demo)

前言 在Android开发中,消息推送功能的使用非常常见. 为了降低开发成本,使用第三方推送是现今较为流行的解决方案. 今天,我将手把手教大家如何在你的应用里集成小米推送 目录 1. 官方Demo解析 首先,我们先对小米官方的推送Demo进行解析. 请先到官网下载官方Demo和SDK说明文档 1.1 Demo概况 目录说明: DemoApplication类 继承自Application类,其作用主要是:设置App的ID & Key.注册推送服务 DemoMessageReceiver类 继承自

Android下实现信息推送

最近有幸负责参与开发公司的CMPP短信网关程序,采用的是Apache Mina框架实现.通过该项目对Socket通 信.长连接有了更深一步的理解,于是就想试试将Mina用到Android平台的信息推送上.经过了解发现,目前 已经有不少成型的框架能够实现Android平台的信息推送,特别是AndroidPn. 平时我们开发手机客户 端,都少不了要于服务器交互,那么当服务器端有新的数据时,客户端是怎么知道的呢?一般可以采用如下两 种方式来实现: 1)客户端定期(每隔一段时间,轮询)向服务器发起请求,

绑定小米推送后被挤下线,调用退出登录出错,错误码,211,faild to unbind device token

问题描述 我绑定了小米推送,而且绑定成功,能够接收到推送,调用退出登录一直能解绑成功,但当我被挤下线时,会调用退出登录的代码,可是,有些机型调用退出登录就解绑失败导致退出登录失败 解决方案 被踢下线调用退出的方法,第一个参数传false

android的GCM信息推送,sdk下没有gcm-server.jar

问题描述 android的GCM信息推送,sdk下没有gcm-server.jar 我的sdk没有gcm-server这个服务下载.. 现在就是我的项目缺包了...缺少了这个包..导致Sender这个类使用不了.. 我想问一下为什么我的sdk的扩展没有..Google Cloud Messaging for Android Library这一项服务阿... 解决方案 1)你的SDK需要从SDK Manager里安装Google Cloud Messaging for Android Librar

最新环信SDK 集成小米推送,不想小米推送,SDK报错的问题。

问题描述 如图,如下,请问SDK中是否有配置 是否加载小米推送的 的开关选项...不然在调试的时候,犹豫是强迫症患者,,,看到一堆错误,很恶心哦, 解决方案 看下小米的jar是否正确的倒入了,可以参加下2.2.5demo中.和下面的链接http://docs.easemob.com/doku.p ... admsg

新浪微博私信功能-如何设计与实现android手机端类似新浪微博的私信功能?

问题描述 如何设计与实现android手机端类似新浪微博的私信功能? 如何设计与实现android手机端类似新浪微博的私信功能?需要实现的一些思路,最好是有简单的例子和说明.谢谢各位.

怎样使用android客户端的消息推送开源包androidpn。

问题描述 怎样使用android客户端的消息推送开源包androidpn. 下载了androidpn 的server和client 0.5.0的版本,具体怎么部署,客户端怎么实现,服务端怎么实现呢,最好有实际经验的朋友帮忙解答一下.非常感谢.