Урок 98. Service. Локальный биндинг
Re: Урок 98. Service. Локальный биндинг
как по мне сервис работает сам по себе, а в контент провайдере сделать inner class которым и будет хелпер, провайдер работает с хелпером, а сервис с провайдером.
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 98. Service. Локальный биндинг
аналогичная ситуация. никто не подскажет - как это побороть?etlt писал(а):Подскажите кто сталкивался:
код из примера на строчке
myService = ((MyService.MyBinder) binder).getService();
выходит ошибка приложения и полное зависание
Класс MyBinder в MyService существует, по идеи все должно работать, но "binder" почему то не приводится к MyService.MyBinder - ошибка
Re: Урок 98. Service. Локальный биндинг
была аналогичная проблема... решилось очень просто...Imalur писал(а):аналогичная ситуация. никто не подскажет - как это побороть?etlt писал(а):Подскажите кто сталкивался:
код из примера на строчке
myService = ((MyService.MyBinder) binder).getService();
выходит ошибка приложения и полное зависание
Класс MyBinder в MyService существует, по идеи все должно работать, но "binder" почему то не приводится к MyService.MyBinder - ошибка
дело в том что сервис должен запускаться в основном потоке... почти наверняка уверен что Вы в манифесте при описании сервиса использовали android:process=":nameofbindingprocess"
уберите эту строчку - и все заработает
пользуясь случаем (хе, где-то это я уже слышал, вернее видел ) хочу поблагодарить автора проекта... некоторые вещи почерпнул именно у Вас, т.к внятно на русском инфы по разработке для андроид очень мало
Re: Урок 98. Service. Локальный биндинг
Попробовал примерчик, при работе в одном процессе, все просто прекрасно, жаль так нельзя делать при разнесении элементов в разные процессы.
Мне нужен был доступ к Singleton'у основного процесса из сервиса в другом процессе, пришлось через AIDL делать.
Мне нужен был доступ к Singleton'у основного процесса из сервиса в другом процессе, пришлось через AIDL делать.
Re: Урок 98. Service. Локальный биндинг
Есть сервис, который запускается с загрузкой телефона, отслеживает координаты и с заданным интервалом отправляет их гет запросом на сервер.. Кроме того есть приложение способное просматривать некоторую инфу от сервиса, а так же выключать и включать отправку данных (да и вообще запускать и останавливать сервис). Вопрос: как вы считаете, удастся ли обойтись биндингом или придётся делать через AIDL?? Спасибо.neoksi писал(а):Попробовал примерчик, при работе в одном процессе, все просто прекрасно, жаль так нельзя делать при разнесении элементов в разные процессы.
Мне нужен был доступ к Singleton'у основного процесса из сервиса в другом процессе, пришлось через AIDL делать.
Re: Урок 98. Service. Локальный биндинг
Ключевое тут слово "процесс", если указанные модули программы запускаются в одном процессе и иное не описано в их объявлении в манифесте, то подойдет локальный биндинг. Но если вы разнесли модули в разные процессы, то тут уже нужен AIDL.brucemax писал(а):Есть сервис, который запускается с загрузкой телефона, отслеживает координаты и с заданным интервалом отправляет их гет запросом на сервер.. Кроме того есть приложение способное просматривать некоторую инфу от сервиса, а так же выключать и включать отправку данных (да и вообще запускать и останавливать сервис). Вопрос: как вы считаете, удастся ли обойтись биндингом или придётся делать через AIDL?? Спасибо.neoksi писал(а):Попробовал примерчик, при работе в одном процессе, все просто прекрасно, жаль так нельзя делать при разнесении элементов в разные процессы.
Мне нужен был доступ к Singleton'у основного процесса из сервиса в другом процессе, пришлось через AIDL делать.
Re: Урок 98. Service. Локальный биндинг
Вот именно, что это разные приложения (следовательно, я подразумеваю, и процессы разные ). Ибо сервис у меня должен работать и без приложения.neoksi писал(а): Ключевое тут слово "процесс", если указанные модули программы запускаются в одном процессе и иное не описано в их объявлении в манифесте, то подойдет локальный биндинг. Но если вы разнесли модули в разные процессы, то тут уже нужен AIDL.
Re: Урок 98. Service. Локальный биндинг
Если разные приложения, то значит и разные процессы, в таком случае, только AIDL.brucemax писал(а):Вот именно, что это разные приложения (следовательно, я подразумеваю, и процессы разные ). Ибо сервис у меня должен работать и без приложения.neoksi писал(а): Ключевое тут слово "процесс", если указанные модули программы запускаются в одном процессе и иное не описано в их объявлении в манифесте, то подойдет локальный биндинг. Но если вы разнесли модули в разные процессы, то тут уже нужен AIDL.
Re: Урок 98. Service. Локальный биндинг
Что и требовалось доказать! Держи спасибо)))neoksi писал(а): Если разные приложения, то значит и разные процессы, в таком случае, только AIDL.
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Урок 98. Service. Локальный биндинг
Чисто технически вы все верно написали , но с точки зрения архитектуры, у меня вопрос. А зачем два приложения??? Можно сделать одно приложение с локальным биндингом без аидл. Оно будет прекрасно запускать сервис прим мирте телефона, не запускаю активность приложения. Можно и с аидл сделать. Делать два приложения в этом контексте задачи бессмысленно. У нас аналогичное приложение, работаем с одной программы.
Re: Урок 98. Service. Локальный биндинг
Идея такова, что контингент пользователей будет делиться на тех, у кого только постоянно крутиться сервис (это большинство) и на тех кто может посмотреть инфу об этом сервисе, подстроить его и т.д. Можно конечно сделать всё и в одной прилаге, и допускать человека до нужных функций с помощью пароля, но тогда обычный пользователь удалив это приложение удалит и сервис, а этого бы не хотелось (есть стремление сделать пребывание сервиса как можно незаметней для пользователя). А тут у сервиса иконки никакой не будет даже и ничего не мозолит глаза.)) Только не подумайте, что это очередная шпионская программаno-- писал(а):Чисто технически вы все верно написали , но с точки зрения архитектуры, у меня вопрос. А зачем два приложения??? Можно сделать одно приложение с локальным биндингом без аидл. Оно будет прекрасно запускать сервис прим мирте телефона, не запускаю активность приложения. Можно и с аидл сделать. Делать два приложения в этом контексте задачи бессмысленно. У нас аналогичное приложение, работаем с одной программы.
Вот хорошо, что вы спросили, это заставило посмотреть со стороны
P.S. Да и вообще давно пора бы уже познакомиться с этим AIDL .. и повод нашёлся)
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Урок 98. Service. Локальный биндинг
Тогда наперед могу сказать про аидл, что:
1. Соединение активности с сервисом проходит спустя где-то 50 миллисекунд. Так что не стоит делать bindservice и сразу вызывать методы сервиса, получишь null.
2. Для аидл нужен будет файл .aidl . Бывают с ним глюки. Project>refresh обычно помогает
1. Соединение активности с сервисом проходит спустя где-то 50 миллисекунд. Так что не стоит делать bindservice и сразу вызывать методы сервиса, получишь null.
2. Для аидл нужен будет файл .aidl . Бывают с ним глюки. Project>refresh обычно помогает
Re: Урок 98. Service. Локальный биндинг
Спасибо!!!no-- писал(а):Тогда наперед могу сказать про аидл, что:
1. Соединение активности с сервисом проходит спустя где-то 50 миллисекунд. Так что не стоит делать bindservice и сразу вызывать методы сервиса, получишь null.
2. Для аидл нужен будет файл .aidl . Бывают с ним глюки. Project>refresh обычно помогает
Re: Урок 98. Service. Локальный биндинг
Добавил бы сюда: Дабы сохранить идентичность аидл файлов в двух разных приложения, пришлось в клиентском создавать одноимённый пакет сервиса, что бы пакеты прописанные в файлах были одинаковыми. В противном случае всё рушилось сno-- писал(а):Тогда наперед могу сказать про аидл, что:
1. Соединение активности с сервисом проходит спустя где-то 50 миллисекунд. Так что не стоит делать bindservice и сразу вызывать методы сервиса, получишь null.
2. Для аидл нужен будет файл .aidl . Бывают с ним глюки. Project>refresh обычно помогает
Пол часа убилось из-за этогоjava.lang.SecurityException: Binder invocation to an incorrect interface
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Урок 98. Service. Локальный биндинг
Ну это уже с точки зрения самой Java как по мне. Я такие пакеты называю обычно my.packagename.security.common
Ну или просто my.packagename.common
Найдите себе уникальное имя, зарегистрируйте домен и придерживайтесь именований пакетов.
Ну или просто my.packagename.common
Найдите себе уникальное имя, зарегистрируйте домен и придерживайтесь именований пакетов.
Re: Урок 98. Service. Локальный биндинг
Я так понимаю логично их делать после и/или в методе onServiceConnected().no-- писал(а):Так что не стоит делать bindservice и сразу вызывать методы сервиса, получишь null.
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Урок 98. Service. Локальный биндинг
Именно внутри метода onServiceConnected. Этот метод вызывается после соединения с сервисом. Это один вариант.
Второй вариант, это как писал neoksi, тут. Пример не очень правда. Другими словами, после биндинга, вызвать проверку на доступность сервиса. в цикле, с периодическими засыпаниями потока.
Второй вариант, это как писал neoksi, тут. Пример не очень правда. Другими словами, после биндинга, вызвать проверку на доступность сервиса. в цикле, с периодическими засыпаниями потока.
Re: Урок 98. Service. Локальный биндинг
Про цикл с периодическими засыпаниями не понял(именно его необходимость, разве недостаточно контрольной переменной в методах подключения/отключения сервиса) У меня сервис отдельное приложение. Когда прилага работающая с ним запускается, она проверяет запущен ли этот сервис и биндится к нему в зависимости от этого. В onServiceConnected() выставляю булеву переменную в тру(как в уроке), и каждый раз её проверяю. перед вызовом метода сервиса (через аидл)..
Re: Урок 98. Service. Локальный биндинг
вообщем проблема такая есть сервис и с ним нужно взаимодействовать делаю так:
вот кусок кода основного активити:
вот, при попытке вызова метода сервиса в активити вылетает ошибка
лог :
05-30 00:49:07.931: E/AndroidRuntime(30783): FATAL EXCEPTION: main
05-30 00:49:07.931: E/AndroidRuntime(30783): java.lang.RuntimeException: Unable to start activity ComponentInfo{san_epo_21.mp3player/san_epo_21.mp3player.MainActivity}: java.lang.NullPointerException
05-30 00:49:07.931: E/AndroidRuntime(30783): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2084)
05-30 00:49:07.931: E/AndroidRuntime(30783): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2111)
05-30 00:49:07.931: E/AndroidRuntime(30783): at android.app.ActivityThread.access$600(ActivityThread.java:134)
05-30 00:49:07.931: E/AndroidRuntime(30783): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1251)
05-30 00:49:07.931: E/AndroidRuntime(30783): at android.os.Handler.dispatchMessage(Handler.java:99)
05-30 00:49:07.931: E/AndroidRuntime(30783): at android.os.Looper.loop(Looper.java:137)
05-30 00:49:07.931: E/AndroidRuntime(30783): at android.app.ActivityThread.main(ActivityThread.java:4666)
05-30 00:49:07.931: E/AndroidRuntime(30783): at java.lang.reflect.Method.invokeNative(Native Method)
05-30 00:49:07.931: E/AndroidRuntime(30783): at java.lang.reflect.Method.invoke(Method.java:511)
05-30 00:49:07.931: E/AndroidRuntime(30783): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)
05-30 00:49:07.931: E/AndroidRuntime(30783): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)
05-30 00:49:07.931: E/AndroidRuntime(30783): at dalvik.system.NativeStart.main(Native Method)
05-30 00:49:07.931: E/AndroidRuntime(30783): Caused by: java.lang.NullPointerException
05-30 00:49:07.931: E/AndroidRuntime(30783): at san_epo_21.mp3player.MainActivity.onStart(MainActivity.java:108) // вот тут показывает как раз на вызов метода из сервиса
05-30 00:49:07.931: E/AndroidRuntime(30783): at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1136)
05-30 00:49:07.931: E/AndroidRuntime(30783): at android.app.Activity.performStart(Activity.java:4520)
05-30 00:49:07.931: E/AndroidRuntime(30783): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2057)
в чем я ошибся 3 день мучаюсь...
Код: Выделить всё
public class MusicService extends Service {
private static final String TAG = "TAG";
private PlayList DevicePlayList = null;
private OnLinePlayList OnLinePlayList = null;
private boolean Device = true;
MyBinder binder = new MyBinder();
public void onCreate() {
super.onCreate();
prepare_service();
}
public void onDestroy() {
super.onDestroy();
}
public class MyBinder extends Binder {
public MusicService getService() {
return MusicService.this;
}
}
public IBinder onBind(Intent intent) {
return binder;
}
private void prepare_service(){
тут что делаю
}
HashMap<String, String> getTrackInform(){ // этот метод нужно вызвать в основном активити
return DevicePlayList.GetTrackInform();
}
Код: Выделить всё
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mainlayout);
IntitView();
}
private void IntitView(){
backToList = (ImageButton) findViewById(R.id.buttonListView);
backToList.setOnClickListener(this);
online_search = (ImageButton) findViewById(R.id.button_online_search);
online_search.setOnClickListener(this);
intent = new Intent(this, MusicService.class);
sConn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder binder) {
music_service = ((MusicService.MyBinder) binder).getService(); // получаем сылку обьект на сервис
bound = true;
}
@Override
public void onServiceDisconnected(ComponentName binder) {
bound = false;
}
};
// стартуем сервис
startService(intent);
//bindService(intent, sConn, 0);
//change_inform_device(music_service.getTrackInform());
gestureScanner = new GestureDetector(this);
}
@Override
protected void onStart() {
super.onStart();
bindService(intent, sConn, 0);
HashMap<String, String> data = music_service.getTrackInform();
}
@Override
protected void onStop() {
super.onStop();
if (!bound) return;
unbindService(sConn);
bound = false;
}
лог :
05-30 00:49:07.931: E/AndroidRuntime(30783): FATAL EXCEPTION: main
05-30 00:49:07.931: E/AndroidRuntime(30783): java.lang.RuntimeException: Unable to start activity ComponentInfo{san_epo_21.mp3player/san_epo_21.mp3player.MainActivity}: java.lang.NullPointerException
05-30 00:49:07.931: E/AndroidRuntime(30783): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2084)
05-30 00:49:07.931: E/AndroidRuntime(30783): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2111)
05-30 00:49:07.931: E/AndroidRuntime(30783): at android.app.ActivityThread.access$600(ActivityThread.java:134)
05-30 00:49:07.931: E/AndroidRuntime(30783): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1251)
05-30 00:49:07.931: E/AndroidRuntime(30783): at android.os.Handler.dispatchMessage(Handler.java:99)
05-30 00:49:07.931: E/AndroidRuntime(30783): at android.os.Looper.loop(Looper.java:137)
05-30 00:49:07.931: E/AndroidRuntime(30783): at android.app.ActivityThread.main(ActivityThread.java:4666)
05-30 00:49:07.931: E/AndroidRuntime(30783): at java.lang.reflect.Method.invokeNative(Native Method)
05-30 00:49:07.931: E/AndroidRuntime(30783): at java.lang.reflect.Method.invoke(Method.java:511)
05-30 00:49:07.931: E/AndroidRuntime(30783): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)
05-30 00:49:07.931: E/AndroidRuntime(30783): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)
05-30 00:49:07.931: E/AndroidRuntime(30783): at dalvik.system.NativeStart.main(Native Method)
05-30 00:49:07.931: E/AndroidRuntime(30783): Caused by: java.lang.NullPointerException
05-30 00:49:07.931: E/AndroidRuntime(30783): at san_epo_21.mp3player.MainActivity.onStart(MainActivity.java:108) // вот тут показывает как раз на вызов метода из сервиса
05-30 00:49:07.931: E/AndroidRuntime(30783): at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1136)
05-30 00:49:07.931: E/AndroidRuntime(30783): at android.app.Activity.performStart(Activity.java:4520)
05-30 00:49:07.931: E/AndroidRuntime(30783): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2057)
в чем я ошибся 3 день мучаюсь...
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Урок 98. Service. Локальный биндинг
Сервис соединяется какое-то время. Попробуй вызвать метод сервиса в методе onServiceConnected, в самом конце. И думаю стоит убрать биндинг сервиса в onStart, раз уж он делается в onCreate.