android中關於實現小米消息推送

     開題先說明寫這個推送的原因,據公司調研,小米會屏蔽其它推送發送過來的消息,而我們產品的安卓端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了。
然後你就可以去你的開發者賬戶中的項目下面點擊推送工具,在裏面試着發送一條消息了,發送與接收到信息的效果圖如下。記住,發送的時候看清是線上環境還是測試環境,我代碼裏面也有對這塊進行標註。
                 最後再提醒大家一個小知識,在設置標籤或別名時最好設置成你應用的用戶名,那樣後臺推送的選擇性更強一些。還錯過了最關鍵的一步,就是一定要架包,不然你的類名都會報錯。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章