前言
最近这几个月都是在准备找工作和找工作中,付出了很多,总算是有点收获,所以都没有怎么整理笔记。到了最近才有空把自己的笔记整理一下发上来,分享一下我的学习经验。
推送
由于最近项目要用到Android的消息推送,关于Android推送的解决方案有很多种,有C2DM,轮询, SMS,MQTT协议,XMPP协议和第三方平台,经过我们对项目需求的考虑之后我们选择了第三方平台推送的小米推送,下面就是小米推送的实现方法。
实现准备
想要用小米推送首先要去小米开发者平台注册申请开发者账号,经过1到3天的审核之后就会通过,然后就可以申请推送服务。申请一个App的推送服务之后,获得AppID和AppKey就可以去学习官方给Demo来使用了,下面我主要就是讲一下我对官方Demo的理解。
看的时候结合官方Demo的代码看会清晰很多,这里是SDK和官方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) {
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
DemoApplication继承Application类
这个Application类的主要功能有设置App的ID和KEY,还有在onCreate方法里面注册推送服务。
在这个Demo里面,它还在里面弄了一个Handler来让广播接收器可以使用它来发Toast和让MainActivity打印Log在TextView上。
private static final String APP_ID = "1000270";
private static final String APP_KEY = "670100056270";
public static final String TAG = "com.xiaomi.mipushdemo";
private static DemoHandler sHandler = null;
private static MainActivity sMainActivity = null;
@Override
public void onCreate() {
super.onCreate();
if (shouldInit()) {
MiPushClient.registerPush(this, APP_ID, APP_KEY);
}
LoggerInterface newLogger = new LoggerInterface() {
@Override
public void setTag(String tag) {
}
@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;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
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" />
<uses-permission android:name="com.xiaomi.mipushdemo.permission.MIPUSH_RECEIVE" />
然后就是要注册一堆的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
android:enabled="true"
android:exported="true"
android:name="com.xiaomi.mipush.sdk.PushMessageHandler" />
<service android:enabled="true"
android:name="com.xiaomi.mipush.sdk.MessageHandleService" />
<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>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
只要把demo的AppId和AppKey改好成自己的(记得是对应好包名和应用名字的),然后就能够接收相应的推送了。
移动端移植实现
大概理解了这个Demo之后,就可以把小米推送移植到自己的App上去实现自己的需求了,移植的时候要注意:
1. 首先要想好应用的包名,从小米推送平台那里注册,获得AppID和AppKey。
2. 然在把小米推送的SDK加入库。
3. AndroidManifest文件里面配置好权限(在Android6.0里面的权限可能需要动态获取),注册好那些Service和BroadcastReceiver
4. 在应用开始的时候记得初始化注册小米推送服务。
5. 最后就可以继承一个PushMessageReceiver,在里面为所欲为了。
6. 最后提供一个我写的简化之后的Demo,理解了上面之后可以参考我这个简化的移植了,毕竟上面的太全面,我们实际看需求实现就行。