我需要实现一个项目,比如聊天。我们决定使用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
实现这一目标?