Android上的推送服务应用程序不会绑定事件

时间:2015-05-04 14:01:40

标签: android-service pusher

我在Android上遇到了Pusher with Service应用程序的问题。

当我在应用程序或活动中使用推动器时,它正在工作。 但是我把它移到了服务中并注册了应用程序,如:

<service android:name=".services.PusherServices"/>

它无法正常工作。 当我启动Service Pusher通过授权连接成功时,但是当我调用注册通道的方法时,它不会绑定事件。

PusherServices.java

package vn.hemlock.winkle.pancake.services;

import android.app.Activity;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;

import com.pusher.client.Pusher;
import com.pusher.client.PusherOptions;
import com.pusher.client.channel.PrivateChannel;
import com.pusher.client.channel.PrivateChannelEventListener;
import com.pusher.client.connection.ConnectionEventListener;
import com.pusher.client.connection.ConnectionState;
import com.pusher.client.connection.ConnectionStateChange;
import com.pusher.client.util.HttpAuthorizer;

import net.windjs.android.utils.Encrypt;
import net.windjs.android.utils.Log;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.HashMap;

import vn.hemlock.winkle.pancake.abstracts.ChatEvents;
import vn.hemlock.winkle.pancake.contracts.ServicesURI;
import vn.hemlock.winkle.pancake.ui.Conversation;
import vn.hemlock.winkle.pancake.ui.Message;
import vn.hemlock.winkle.pancake.ui.Page;

/**
 * Created by me866chuan on 5/4/15.
 */
public class PusherServices extends Service {
    private String LOG_TAG = "Pusher Services";
    private boolean pusherOn = false;
    public final String PUSHER_KEY = "...";
    private String userToken = "";
    private String userID = "";
    private final IBinder mBinder = new LocalBinder();

    public boolean isPusherOn() {
        return pusherOn;
    }

    public void setPusherOn(boolean pusherOn) {
        this.pusherOn = pusherOn;
    }

    public String getUserToken() {
        return userToken;
    }

    public void setUserToken(String userToken) {
        this.userToken = userToken;
    }

    public String getUserID() {
        return userID;
    }

    public void setUserID(String userID) {
        this.userID = userID;
    }

