开题先说明写这个推送的原因,据公司调研,小米会屏蔽其它推送发送过来的消息,而我们产品的安卓端80%以上用户都是小米,因此公司决议做小米的消息推送,而且小米可以推送到任意一款android手机上。
先给一段代码,代码中有详细解释。
public class DemoMessageReceiver extends PushMessageReceiver {
private String mRegId;
private long mResultCode = -1;
private String mReason;
private String mCommand;
private String mMessage;
private String mTopic;
private String mAlias;
private String mStartTime;
private String mEndTime;
// 用来接收服务器向客户端发送的消息
@Override
public void onReceiveMessage(Context context, MiPushMessage message) {
Log.v(DemoApplication.TAG,
"onReceiveMessage is called. " + message.toString());
mMessage = message.getContent();
if (!TextUtils.isEmpty(message.getTopic())) {
mTopic = message.getTopic();
} else if (!TextUtils.isEmpty(message.getAlias())) {
mAlias = message.getAlias();
}
}
// 用来接收客户端向服务器发送命令消息后返回的响应
@Override
public void onCommandResult(Context context, MiPushCommandMessage message) {
Log.v(DemoApplication.TAG,
"onCommandResult is called. " + message.toString());
String command = message.getCommand();
List<String> arguments = message.getCommandArguments();
if (arguments != null) {
if (MiPushClient.COMMAND_REGISTER.equals(command)
&& arguments.size() == 1) {
mRegId = arguments.get(0);
} else if ((MiPushClient.COMMAND_SET_ALIAS.equals(command) || MiPushClient.COMMAND_UNSET_ALIAS
.equals(command)) && arguments.size() == 1) {
mAlias = arguments.get(0);
} else if ((MiPushClient.COMMAND_SUBSCRIBE_TOPIC.equals(command) || MiPushClient.COMMAND_UNSUBSCRIBE_TOPIC
.equals(command)) && arguments.size() == 1) {
mTopic = arguments.get(0);
} else if (MiPushClient.COMMAND_SET_ACCEPT_TIME.equals(command)
&& arguments.size() == 2) {
mStartTime = arguments.get(0);
mEndTime = arguments.get(1);
}
// 设置别名alias 这个方法调用成功后会执行到onCommandResult方法,为了避免死循环执行,加了下面判断
if (mAlias.equals(""))
MiPushClient.setAlias(context, "shangqi", null);
// 指定标签 其它同上
// MiPushClient.subscribe(getApplicationContext(), "haokang", null);
}
mResultCode = message.getResultCode();
mReason = message.getReason();
}
以上是个广播再来一段代码
public class DemoApplication extends Application {
// user your appid the key.
public static final String APP_ID = "2882303761517159864";
// user your appid the key.
public static final String APP_KEY = "5261715955864";
// 此TAG在adb logcat中检索自己所需要的信息, 只需在命令行终端输入 adb logcat | grep
// com.xiaomi.mipushdemo
public static final String TAG = "com.xiaomi.mipushdemo";
private static DemoHandler handler = null;
@Override
public void onCreate() {
super.onCreate();
// 小米推送
Constants.useOfficial(); // 使用正式环境。
// Constants.useSandbox(); // 使用测试环境。
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 (handler == null)
handler = new DemoHandler(getApplicationContext());
// 注册push服务,注册成功后会向DemoMessageReceiver发送广播
// 可以从DemoMessageReceiver的onCommandResult方法中MiPushCommandMessage对象参数中获取注册信息
if (shouldInit()) {
MiPushClient.registerPush(this, APP_ID, APP_KEY);
}
}
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;
}
这个是官方给的,我没做修改,只是把其中的APP_ID, APP_KEY换成自己项目所申请到的。最后要说一下权限的问题
<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.xiaomi.mipushdemo.permission.MIPUSH_RECEIVE"
android:protectionLevel="signatureOrSystem" />
<uses-permission android:name="com.xiaomi.mipushdemo.permission.MIPUSH_RECEIVE" />
<uses-permission android:name="android.permission.VIBRATE"/>
除了权限,还要注册一些东西进去
<service
android:enabled="true"
android:process=":pushservice"
android:name="com.xiaomi.push.service.XMPushService"/>
<service
android:enabled="true"
android:exported="true"
android:name="com.xiaomi.mipush.sdk.PushMessageHandler" />
<receiver
android:exported="true"
android:name="com.xiaomi.mipushdemo.DemoMessageReceiver">
<intent-filter>
<action android:name="com.xiaomi.mipush.RECEIVE_MESSAGE" />
</intent-filter>
<intent-filter>
<action android:name="com.xiaomi.mipush.ERROR" />
</intent-filter>
</receiver>
<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>
以上代码便可实现你所想要的推送效果。
如果我的代码太分散导致你看不明白,没关系,官方有提供的demo,而且还有官方文档。这里我要提醒大家一些使用上面的问题。
1.APP_ID, APP_KEY必须替换,这个需要去官网申请,首先申请开发者账号,然后发项目上去等待审核,过程大约两三天,不定。
2.把demo中的一些包名改为自己项目的包名,小米demo的handle目前看没什么作用,可以删除这一块。
3.小米demo给的MIPushDemoActivity类我们可以不用,因为在我们项目中有很多类,你也不知道用到哪里。但这两个方法是有用的,我们是必须写进去的。这个就必须是MiPushClient.registerPush(this, APP_ID, APP_KEY);执行成功后才能使用,不然你感觉是很成功的,但是就出不来效果,建议写在onCommandResult方法里,怎么写我上面有提到,把该注意的注意到就ok了。
然后你就可以去你的开发者账户中的项目下面点击推送工具,在里面试着发送一条消息了,发送与接收到信息的效果图如下。记住,发送的时候看清是线上环境还是测试环境,我代码里面也有对这块进行标注。