Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.63
Ametistos
0 / 0 / 0
Регистрация: 23.02.2013
Сообщений: 37
#1

Как получить доступ к сервису? - Программирование Android

22.09.2013, 14:47. Просмотров 1220. Ответов 3
Метки нет (Все метки)

У меня в приложении есть сервис, который запускается вместе с приложением.
Также я создал класс, который наследуется от BroadcastReceiver для мониторинга интернет подключения.

Из метода onReceive(Context context, Intent intent) этого класс я хочу вызвать метод onConnectionStatusChange(boolean isConnected) своего сервиса, но никак не могу придумать как к нему обратиться... У кого нибудь есть идеи?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.09.2013, 14:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как получить доступ к сервису? (Программирование Android):

Как получить доступ к root файлу - Программирование Android
Всем привет. Допустим есть файл, его не видно без доступа к root. Как получить к нему доступ и к примеру скопировать.

Как получить доступ к тексту SMS? - Программирование Android
Тость хочу чтоб когда выскакивает меню набора текста SMS я мог бы туда при нажатие в какую - нибуть область или ещё как, пока это не важно,...

Как получить доступ к элементу в папке по имени? - Программирование Android
Есть, допустим, следующий код Bitmap srcBitmapLocal = BitmapFactory.decodeResource(getApplicationContext().getResources(), ...

Как получить доступ к устаревшим фрагментам после чистки кеша - Программирование Android
Доброго времени суток. Во время написания приложения возникла данная проблема. Возникает она когда пользователь свернув мое приложение...

Как передать сервису состояния checkbox из MainActivity? - Программирование Android
Есть service который запускается из MainActivity и в определённое время запускает метод. Но этот метод должен запускаться только если...

Как получить доступ к методам объекта класса наследуемого от Activity, когда он выводится во вкладку - Программирование Android
В главном Активити создаются вкладки на котовые выводятся другие активити. @Override public void onCreate(Bundle...

3
lavan
53 / 53 / 1
Регистрация: 21.03.2009
Сообщений: 371
22.09.2013, 18:48 #2
У кого нибудь есть идеи?
советую почитать android developer, там про сервисы хорошо расписано и русско язычный http://startandroid.ru/ru/uroki/vse-uroki-spiskom
Вам надо в вашем классе сервисе объявить
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
MService extends Service{
@Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return my_binder;
    }
 
public class MBinder extends Binder{
        public MService getService(){
            return MService.this;
        }
    }
}
А в классе где нужен экземпляр MService нужно коннектиться к сервису
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
private ServiceConnection                      sc;
@Override
    public void onCreate(Bundle savedInstanceState) {
        sc =  new ServiceConnection(){
 
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                // TODO Auto-generated method stub
                ms = ((MService.MBinder)service).getService();
                Log.d("CSC", "connected");
            }
            @Override
            public void onServiceDisconnected(ComponentName name) {
                // TODO Auto-generated method stub
            }
        };
}
@Override
    public void onStart() {
        // TODO Auto-generated method stub
        super.onStart();
        this.getActivity().bindService(new Intent(this.getActivity().getBaseContext(), MService.class), sc, Context.BIND_AUTO_CREATE);
        Log.d("LF", "onStart");
    }
@Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        this.getActivity().unbindService(sc);
        super.onDestroy();
    }
1
Ametistos
0 / 0 / 0
Регистрация: 23.02.2013
Сообщений: 37
23.09.2013, 10:02  [ТС] #3
это все замечательно, когда я хочу подключиться к сервису из класса который наcледуется от Activity, а я хотел подключиться от класса-потомка BroadcastReceiver:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package actforex.trader.services;
 
import actforex.trader.services.TraderService.LocalBinder;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.IBinder;
import android.util.Log;
 
public class ConnectionStateRceiver extends BroadcastReceiver { 
    
    private TraderService ts;
    private ServiceConnection  sc;
    
    public ConnectionStateRceiver() {
        // TODO Auto-generated constructor stub
        Log.e("BroadcastReceiver", "BroadcastReceiver created");
        sc =  new ServiceConnection(){
             
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                // TODO Auto-generated method stub
                ts = ((LocalBinder)service).getService();
                Log.e("CSC", "connected");
            }
            @Override
            public void onServiceDisconnected(ComponentName name) {
                // TODO Auto-generated method stub
            }
        };
        
    }
    
    @Override
    public void onReceive(Context context, Intent intent) {
        ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo mobileNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
        NetworkInfo wifiNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        boolean isMobileConnected = (mobileNetInfo != null) && mobileNetInfo.isConnectedOrConnecting();     
        boolean isWifiConnected = (wifiNetInfo != null) && wifiNetInfo.isConnectedOrConnecting();
        boolean isConnected = isMobileConnected || isWifiConnected;
        Log.e("actNET", "connection = " + isConnected); 
        context.bindService(new Intent(context, TraderService.class), sc, Context.BIND_AUTO_CREATE);
        ts.myMeth(isConnected);
    }
 
}
и в логе получаю ошибку:

