簡體   English   中英

Android GCM將令牌發送到服務器

[英]Android GCM Sending token to server

GCM示例項目提供了將GCM令牌發送到服務器的簡單示例:

public class RegistrationIntentService extends IntentService {

    ...

    @Override
    protected void onHandleIntent(Intent intent) {
        try {
            ...
            String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId),
                    GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);

            Log.i(TAG, "GCM Registration Token: " + token);

            // TODO: Implement this method to send any registration to your app's servers.
            sendRegistrationToServer(token);
            ...
        } catch (Exception e) {
            ...
        }
    }

    /**
     * Persist registration to third-party servers.
     *
     * Modify this method to associate the user's GCM registration token with any server-side account
     * maintained by your application.
     *
     * @param token The new token.
     */
    private void sendRegistrationToServer(String token) {
        // Add custom implementation, as needed.
    }
}

但這是在IntentService中完成的,只要onHandleIntent返回正確,該服務IntentService完成? 因此,如果使用流行的android-async-http庫啟動http調用以發送令牌,我什至看不到onStart命中:

private void sendRegistrationToServer(String token) {
    post("/devices", params, new AsyncHttpResponseHandler() {
        // TODO: MAKE SURE ONSTART ACTUALLY CALLED TO MAKE SURE REQUEST AT LEAST GOES UPSTREAM EVEN IF I DON'T RECEIVE A CALLBACK SINCE IN INTENTSERVICE
        // IF NOT THEN MIGHT HAVE TO CHANGE THE INTENTSERVICE TO A SERVICE FOR DEVICE REGISTRATION
        @Override
        public void onStart() {
            // not actually using callback because request sent from intentservice
            Log.d("tagzzz", "sending upstream");
        }

        @Override
        public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
            // not actually using callback because request sent from intentservice
        }

        @Override
        public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
            // not actually using callback because request sent from intentservice
        }
    });
}

onHandleIntent返回並完成IntentService之前,我的http請求是否還會發送到上游? 如果沒有,為什么Google會以此為例將您的令牌發送到您的服務器?

在onHandleIntent返回並完成IntentService之前,我的http請求是否還會發送給上游?

假設您使用的是名為“ android-async-http”的庫,我將假定默認行為是它異步執行HTTP。 不確定post()調用是否會在onHandleIntent()返回之前完成其工作,但這似乎不太可能。

Google為什么將其作為將令牌發送到服務器的示例?

Google不會。 Google有一個存根sendRegistrationToServer() ,您可以在第一個代碼清單中看到。 我不知道使用“ android-async-http”庫的任何Google示例。

決定使用異步機制來發送該HTTP請求。 對於IntentService這是不合適的選擇。 現在,也許該庫具有同步選項,在這種情況下,您可以切換到該選項。 否則,請對來自IntentService的HTTP請求使用其他同步對象( HttpURLConnection ,OkHttp3等)。

請注意,在這種情況下,Volley並不是一個很好的選擇,因為Volley也非常傾向於異步工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM