GCM onHandleIntent(Intent intent) 未被调用

GCM onHandleIntent(Intent intent) not being called

我在 gcmIntentService 中的 onHandleIntent(Intent intent) 函数具有 GCM 的注册以及对另一个将 gcm 令牌发送到后端数据库的函数的调用变量。当我 运行 我的 MainActivity 时, GcmintentService 的构造函数被调用而 onHandleIntent 没有。这是我的 GcmIntentService

public class GcmIntentService extends IntentService {

    private static final String TAG = "RegIntentService";
    private static final String[] TOPICS = {"global"};
    String senderId = "1048700326431";

    AsyncHttpClient client = new AsyncHttpClient();

    public GcmIntentService() {

        super(TAG);
        Log.i(TAG, "ALWAYS IN HERE");
    }

    @Override
    public void onHandleIntent(Intent intent) {

        Log.i(TAG, " NOW I NEED IT IN HERE");

        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);

        try {
            // [START register_for_gcm]
            // Initially this call goes out to the network to retrieve the token, subsequent calls
            // are local.
            // [START get_token]
            InstanceID instanceID = InstanceID.getInstance(this);
            String token = instanceID.getToken(senderId, GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);

            // [END get_token]
            Log.i(TAG, "GCM Registration Token: " + token);

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

            // Subscribe to topic channels
            subscribeTopics(token);

            // You should store a boolean that indicates whether the generated token has been
            // sent to your server. If the boolean is false, send the token to your server,
            // otherwise your server should have already received the token.
            sharedPreferences.edit().putBoolean(QuickstartPreferences.SENT_TOKEN_TO_SERVER, true).apply();
            // [END register_for_gcm]
        } catch (Exception e) {
            Log.d(TAG, "Failed to complete token refresh", e);
            // If an exception happens while fetching the new token or updating our registration data
            // on a third-party server, this ensures that we'll attempt the update at a later time.
            sharedPreferences.edit().putBoolean(QuickstartPreferences.SENT_TOKEN_TO_SERVER, false).apply();
        }
        // Notify UI that registration has completed, so the progress indicator can be hidden.
        Intent registrationComplete = new Intent(QuickstartPreferences.REGISTRATION_COMPLETE);
        LocalBroadcastManager.getInstance(this).sendBroadcast(registrationComplete);
        }

    /**
     * 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) {
            final RequestParams params = new RequestParams();
            params.put("id", token);

            client.post("", params, new JsonHttpResponseHandler() {

                @Override
                public void onStart() {
                    // called before request is started
                }

                public void onSuccess(int statusCode, PreferenceActivity.Header[] headers, JSONObject response) {

                }

                public void onFailure(int statusCode, PreferenceActivity.Header[] headers, JSONObject errorResponse, Throwable e) {
                    // called when response HTTP status is "4XX" (eg. 401, 403, 404)
                }

                @Override
                public void onRetry(int retryNo) {
                    // called when request is retried
                }
            });
    }

    /**
     * Subscribe to any GCM topics of interest, as defined by the TOPICS constant.
     *
     * @param token GCM token
     * @throws IOException if unable to reach the GCM PubSub service
     */
    // [START subscribe_topics]
    private void subscribeTopics(String token) throws IOException {
        for (String topic : TOPICS) {
            GcmPubSub pubSub = GcmPubSub.getInstance(this);
            pubSub.subscribe(token, "/topics/" + topic, null);
        }
    }

}

您的清单中可能遗漏了这个:

<service
    android:name="your.package.name.RegistrationIntentService"
    android:exported="false">
</service>

我遇到了同样的问题,但通过将其添加到清单中解决了它:

<service
            android:name="com.futec.h2o.RegistrationIntentService"
            android:exported="false" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
            </intent-filter>
        </service>