Listen to Change of Phone State State - Android
<p>I am currently trying to create a simple app that records how many minutes you have spent calling and then warn you when you are close to your free minutes. </p>

<p>At this point I have created a service called CallService.java that is called whenever the user calls people. This service simply records the start time of the call and the end time of the call. The service is started using a class called OutgoingCallReciever.Java. This class simply waits for the user to call someone and then starts the CallService. </p>

<p>I am now trying to stop the CallService when the users phone is not calling someone. i.e (phone state is idle, off-hook, or someone else is calling the user) but I dont know how to do that (I am new to Java/Android). Do I use PhoneStateListener 's  onCallStateChanged method? (I am unsure how to use it..)</p>

<p>Hope you can help! </p>

<p>The classes are below:</p>

<p>MainActivity.java</p>

<pre><code>package com.fouadalnoor.callcounter;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.Toast;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.telephony.TelephonyManager;
import android.telephony.PhoneStateListener;

public class MainActivity extends Activity {

     @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
        PhoneStateListener ps =(PhoneStateListener) getSystemService(TELEPHONY_SERVICE);

         Toast.makeText(this, "Phone State = " + tm.getCallState() , Toast.LENGTH_LONG).show();


        CheckBox checkBox = (CheckBox) findViewById(R.id.checkBox1);
        checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                    if(isChecked){
                        stopService (new Intent(buttonView.getContext(),CallService.class));
                    }
                }
            });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

}
</code></pre>

<p>OutgoingCallReciever.java</p>

<pre><code>package com.fouadalnoor.callcounter;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;


public class OutgoingCallReciever extends BroadcastReceiver {


     @Override
        public void onReceive(Context context, Intent intent) {
          context.startService(new Intent(context, CallService.class));
     }

}
</code></pre>

<p>CallService.java</p>

<pre><code>package com.fouadalnoor.callcounter;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.widget.Toast;
import java.lang.String;


public class CallService extends Service {

    public long startTime,endTime, totalTime;

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }

        @Override
        public void onDestroy() {

            Toast.makeText(this, "Call Service stopped", Toast.LENGTH_LONG).show(); 

            endTime = System.currentTimeMillis()/1000;
            Toast.makeText(this, "endTime = " + endTime, Toast.LENGTH_LONG).show();
            totalTime =  endTime-startTime; 
            Toast.makeText(this, "totalTime = " + totalTime , Toast.LENGTH_LONG).show();

        }

        @Override
        public void onStart(Intent intent, int startid) {
            Toast.makeText(this, "Call Service started by user.", Toast.LENGTH_LONG).show();

            startTime = System.currentTimeMillis()/1000;
            Toast.makeText(this, "startTime = "+ startTime, Toast.LENGTH_LONG).show();
        }


}
</code></pre>