09-23 08:53:42.024: E/BroadcastReceiver(5675): BroadcastReceiver created
09-23 08:53:42.024: E/actNET(5675): connection = false
09-23 08:53:42.054: E/AndroidRuntime(5675): FATAL EXCEPTION: main
09-23 08:53:42.054: E/AndroidRuntime(5675): java.lang.RuntimeException: Unable to start receiver actforex.trader.services.ConnectionStateRceiver: android.content.ReceiverCallNotAllowedException: BroadcastReceiver components are not allowed to bind to services
09-23 08:53:42.054: E/AndroidRuntime(5675): at android.app.ActivityThread.handleReceiver(ActivityThread.java:2431)
09-23 08:53:42.054: E/AndroidRuntime(5675): at android.app.ActivityThread.access$1500(ActivityThread.java:141)
09-23 08:53:42.054: E/AndroidRuntime(5675): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1332)
09-23 08:53:42.054: E/AndroidRuntime(5675): at android.os.Handler.dispatchMessage(Handler.java:99)
09-23 08:53:42.054: E/AndroidRuntime(5675): at android.os.Looper.loop(Looper.java:137)
09-23 08:53:42.054: E/AndroidRuntime(5675): at android.app.ActivityThread.main(ActivityThread.java:5103)
09-23 08:53:42.054: E/AndroidRuntime(5675): at java.lang.reflect.Method.invokeNative(Native Method)
09-23 08:53:42.054: E/AndroidRuntime(5675): at java.lang.reflect.Method.invoke(Method.java:525)
09-23 08:53:42.054: E/AndroidRuntime(5675): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
09-23 08:53:42.054: E/AndroidRuntime(5675): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
09-23 08:53:42.054: E/AndroidRuntime(5675): at dalvik.system.NativeStart.main(Native Method)
09-23 08:53:42.054: E/AndroidRuntime(5675): Caused by: android.content.ReceiverCallNotAllowedException: BroadcastReceiver components are not allowed to bind to services
09-23 08:53:42.054: E/AndroidRuntime(5675): at android.app.ReceiverRestrictedContext.bindService(ContextImpl.java:159)
09-23 08:53:42.054: E/AndroidRuntime(5675): at actforex.trader.services.ConnectionStateRceiver.onReceive(ConnectionStateRceiver.java:47)
09-23 08:53:42.054: E/AndroidRuntime(5675): at android.app.ActivityThread.handleReceiver(ActivityThread.java:2424)


BroadcastReceiver components are not allowed to bind to services - я так понял из этого класса подключиться к сервису нельзя? и как мне быть в таком случае?
0
lavan
53 / 53 / 1
Регистрация: 21.03.2009
Сообщений: 371
23.09.2013, 11:10 #4
зря вы отказываетесь читать теорию! в доках написано где надо подключаться к сервису. если ваш ресивер локальный т.е не объявленный в манифесте то делается как я написал в первом посте. а вот что в доках пишут про
Receiver Lifecycle
A BroadcastReceiver object is only valid for the duration of the call to onReceive(Context, Intent). Once your code returns from this function, the system considers the object to be finished and no longer active.

This has important repercussions to what you can do in an onReceive(Context, Intent) implementation: anything that requires asynchronous operation is not available, because you will need to return from the function to handle the asynchronous operation, but at that point the BroadcastReceiver is no longer active and thus the system is free to kill its process before the asynchronous operation completes.

In particular, you may not show a dialog or bind to a service from within a BroadcastReceiver. For the former, you should instead use the NotificationManager API. For the latter, you can use Context.startService() to send a command to the service.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.09.2013, 11:10
Привет! Вот еще темы с ответами:

Получить доступ к EditText из другого класса - Программирование Android
И снова нюбо - вопросы. Есть задача создать класс и с него получить доступ к EditText что находится в main_activity для вноса и выноса...

Не могу получить доступ к sdcard на android 6 и 7 - Программирование Android
В манивесте прописаны <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission...

Получить доступ к TextView внутри ListView - Программирование Android
Привет, форумчане! Сначала кратко(потребуется код выложу, просто нужно понять принцип): Есть Активити на базе ЛистАктивити, в ней ЛистВью...

Получить доступ к микрофону, и вывести сказанное на экран - Программирование Android
Добрый день уважаемые программисты! Передо мной встала задача следующего характера: Необходимо получить доступ к микрофону, и вывести...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Yandex
Объявления
23.09.2013, 11:10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru