不朽的服务

时间:2018-06-02 20:19:07

标签: java android

我需要实现一个项目,比如聊天。我们决定使用Socket.IO库。 FCM未被考虑。使用Service在后​​台接收邮件。这里:

public class SocketServiceProvider extends Service {

    private Socket mSocket;

    private final String EVENT_NEW_MESSAGE = "new_message";
    private final String LOG_TAG = "SocketServiceProvider";

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.e(LOG_TAG, "created()");
        realm = Realm.getDefaultInstance();
        startForeground(1, new Notification());
        if (mSocket == null)
            mSocket = BaseApplication.getSocket();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e(LOG_TAG, "onStartedCommand()");

        startSocket();

        return START_STICKY;
    }

    private void startSocket() {
        if (mSocket.connected()){
            stopSocket();
        }

        mSocket.on(Socket.EVENT_CONNECT, onConnect);
        mSocket.on(EVENT_NEW_MESSAGE, onNewMessage);

        mSocket.connect();
    }

    private void stopSocket() {
        mSocket.off();
        mSocket.disconnect();
    }

    private Emitter.Listener onConnect = new Emitter.Listener() {
        @Override
        public void call(Object... args) {
            new Handler(Looper.getMainLooper()).post(() -> {
                if (mSocket.connected()) {
                    isOnline = true;
                    Log.e(LOG_TAG, "Connected!");
                }
            });
        }
    };

    private Emitter.Listener onNewMessage = args -> {
        final JSONObject data = (JSONObject) args[0];
        final String username;
        final String message;
        try {
            username = data.getString("from");
            message = data.getString("message");
        } catch (JSONException e) {
            Log.e("MainActivity", e.getMessage());
            return;
        }

        Log.e(LOG_TAG, username + " wrote: " + message);
    };

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.e(LOG_TAG, "onDestroy()");

        stopSocket();

        ContextCompat.startForegroundService(this, new Intent(this, SocketServiceProvider.class));
    }
}

唯一的问题是,当手机进入Doze mode时,信息不会出现。试图在AlarmManager onTaskRemoved()onDestroy()醒来,但未成功。

即使onDestroy()试图调用BroadcastReceiver,以便它重新启动我的服务,只是不明白原因,但其onReceive()方法不起作用。

这是我的最后一个选项,即发布的代码。有我startForegroundService。这个选项起作用,至少不会死亡。只有在这种情况下,电池才能快速放电

谷歌搜索,使用JobIntentService写这个可以实现,但没有详细描述。

问题:如何做到这一点以及如何实现这些任务?如何通过JobIntentService实现这一目标?

0 个答案:

没有答案