В андроиде есть способ проверить, привязан ли сервис уже перед привязкой к нему?
У меня есть несколько операций с фрагментами, и одна из них связана с сервисом, который постоянно получает сообщения. Когда я переключался между действиями в один момент, я получаю следующую ошибку. Я не знаю, как нажимается элемент списка, где service
ограничен. В любом случае мне было интересно, могу ли я добавить чек, прежде чем связать, чтобы увидеть, если service
уже запущен и подключен.
04-08 10:34:54.674: E/ActivityThread(21091): Activity com.MyApp.MyFirstClass has leaked ServiceConnection com.MyApp.MyFirstClass$2@42c84158 that was originally bound here
04-08 10:34:54.674: E/ActivityThread(21091): android.app.ServiceConnectionLeaked: Activity com.MyApp has leaked ServiceConnection com.MyApp.MyFirstClass$2@42c84158 that was originally bound here
04-08 10:34:54.674: E/ActivityThread(21091): at android.app.LoadedApk$ServiceDispatcher.<init>(LoadedApk.java:974)
04-08 10:34:54.674: E/ActivityThread(21091): at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:868)
04-08 10:34:54.674: E/ActivityThread(21091): at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:1960)
04-08 10:34:54.674: E/ActivityThread(21091): at android.app.ContextImpl.bindService(ContextImpl.java:1943)
04-08 10:34:54.674: E/ActivityThread(21091): at android.content.ContextWrapper.bindService(ContextWrapper.java:529)
04-08 10:34:54.674: E/ActivityThread(21091): at com.MyApp.MyFirstClass.onItemClick(MyFirstClass.java:1140)
04-08 10:34:54.674: E/ActivityThread(21091): at android.widget.AdapterView.performItemClick(AdapterView.java:313)
04-08 10:34:54.674: E/ActivityThread(21091): at android.widget.AbsListView.performItemClick(AbsListView.java:1529)
04-08 10:34:54.674: E/ActivityThread(21091): at android.widget.AbsListView$PerformClick.run(AbsListView.java:3560)
04-08 10:34:54.674: E/ActivityThread(21091): at android.widget.AbsListView$3.run(AbsListView.java:5277)
04-08 10:34:54.674: E/ActivityThread(21091): at android.os.Handler.handleCallback(Handler.java:733)
04-08 10:34:54.674: E/ActivityThread(21091): at android.os.Handler.dispatchMessage(Handler.java:95)
04-08 10:34:54.674: E/ActivityThread(21091): at android.os.Looper.loop(Looper.java:146)
04-08 10:34:54.674: E/ActivityThread(21091): at android.app.ActivityThread.main(ActivityThread.java:5635)
04-08 10:34:54.674: E/ActivityThread(21091): at java.lang.reflect.Method.invokeNative(Native Method)
04-08 10:34:54.674: E/ActivityThread(21091): at java.lang.reflect.Method.invoke(Method.java:515)
04-08 10:34:54.674: E/ActivityThread(21091): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)
04-08 10:34:54.674: E/ActivityThread(21091): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)
04-08 10:34:54.674: E/ActivityThread(21091): at dalvik.system.NativeStart.main(Native Method)
3 ответа
Не уверен, что вы когда-нибудь нашли адекватный ответ, но я только что создал класс-обертку, который я назвал ExtendedServiceConnection
который в основном имел возможность отслеживать и проверять, был ли привязан этот Сервис.
Просто немного чище, затем держу глобал в константах.
private class ExtendedServiceConnection implements ServiceConnection {
private boolean isServiceConnected = false;
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Timber.d("Service Connection established with " + name.getShortClassName());
isServiceConnected=true;
}
@Override
public void onServiceDisconnected(ComponentName name) {
Timber.d("Service Connection destroyed with " + name.getShortClassName());
isServiceConnected=false;
}
public boolean isServiceConnected() {
return isServiceConnected;
}
}
использование
public void onReceivePause() {
if (mExtendedServiceConnection.isServiceConnected()) {
unbindService(orientationServiceConnection);
}
handleNotifications(mPackage.isIntentionalPaused());
}
Не должно быть каких-то подключений к сервису, которые вы теряете. Для каждого bindService() должен быть unbindService() - с тем же Намерением. Как я знаю, лучший способ связать в методе onResume() (не в onCreate) и отсоединить в onPause().
Нет прямого способа сделать это, но вы можете сделать это, принимая объект сервиса как статический и связывая сервис через него
/** Defines callbacks for service binding, passed to bindService() */
private ServiceConnection mConnection = new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName className, IBinder service)
{
// We've bound to LocalService, cast the IBinder and get
// LocalService instance
LocalBinder binder = (LocalBinder) service;
Constant.mService = binder.getService();
mBound = true;
}
@Override
public void onServiceDisconnected(ComponentName arg0)
{
mBound = false;
}
};
в приведенном выше коде Constant.mService является статическим
так что теперь из любого места вы можете проверить, является ли служба привязкой или нет, выполнив
if (Constant.mService != null)
{
Constant.mService.stopService();
Constant.mService = null;
}
в приведенном выше примере Constant.mService является объектом вашего класса обслуживания