Search code examples
androidsqlitebroadcastreceiver

Services in Android is not getting Started in BroadCast receiver


I am trying to make an android app that must do some database activities like storing phone number and name etc in the SQLite DB . This all Data Base stuff is done as a service. The service must start as soon as the call comes and when the call ends the stored details must be showed to user as soon as the call ends. For this purpose I am using Broad Cast Receiver. I have also provide the following codes which I have used in my app.

MyServices.java

public class MyServices extends Service {
TelephonyManager Tel;
MyPhoneStateListener MyListener;
RB_SIGNAL_STRENGTH signalobj = new RB_SIGNAL_STRENGTH();
RB_DatabaseHandler db = new RB_DatabaseHandler(getApplicationContext());

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


@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    isMyServiceRunning();
    MyListener = new MyPhoneStateListener();
    Tel = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
    Tel.listen(MyListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
    super.onCreate();
    Log.i("Serv","Service Started");

    return super.onStartCommand(intent, flags, startId);
}

@Override
public void onDestroy() {
    // TODO Auto-generated method stub
    db.close_DB();
    Log.i("Serv","Service Stopped");
    super.onDestroy();
}

MyReceiver.java

    public class MyPhoneReceiver extends BroadcastReceiver {
String state=null;

@Override
public void onReceive(Context context, Intent intent) {
    Bundle extras = intent.getExtras();

    if (state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_OFFHOOK)) 
    {
        try{


        Intent i = new Intent(context,MyServices.class);

        Log.i("Recv", "In Try");
        context.startService(i);
        }
        catch(Exception e)
        {
            Log.d("Recv", "Service not starting");
        }
    }//End if offhook
    if(state.equals(TelephonyManager.EXTRA_STATE_IDLE))
    {
        Log.i("Recv","CALL ENDED");
        try
        {
            Intent i = new Intent(context,EndActivity.class);
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);            
            context.startActivity(i);
        }
        catch(Exception e){
            Log.d("Recv", "Activity not starting");
        }
    }
    }

}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.testapp"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk android:minSdkVersion="9" />

<uses-permission android:name="android.permission.READ_PHONE_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.SIGNAL_PERSISTENT_PROCESSES" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >

    <activity android:name="StartActivity" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name="EndActivity" >
    </activity>
            <receiver android:name=".MyReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.PHONE_STATE" >
            </action>
        </intent-filter>
    </receiver>
    <service 
        android:name="MyServices" 
        ></service>
</application>


Solution

  • Your class name is MyPhoneReceiver but in your Manifest you are using MyReceiver, these two names must match exactly.


    Addition
    I just noticed that you are trying to instantiate your database before the Service has a valid Context. This will probably throw an exception in MyServices:

    RB_DatabaseHandler db = new RB_DatabaseHandler(getApplicationContext());
    

    You can to declare db as a field variable but leave it null:

    RB_DatabaseHandler db;
    

    And inside a method like onStartCommand() initialize it:

    db = new RB_DatabaseHandler(getApplicationContext());
    

    Lastly, calling fundamental methods like onCreate() out of order usually creates problems, this is not recommended in onStartCommand():

    super.onCreate();