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

Как получить доступ к сервису?

22.09.2013, 14:47. Просмотров 1434. Ответов 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
Ответы с готовыми решениями:

Как получить доступ к фрагментам?
пытаюсь написать приложение. в которм будет несколько страниц со списками...

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

Как получить доступ к тексту SMS?
Тость хочу чтоб когда выскакивает меню набора текста SMS я мог бы туда при...

Как получить доступ к элементу в папке по имени?
Есть, допустим, следующий код Bitmap srcBitmapLocal =...

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

3
lavan
53 / 53 / 8
Регистрация: 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 / 8
Регистрация: 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

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

Как получить доступ к методам объекта класса наследуемого от Activity, когда он выводится во вкладку
В главном Активити создаются вкладки на котовые выводятся другие активити. ...

Получить доступ к кнопке из фрагмента
Добрый день. Есть фрагмент в котором ViewPager c фрагментами( через...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

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