1

I am trying to implement a very simple service example. The user inputs the value through EditText and clicks on Calculate Button. The Calculate button triggers a service which performs some calculations and sends the result back to another EditText box. If I use a simple service without binding, the result gets displayed before the calculation is performed, so I want to use a bound service. But in my case, the control just stops at onBind call and onStart does not get executed. The control does flow to onCreate though. Could anyone help me to find where I am going wrong?

public class SimpleService extends Service {
    private final IBinder mBinder = new LocalBinder();


    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        System.out.println("Service: OnBind");
         return mBinder;
    }

    public class LocalBinder extends Binder {

        SimpleService getService() {
            System.out.println("Service: in Local binder");

            return SimpleService.this;
        }
    }

    @Override
    public void onCreate() {
        super.onCreate();
        System.out.println(" Service:In on create...");
        Toast.makeText(this,"Service created ...",         Toast.LENGTH_LONG).show()
    }

    @Override
    public void onDestroy() {
       super.onDestroy();
       System.out.println(" Service:in on destroy...");

       Toast.makeText(this, "Service destroyed ...", Toast.LENGTH_LONG).show();
    }

@Override
public void onStart(Intent intent, int startid) {
  System.out.println("Service:in onstart command ...");
  super.onStart(intent, startid);
  int res;
  String LOG_TAG =  "";
  int input2 = intent.getIntExtra("input", -1);
  int mode = intent.getIntExtra("mode", -1);
  String aString = Integer.toString(mode);
  Log.v(LOG_TAG, aString);
  if(mode == 1) {
         res = cal_F(input2);
    } else {
         res = cal_C(input2);
    }

  intent.putExtra("result", res);
     }

    }
#
public class ClassExamplesServiceActivity extends Activity implements  OnClickListener{

@Override
public void onClick(View v) {

    input = Integer.parseInt(input1.getText().toString());
    if(v.getId() == R.id.radio_fib)
        rd_button = 0;
    else if(v.getId() == R.id.radio_fact)
        rd_button = 1;
    else if (v.getId() == R.id.button1){

        intent = new Intent(this, SimpleService.class);
        intent.putExtra("input", input);
        intent.putExtra("mode", rd_button);
        doBindService();
        System.out.println("in class activity "+System.currentTimeMillis());

    }       

    else if(v.getId() == R.id.stop)
    {
        stopService(intent);
    }     
}

private ServiceConnection mConnection = new ServiceConnection() {

    public void onServiceConnected(ComponentName className, IBinder service) {
        System.out.println("\n in service connection");
        mBoundService = ((SimpleService.LocalBinder)service).getService();  
    }



public void onServiceDisconnected(ComponentName className) {
      System.out.println("\n in service disconnected");
      mBoundService = null;
  }
};

void doBindService() {
    System.out.println("in do bind service");

    boolean isConnected = bindService(new Intent(ClassExamplesServiceActivity.this, SimpleService.class), mConnection, Context.BIND_AUTO_CREATE);
    intent.putExtra("input", input);
    intent.putExtra("mode", rd_button);
    System.out.println("\n isconnected = "+ isConnected);
    mIsBound = true;
}
void doUnbindService() {
    if (mIsBound) {
        res = intent.getIntExtra("result", -1);
        result.setText(Integer.toString(res));// Set the result in the EditText
        // Detach our existing connection.
        unbindService(mConnection);
        mIsBound = false;
    }
}

@Override
protected void onDestroy() {
    super.onDestroy();
    doUnbindService();
}
}
#
<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <activity
        android:label="@string/app_name"
        android:name=".ClassExamplesServiceActivity" >
        <intent-filter >
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <service android:name=".SimpleService"></service>
</application>
Arasu
  • 2,078
  • 6
  • 40
  • 67
user988639
  • 15
  • 1
  • 4

1 Answers1

1

You need to call Context.startService() in order to use onStart(): http://developer.android.com/reference/android/content/Context.html#startService(android.content.Intent)

Tim
  • 6,692
  • 2
  • 25
  • 30
  • I was referring to this example:http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/LocalService.html and it does not mention anything about Context.startService(). Could you please point me to an example which will explain this concept better? Thanks. – user988639 Nov 09 '11 at 11:20
  • Normally you would use bind service if you call methods on a service (even from more than one Activity) and want to end it after every Activity did unbind it. startService requieres that you implement onStart() and onStop() - so you'd use startService if you explicitly want to do that. – Tim Nov 09 '11 at 12:24
  • also referred to this document: http://androidapps.org.ua/androidintro_gettingtoknow_service.html onBind If a client needs a persistent connection to a service, it can call the Context.bindService method. This creates the service if it is not running, and calls onCreate but not onStart. Instead, the onBind method is called with the client's intent, and it returns an IBind object that the client can use to make further calls to the service. It's quite normal for a service to have clients starting it and clients bound to it at the same time. – user988639 Nov 10 '11 at 17:24