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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.63
Ametistos
0 / 0 / 0
Регистрация: 23.02.2013
Сообщений: 37
22.09.2013, 14:47     Как получить доступ к сервису? #1
У меня в приложении есть сервис, который запускается вместе с приложением.
Также я создал класс, который наследуется от BroadcastReceiver для мониторинга интернет подключения.

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

Android Как получить доступ к элементу в папке по имени?
Android Как получить доступ к тексту SMS?
Android Получить доступ к ImageView в одном конкретном элементе ListView
Как получить доступ к устаревшим фрагментам после чистки кеша Android
Получить доступ к EditText из другого класса Android
Получить доступ к TextView внутри ListView Android
Получить доступ к микрофону, и вывести сказанное на экран Android
Получить доступ к картинке, при помощи переменной с именем файла Android
Как получить доступ к методам объекта класса наследуемого от Activity, когда он выводится во вкладку Android
Android Как получить доступ к root файлу
Android Как передать сервису состояния checkbox из MainActivity?
Android Получить доступ к внешней карте памяти (Android 6)

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lavan
51 / 51 / 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();
    }
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 - я так понял из этого класса подключиться к сервису нельзя? и как мне быть в таком случае?
lavan
51 / 51 / 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.
Yandex
Объявления
23.09.2013, 11:10     Как получить доступ к сервису?
Ответ Создать тему
Опции темы

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