2015-06-04 16 views
5

Moja usługa jest poprawnie zbindowanych do mojego pierwszego aktywności, ale gdy próbuję powiązać go z drugim aktywności nie działa Oto kod onresume i na przerwie mojego pierwszego aktywnościwiązanie usługi dla wielu działań

@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); 
    } 
} 

zrobiłem to samo z moim drugim aktywności, ale gdy próbuję skorzystać z usługi jest zawsze zerowa Oto kod mojego drugiego działalności:

@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); 
    } 
} 

Ów jest kod mojego serwisu:

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; 
     } 
    }; 
} 

}

Oto mój plik manifestu:

<?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> 

Z góry dzięki za pomoc!

+0

Pozwala zobaczyć, że oczywisty por favor. – ApolloSoftware

+0

Usługi w wielu działaniach stają się kłopotliwe. Są na to dwa sposoby. Chciałbym podklasować klasę aplikacji i wykonać niestandardową pracę. Drugim sposobem jest przekształcenie wielu działań w fragmenty, dzięki czemu usługa będzie działać znacznie lepiej! – ApolloSoftware

+0

Dodałem mój plik manifestu do mojego pytania. Odnośnie używania fragmentów, jak powiązać je z usługą? Dzięki! – sabrina2020

Odpowiedz

4

Musisz użyć tego samego obiektu usługi połączenia w obu działaniach. Najlepszym sposobem na to będzie rozszerzenie klasy aplikacji, w której musisz napisać kod, aby rozpocząć obsługę i zatrzymać. Następnie możesz uzyskać dostęp do usługi z dowolnego działania.

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(){ 
    } 
    } 

Teraz, aby uzyskać usługę z działalności

AppController.getInstance().getService(); 
+0

@Jlthin czy mógłbyś to nieco bardziej urozmaicić? W szczególności, co powinno się znaleźć w metodzie getService? Czy usługa startService jest wywoływana onCreate()? – Atticus29

+0

Czy zapisywanie odniesień do obiektów w klasie Application nie jest bardzo szkodliwe? http://www.developerphil.com/dont-store-data-in-the-application-object/ – estoke

Powiązane problemy