问题遇到的现象和发生背景
我在MainActivity中通过bindService方式绑定了一个服务,并在服务的onbind回调中启动socket对象,在服务的onDestroy中销毁socket,当我在MainActivity的onDestroy中解绑服务,总是不能正常打印socket被销毁的log。而我在主界面中创建按钮然后在按钮点击响应中unbindService,socket每次都能正常显示销毁的log,那么问题来了,在MainActivity的onDestroy中解绑服务是否能触发服务的onbind和onDestroy呢?debug模式下也进不去MainActivity的onDestroy,每次在手机后台划掉APP就直接没输出了。
问题相关代码,请勿粘贴截图
主页面绑定服务
Intent myServiceIntent;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myServiceIntent = new Intent(MainActivity.this, MyService.class);
bindService(myServiceIntent, coon, Context.BIND_AUTO_CREATE);
}
//销毁时解绑
protected void onDestroy()
{
super.onDestroy();
if (BuildConfig.DEBUG) Log.d(TAG, "APP销毁");
KeepManager.getInstance().unregisterKeep(this);
//页面销毁时解绑
if(isBind)
{
if (BuildConfig.DEBUG) Log.d(TAG, "服务要解绑了啊");
unbindService(coon);
isBind=false;
}
}
//通过按钮解绑
public void myButtonClick(@NonNull View v)
{
if(isBind)
{
if (BuildConfig.DEBUG) Log.d(TAG, "服务要解绑了啊");
unbindService(coon);
isBind=false;
}
}
服务端代码
@Override
public IBinder onBind(Intent intent) {
Log.d(TAG, "onBind: ");
// TODO: Return the communication channel to the service.
// throw new UnsupportedOperationException("Not yet implemented");
//开启TCP线程
try {
//从配置文件获取服务器地址和端口号
String s_ServerIP= ReadPropertyUtil.getProperty(this,"serverip");
int i_Port = Integer.parseInt( ReadPropertyUtil.getProperty(this,"serverport"));
xx = TcpClient.getInstance(s_ServerIP, i_Port, RecvHandler);
new Thread(xx).start();
} catch (IOException e) {
e.printStackTrace();
}
return iBinder;
}
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate: ");
iBinder = new MyBinder();
InitAlarm();
//初始化消息处理器,处理接收到的的上位机信息
initHandler();
}
@Override
public void onDestroy() {
Log.d(TAG, "onDestroy: ");
xx.onDestroy();
super.onDestroy();
}
@Override
public void onTaskRemoved(Intent rootIntent)
{
if (BuildConfig.DEBUG) Log.d(TAG, "强制退出了");
}
@Override
public boolean onUnbind(Intent intent) {
Log.d(TAG, "onUnbind: ");
return super.onUnbind(intent);
}
运行结果及报错内容
当我在手机后台划掉APP时,主页面销毁日志要么没有,要么打印到“APP销毁”或“服务开始解绑”就没下文了。
而当我点击按钮进行服务解绑时,可以看到所有的日志:
2022-01-24 10:13:23.960 7790-7790/com.example.myapplication D/MyBindService: onUnbind:
2022-01-24 10:13:23.960 7790-7790/com.example.myapplication D/MyBindService: onDestroy:
2022-01-24 10:13:23.960 7790-7790/com.example.myapplication D/Tcpsocket: TCP线程开始释放资源了
2022-01-24 10:13:23.963 7790-9735/com.example.myapplication D/Tcpsocket: 接收数据失败了
2022-01-24 10:13:23.964 7790-7790/com.example.myapplication D/Tcpsocket: socket被关闭
这种情况下我怎么能判断当APP被关闭或者被回收后服务以及相关资源有没有正确释放呢?
希望大家不吝赐教。