我有一个在单独的进程中运行的服务。它用于捕获位置并处理该位置信息。当用户请求位置时,我以前台模式启动它。
当用户注销时,我会清理应用数据,在此期间停止服务并断开与rpc客户端的连接(基本上取消绑定服务)。
如果我再次登录并尝试在前台启动该服务而无需重新启动我的应用程序,则该应用程序不会在前台模式下运行(该服务已在运行)。
我已经注意到并尝试过的事情- -检查服务是否正在运行。怎么样 ?我之间沟通 两个进程(运行服务的进程和另一个通信进程)都使用rpc。该服务还会捕获该位置,并将其发送到另一个仍在工作的进程(例如ui进程)。
Module(ReactApplicationContext reactContext) { //module constructor called when app starts
reactContext.startService(new Intent(reactContext, BackgroundService.class)); //starts sevice
ThreadManager.getWorkerHandler().post(new Runnable() {
@Override
public void run() {
bsClient = new rpcClient(getName(), Module.this.reactContext, new ComponentName(Module.this.reactContext, BackgroundService.class),Module.this); //rpc client starts service and binds the service.
}
});
}
public void cleanAppData(Callback cb) {
bsClient.disconnect(); //disconnects client (just unbinds service and cancels a timer)
reactContext.stopService(new Intent().setComponent(new ComponentName(reactContext, BackgroundService.class)));
bsClient.connect(); //connects the client again and starts the timer
cb.invoke();
}
/////////////////
rpc client connect function
private void _connect(){
try {
Intent intent = new Intent();
intent.setComponent(mComponentName);
mContext.startService(intent);
mContext.bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}
catch (Exception ignored){}
}
public void connect(){
if(timer != null) return;
timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
if(isAlive()) return; //checks if the other process is alive or not
cb.onDisconnect();
_connect();
}
}, 0, 1000);
}
public boolean isAlive() {
return serviceMessenger != null && serviceMessenger.getBinder().pingBinder(); //serviceMessenger is an object for rpc used for sending data
}
由于服务已启动,因此它应该在前台启动并显示一个不启动的通知。 动作顺序是: 1.服务启动,被绑定。 2.服务在前台启动。 (用户在询问位置时启动) 3.如果清除了应用程序数据(在注销时发生),则服务将停止并重新启动。 4.从1开始重复。