Я создаю приложение для Android, а основная функциональность - в классе ConnectionService
, который в основном обрабатывает связь с веб-сокетом.Моя проблема в том, что если я выйду из приложения с кнопками на моем устройстве износа Android, ошибки не будет, все работает как и ожидалось в фоновом режиме.Но если я проведу влево, выйдя из приложения в меню, то приложение вылетает (насколько я знаю, в этом случае работает метод onDestroy
. Поэтому я получаю следующую ошибку:
Activity com.example.adambodnar.canary.MainActivity has leaked ServiceConnection com.example.adambodnar.canary.MainActivity$4@79552f9 that was originally bound here
android.app.ServiceConnectionLeaked: Activity com.example.adambodnar.canary.MainActivity has leaked ServiceConnection com.example.adambodnar.canary.MainActivity$4@79552f9 that was originally bound here
Я прочитал много вопросов по этому поводу, но не смог найти решение, соответствующее моей проблеме. Служба работает в фоновом режиме как служба переднего плана, поэтому я не хочучтобы остановить его запуск.
Вот это MainActivity.class
public class MainActivity extends FragmentActivity {
private static ConnectionService mService;
private boolean mBound = false;
private final FragmentManager supportFragmentManager = getSupportFragmentManager();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
supportFragmentManager.beginTransaction().replace(R.id.fragment_container, new MainFragment()).commit();
if(!PermissionHelper.hasPermissions(this, Constants.PERMISSIONS)){
ActivityCompat.requestPermissions(this, Constants.PERMISSIONS, Constants.PERMISSION_ALL);
}
Intent intent = new Intent(this, ConnectionService.class);
this.startService(intent);
this.bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className,
IBinder service) {
ConnectionService.LocalBinder binder = (ConnectionService.LocalBinder) service;
mService = binder.getServiceInstance();
mBound = true;
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
mBound = false;
}
};
public static void sendMessage(String message) {
mService.sendMessage(message);
}
public static void rebuildWebSocketConnection() {
mService.rebuildWebSocketConnection();
}
}
И мой ConnectionService
:
public class ConnectionService extends Service {
private WebSocketHelper webSocketHelper = new WebSocketHelper();
private final String TAG = "ConnectionService";
private final IBinder mBinder = new LocalBinder();
public class LocalBinder extends Binder {
public ConnectionService getServiceInstance() {
return ConnectionService.this;
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.i(TAG, "SERVICE IS BINDED");
return mBinder;
}
@Override
public void onCreate() {
System.out.println("ON CREATE OF CONNECTION SERVICE");
super.onCreate();
Intent notificationIntent = new Intent(this, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
notificationIntent, 0);
Notification notification = new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("My Awesome App")
.setContentText("Doing some work...")
.setContentIntent(pendingIntent).build();
startForeground(1337, notification);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(TAG, "--- Connection Service onStartCommand ---");
super.onStartCommand(intent, flags, startId);
return START_STICKY;
}
public void sendMessage(String message) {
Log.d(TAG, "WebSocketHelper is open: " + webSocketHelper.isWebSocketOpen());
if (webSocketHelper.isWebSocketOpen()) {
Log.i(TAG, "--- WebSocket Message: " + message + " ---");
webSocketHelper.sendMessage(message);
}
}
}
Так что я должен сделать, чтобы сделать этоошибка исчезнет?