Activity bindet sich nicht an lokalen Service

W

Wicki12

Ambitioniertes Mitglied
0
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
 
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
 

Ähnliche Themen

5
Antworten
0
Aufrufe
1.150
586920
5
FabianDev
Antworten
5
Aufrufe
557
swa00
swa00
SaniMatthias
Antworten
19
Aufrufe
957
swa00
swa00
Zurück
Oben Unten