    @Override
    public IBinder onBind(Intent intent) {
        setUserID(intent.getStringExtra("userId"));
        setUserToken(intent.getStringExtra("userToken"));
        startPusher();
        startService(intent);
        return mBinder;
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Log.e(LOG_TAG, "OFF");
        stopService(intent);
        return true;
    }

    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        pusher.disconnect();
    }

    private Pusher pusher;

    public void startPusher() {
        HashMap<String, String> hash = new HashMap<>();
        Log.e(LOG_TAG, "Token: "+getUserToken());
        hash.put("authorization", getUserToken());
        HttpAuthorizer authorizer = new HttpAuthorizer(ServicesURI.PUSHER_AUTHORIZER);
        authorizer.setHeaders(hash);
        PusherOptions options = new PusherOptions().setAuthorizer(authorizer);

        pusher = new Pusher(PUSHER_KEY, options);

        pusher.connect(new ConnectionEventListener() {
            @Override
            public void onConnectionStateChange(ConnectionStateChange change) {
                Log.e(LOG_TAG, "State changed to " + change.getCurrentState() +
                        " from " + change.getPreviousState());
                if(change.getCurrentState().toString().toUpperCase().equals("CONNECTED") || change.getCurrentState().toString().toUpperCase().equals("CONNECTING")){
                    setPusherOn(true);
                }
                else setPusherOn(false);
            }

            @Override
            public void onError(String message, String code, Exception e) {
                Log.e(LOG_TAG, "There was a problem connecting: " + message);
            }
        }, ConnectionState.ALL);
    }

    PrivateChannel userChannel;

    public void userListenChanel(final Activity activity) {
        if (pusher == null) return;

        userChannel = pusher.subscribePrivate("private-" + Encrypt.stringMD5(getUserID()));

        userChannel.bind("fetch_accounts", new PrivateChannelEventListener() {
            @Override
            public void onEvent(String channel, String event, final String data) {
                Log.e(LOG_TAG, "Received event with data: " + data);
                if (activity != null) activity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            ChatEvents.getInstance().onNewPage(new Page((new JSONObject(data)).getJSONObject("page")));
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                });
            }

            @Override
            public void onAuthenticationFailure(String s, Exception e) {
                Log.e(LOG_TAG, "USER FETCH FAIL: " + s);
            }

            @Override
            public void onSubscriptionSucceeded(String s) {
                Log.e(LOG_TAG, "USER FETCH SUCCESS: " + s);
            }
        });
    }

    PrivateChannel pageChannel;

    private String idPageChannelListen;

    public void pageListenChanel(final Activity activity, String pageId) {
        if (pusher == null) return;
        idPageChannelListen = pageId;
        Log.e(LOG_TAG, "Channel page: "+"private-" + Encrypt.stringMD5(pageId));
        pageChannel = pusher.subscribePrivate("private-" + Encrypt.stringMD5(pageId));

        pageChannel.bind("realtime_updates", new PrivateChannelEventListener() {
            @Override
            public void onEvent(String channel, String event, final String data) {
                Log.e(LOG_TAG, "Real time update with data: " + data);
                JSONObject jsonObject = null;
                try {
                    jsonObject = new JSONObject(data);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                final JSONObject finalJsonObject = jsonObject;
                if(activity != null) activity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if (finalJsonObject == null) return;
                        try {
                            if (finalJsonObject.has("message")) ChatEvents.getInstance().onNewMessage(new Message(finalJsonObject.getJSONObject("message")));
                            else if (finalJsonObject.has("conversation")) ChatEvents.getInstance().onNewConversation(new Conversation(finalJsonObject.getJSONObject("conversation")));
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                });
            }

            @Override
            public void onAuthenticationFailure(String s, Exception e) {
                Log.e(LOG_TAG, "Real time update failed: " + s);
            }

            @Override
            public void onSubscriptionSucceeded(String s) {
                Log.e(LOG_TAG, "Real time update successed: " + s);
            }
        });

        pageChannel.bind("fetch_conversations", new PrivateChannelEventListener() {
            @Override
            public void onEvent(String channel, String event, final String data) {
                Log.e(LOG_TAG, "Received event with data: " + data);
                if(activity != null) activity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            ChatEvents.getInstance().onNewConversation(new Conversation((new JSONObject(data)).getJSONObject("conversation")));
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                });
            }

            @Override
            public void onAuthenticationFailure(String s, Exception e) {

            }

            @Override
            public void onSubscriptionSucceeded(String s) {

            }
        });

        pageChannel.bind("fetch_comments", new PrivateChannelEventListener() {
            @Override
            public void onEvent(String channel, String event, String data) {
                Log.e(LOG_TAG, "Received event with data: " + data);
            }

            @Override
            public void onAuthenticationFailure(String s, Exception e) {

            }

            @Override
            public void onSubscriptionSucceeded(String s) {

            }
        });
    }

    public void removeLisnterPage(String pageId) {
        if (pusher != null) pusher.unsubscribe("private-" + Encrypt.stringMD5(pageId));
        idPageChannelListen = "";
    }

    public void reconnectPusher() {
        if (pusher != null) {
            pusher.disconnect();
            pusher.connect();
        }
    }

    public void disconnectPusher() {
        if (pusher != null) pusher.disconnect();
    }

    public String getIdPageChannelListen() {
        return idPageChannelListen;
    }

    public class LocalBinder extends Binder {
        public PusherServices getService() {
            // Return this instance of LocalService so clients can call public methods
            return PusherServices.this;
        }
    }
}

0 个答案:

没有答案