1. Hast Du Lust, bei uns mitzuarbeiten und das AH-Team zu verstärken? Alle Details zu dieser aktuellen Herausforderung findest Du hier.
  1. Wicki12, 27.04.2012 #1
    Wicki12

    Wicki12 Threadstarter Android-Hilfe.de Mitglied

    Hallo,

    Bitte um Hilfe. Ich versuche aus der mainActivity heraus einen lokalen Service zu nutzen. Es gelingt mir nicht, die Bindung herzustellen. Nachfolgend der Code.
    Der Service:
    Code:
    package wicki.Android.LocalService;
    
    import java.util.Random;
    
    import android.app.Service;
    import android.content.Intent;
    import android.os.Binder;
    import android.os.IBinder;
    import android.util.Log;
    
    public class LocalService extends Service {
      private final IBinder mBinder = new LocalBinder();
      private final Random mGenerator = new Random();
      /**
      * Class used for the client Binder. This service always
      * runs in the same process as its clients
      */
      public class LocalBinder extends Binder {
        LocalService getService() {
            Log.i("LocalService","**** getService");
          // Clients can call Service's public methods
          return LocalService.this;
        }
      }
      @Override
      public IBinder onBind(Intent intent) {
          Log.i("LocalService","**** onBind");
          return mBinder;
      }
      /** method for clients */
      public int getRandomNumber() { return mGenerator.nextInt(100); }
    }
    
    Die Activity:
    Code:
    package wicki.Android.LocalService;
    
    import android.app.Activity;
    import android.content.ComponentName;
    import android.content.Context;
    import android.content.Intent;
    import android.content.ServiceConnection;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.IBinder;
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.TextView;
    
    public class LocalBoundServiceActivity extends Activity {
      boolean mBound = false;
      TextView txt;
    
       //http://groups.google.com/group/android-developers/browse_thread/thread/e0a0db3dac32b9e3#
      /** Defines callbacks for service binding, passed to bindService() */
       private TestServiceConnection mConnection = null;
      /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            mConnection = new TestServiceConnection();
            Button button = (Button) findViewById(R.id.Button01);
            txt = (TextView)findViewById(R.id.text);
            button.setOnClickListener(new OnClickListener() {
              public void onClick(View v) {
                  onButtonClick(v);
              }
            });
            Intent intent = new Intent(this, LocalService.class);
            bindService(intent, mConnection, 0);//Context.BIND_AUTO_CREATE);
            this.startService(intent);
            Log.i("LocalService","**** onCreate");
        }
    /*
        protected void onStart() {
          super.onStart();
          Intent intent = new Intent(this, LocalService.class);
          bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
          Log.i("LocalService","**** onStart");
        }
    */
        public void onButtonClick(View v) {
            if (mConnection.mService != null) mBound=true;
            Log.i("LocalService","**** onButtonClick, mBound="+mBound);
          if (mBound) {
            // Call a method from the LocalService.
            int num = mConnection.mService.getRandomNumber();
            TextView text = (TextView)findViewById(R.id.text);
            text.setText("number: " + num);
          }
        }
        protected void onStop() {
          super.onStop();
          // Unbind from the service
    //      if (mBound) {
              unbindService(mConnection); mBound = false;
    //      }
          Log.i("LocalService","**** onStop");
        }
        private final Handler handler = new Handler();
    
        public void onStart() {
          super.onStart();
          Runnable r = new Runnable() {
            public void run() {
              TextView tv = (TextView)findViewById(R.id.text);
              int p = -1;
              String zws="Unable to access TestService!";
              if (mConnection.mService != null) {
                  zws = "TestService on!";
                p = mConnection.mService.getRandomNumber();
              }
              tv.setText(zws+" Randomwert: "+p);
            }
          };
          handler.postDelayed(r, 10000L);
          Log.i("LocalService","**** onStart(Runnable)");
        }
    }
    
    Hier habe ich es zuerst mit der auskommentierten "onStart" versucht, dann aber auf Anregung eines Beitrages aus dem Netz habe ich das Binden in "onCreate" programmiert und in dem "Runnable" zeitverzögert die Service-Abfrage gestellt (Bindung ist laut obigen Beitrags asynchron).

    Die Hilfsklasse "TestServiceConnection":
    Code:
    package wicki.Android.LocalService;
    
    import android.content.ComponentName;
    import android.content.ServiceConnection;
    import android.os.IBinder;
    
    public class TestServiceConnection implements ServiceConnection
    {
            protected LocalService mService = null;
    
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
              mService = ((LocalService.LocalBinder)service).getService();
            }
    
            @Override
            public void onServiceDisconnected(ComponentName name) {
              mService = null;
            }
    }
    
    Die Manifest-Datei:
    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="wicki.Android.LocalService"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk android:minSdkVersion="8" />
        <service android:name=".LocalService"
        android:enabled="true"/>
       
        <application
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name" >
            <activity
                android:name=".LocalBoundServiceActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>
    
    Wo liegt der Fehler?

    Gruß Wicki
     
  2. Wicki12, 28.04.2012 #2
    Wicki12

    Wicki12 Threadstarter Android-Hilfe.de Mitglied

    Hallo,

    nach intensivem "Googeln" habe ich einen zutreffenden Hinweis gefunden. Im Manifest muss die service-Deklaration innerhalb von "application", ausserhalb von "activity" stehen ! Wahrscheinlich ist das so bei einem lokalen Service.
    Übrigens funktioniert es auch ohne Zeitverzögerung mit Runnable-Objekt !
    Dank für Eure Bemühungen !

    Gruß Wicki
     
Die Seite wird geladen...
Ähnliche Themen Forum Datum
[ERLEDIGT] Bitmap von Activity an Activity übergben Android App Entwicklung 03.09.2017
[OFFEN] Activity als Dialog - RecyclerView funktioniert nicht mehr Android App Entwicklung 14.08.2017
[ERLEDIGT] Probleme mit Service unter Android N Android App Entwicklung 16.07.2017
[ERLEDIGT] Hilfe bei Fehler in Quellcode benötigt Android App Entwicklung 23.06.2017
[OFFEN] Problem mit meiner Login App Android App Entwicklung 10.06.2017
[GELÖST] Nach AS Update Fehler Error running app: Default Activity not found Android App Entwicklung 16.05.2017
[GELÖST] Übergabe an zweite Activity Android App Entwicklung 11.05.2017
[ERLEDIGT] Android Studio meint ich soll lokale Variablen verwenden Android App Entwicklung 29.04.2017
[OFFEN] Service wird bei manchen Geräten nicht gestartet Android App Entwicklung 09.04.2017
[ERLEDIGT] Problem beim Starten einer neuen Activity Android App Entwicklung 21.03.2017
Du betrachtest das Thema "Activity bindet sich nicht an lokalen Service" im Forum "Android App Entwicklung",