1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Activity bindet sich nicht an lokalen Service

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Wicki12, 27.04.2012.

  1. Wicki12, 27.04.2012 #1
    Wicki12

    Wicki12 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    57
    Erhaltene Danke:
    0
    Registriert seit:
    04.04.2012
    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

    Beiträge:
    57
    Erhaltene Danke:
    0
    Registriert seit:
    04.04.2012
    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
     

Diese Seite empfehlen