開題先說明寫這個推送的原因,據公司調研,小米會屏蔽其它推送發送過來的消息,而我們產品的安卓端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>
以上代碼便可實現你所想要的推送效果。