CodeMonkeyAlx
CodeMonkeyAlx

Reputation: 853

Service intent not launching -- Yet no errors or program stops

I'm working on a chunk of code that enables to the user to shake the phone and it displays or launches an activity from the shake. I'm trying to figure out why the code is not running when I shake the device. Yet when I run this code outside of a service it runs flawlessly.

Notes: The service does launch, I checked. The class to be launched is in my manifest, Again I checked. There are no errors present and even more freaky the code does not stop or fail when it is launched. it just does not do what I tell it. Yes all the proper permissions are set up as well.

So here is the code:

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.os.IBinder;
import android.widget.Toast;

public class GMeter extends Service implements SensorEventListener {

private float mLastX, mLastY, mLastZ;
private boolean mInitialized;
private SensorManager mSensorManager;
private Sensor mAccelerometer;
private final float NOISE = (float) 2.0;

/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
    mInitialized = false;
    mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    mSensorManager.registerListener(this, mAccelerometer , SensorManager.SENSOR_DELAY_NORMAL);
    Toast.makeText(this, "Starting Service", Toast.LENGTH_LONG).show();
}

protected void onResume() {
    mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
}

protected void onPause() {
    mSensorManager.unregisterListener(this);
}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
    // can be safely ignored for this demo
}

@Override
public void onSensorChanged(SensorEvent event) {
    float x = event.values[0];
    float y = event.values[1];
    float z = event.values[2];
    double a = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
    double currentG = (a/ SensorManager.STANDARD_GRAVITY);
    Toast.makeText(this, "Calculating G's", Toast.LENGTH_LONG).show();
    if (!mInitialized && currentG > 1.0) {
        mLastX = x;
        mLastY = y;
        mLastZ = z;
        mInitialized = true;
        //Start Second Activity
        Intent intent = new Intent(getBaseContext(), thirdClass.class);
        intent.setAction(Intent.ACTION_VIEW);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
        getApplication().startActivity(intent);
    }else {
        float deltaX = Math.abs(mLastX - x);
        float deltaY = Math.abs(mLastY - y);
        float deltaZ = Math.abs(mLastZ - z);
        if (deltaX < NOISE) deltaX = (float)0.0;
        if (deltaY < NOISE) deltaY = (float)0.0;
        if (deltaZ < NOISE) deltaZ = (float)0.0;
        mLastX = x;
        mLastY = y;
        mLastZ = z;
    }
}

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

This is not giving me any errors so there is no logcat to be presented.

Upvotes: 0

Views: 151

Answers (2)

Vipin Sahu
Vipin Sahu

Reputation: 1451

Service and Activity use same same Context .. you must get proper Context to launch Activity

like get the application context in onCreate method of service of

public class abc extends Service {
Context mContext;
@Override
public void onCreate()
{
    mContext=getApplicationContext();
    super.onCreate();
}

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

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

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

}

and use this 'mContext' to startActivity

Upvotes: 0

nandeesh
nandeesh

Reputation: 24820

Add below line, to make the service continue to run.

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return START_STICKY;
}

Also Service does not have OnResume and OnPause functions, so they are useless in your case unless you are calling them yourself. But Service does have an onDestroy function which you can override to unregister your listener

Edit: You are using onCreate(Bundle savedInstanceState) which is not the oncreate signature that service calls. Use

public void onCreate() 

Upvotes: 1

Related Questions