Reputation: 853
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
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
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