привязка службы к нескольким действиям

Моя служба правильно привязана к моей первой активности, но когда я пытаюсь связать ее со второй активностью, она не работает Вот код onresume и приостановки моей первой активности

  @Override
protected void onResume() {
    super.onResume();
    connection = new ServiceConnection() {
        @Override
        public void onServiceDisconnected(ComponentName name) {
            service = null;
        }
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            shareInfos.this.service = (IService) service;
        }
    };
    bindService(new Intent(this, shareInfos.class), connection,
            Context.BIND_AUTO_CREATE);
}
@Override
protected void onPause() {
    super.onPause();
    if (service != null) {
        service = null;
        unbindService(connection);
    }
}

Я сделал то же самое со своим вторым действием, но когда я пытаюсь использовать сервис, он всегда равен нулю. Вот код моего второго действия:

   @Override
protected void onResume() {
    super.onResume();
    connection = new ServiceConnection() {
        @Override
        public void onServiceDisconnected(ComponentName name) {
            service = null;
        }
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            shareInfos.this.service = (IService) service;
        }
    };
    bindService(new Intent(this, shareInfos.class), connection,
            Context.BIND_AUTO_CREATE);
}
@Override
protected void onPause() {
    super.onPause();
    if (service != null) {
        service = null;
        unbindService(connection);
    }
}

Это код моей службы:

public class ExampleService extends AbstractService {
private static final String SERVICE_NAME = "ExampleService";
public ExampleService() {
    super(SERVICE_NAME);
}
@Override
public AbstractRegistration getRegistration() {
    return new AbstractRegistration() {
        @Override
        public String getApplicationName() {
            return getResources().getString(R.string.application_name);
        }
        @Override
        public String getApplicationDescription() {
            return getResources().getString(R.string.application_description);
        }
        @Override
        public PendingIntent getApplicationSettings() {
            return PendingIntent.getActivity(getApplicationContext(), 0, new Intent(getApplicationContext(), ExampleActivity.class), 0);
        }
        @Override
        public boolean requiresStorage() {
            return true;
        }
        @Override
        public boolean requiresQueries() {
            return true;
        }
        @Override
        public boolean requiresRecognition() {
            return true;
        }
    };
}

}

Вот мой файл манифеста:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="eu.gambas.example.android" >

<uses-sdk
    android:minSdkVersion="10"
    android:targetSdkVersion="15" />

<uses-permission android:name="eu.gambas.permission.ACCESS" />
<uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="18" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission
    android:name="android.permission.READ_EXTERNAL_STORAGE"
    android:maxSdkVersion="18" />

<application
    android:icon="@drawable/icon"
    android:label="@string/application_name" >
    <activity
        android:name="com.example.egm.exampleandroid.ExampleActivity"
        android:label="@string/application_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name="com.example.egm.exampleandroid.ResultActivity" />
    <activity android:name="com.example.egm.exampleandroid.shareInfos" />
    <activity android:name="com.example.egm.exampleandroid.testActivity" />
    <service
        android:name="com.example.egm.exampleandroid.ExampleService"
        android:exported="true" >
        <intent-filter>
            <action android:name="eu.gambas.action.start" />
        </intent-filter>
        <intent-filter>
            <action android:name="eu.gambas.action.stop" />
        </intent-filter>
        <intent-filter>
            <action android:name="eu.gambas.action.result" />
        </intent-filter>
    </service>
</application>

Thanks in advance for your help!


person sabrina2020    schedule 04.06.2015    source источник
comment
Давайте посмотрим, что манифестирует пользу.   -  person Apollo SOFTWARE    schedule 04.06.2015
comment
Услуги во многих видах деятельности становятся беспорядочными. Я бы поступил двумя способами. Я бы либо создал подкласс класса Application, либо выполнил некоторую работу на заказ. Второй способ — преобразовать ваши многочисленные действия во фрагменты, что значительно улучшит работу сервиса!   -  person Apollo SOFTWARE    schedule 04.06.2015
comment
Я добавил свой файл манифеста в свой вопрос. По поводу использования фрагментов, как их привязать к сервису? Спасибо!   -  person sabrina2020    schedule 05.06.2015
comment
вам просто нужно связать родительскую активность и все.   -  person Apollo SOFTWARE    schedule 05.06.2015
comment
затем сослаться на родительскую активность с помощью getActivity().   -  person Apollo SOFTWARE    schedule 05.06.2015


Ответы (1)


Вы должны использовать один и тот же объект вызова службы в обоих действиях. Лучший способ сделать это — расширить класс приложения, где вам нужно написать код для запуска службы и остановки. Затем вы можете получить доступ к службе из любого действия.

    public class AppController extends Application {

     private static AppController mInstance;
     private ExampleService service;
     public static synchronized AppController getInstance() {
            return mInstance;
     }

     @Override
     public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
    }
    public void startService(){
    //start your service

    }
    public void stopService(){
    //stop service
    }
    public ExampleService getService(){
    }
    }

Теперь, чтобы получить услугу от активности

AppController.getInstance().getService();
person JIthin    schedule 04.06.2015
comment
@Jlthin, не могли бы вы рассказать об этом немного подробнее? В частности, что должно быть в методе getService? Вызывается ли startService в onCreate()? - person Atticus29; 07.11.2017
comment
Не является ли очень плохой практикой сохранять ссылки на объекты в классе Application? developerphil.com/dont-store-data-in-the -приложение-объект - person Greg; 07.11.2017