0

我正在编写一段代码,使用户能够摇动手机并从摇动中显示或启动活动。我试图弄清楚为什么当我摇动设备时代码没有运行。然而,当我在服务之外运行此代码时,它可以完美运行。

注意:我检查了该服务确实启动了。要启动的课程在我的清单中,我再次检查。没有错误存在,更奇怪的是,代码在启动时不会停止或失败。它只是不按我说的做。是的,所有适当的权限也都设置好了。

所以这里是代码:

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;
}
}

这没有给我任何错误,因此没有要显示的 logcat。

4

2 回答 2

1

添加以下行,以使服务继续运行。

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

服务也没有OnResumeOnPause功能,因此除非您自己调用它们,否则它们在您的情况下是无用的。但是 Service 确实有一个 onDestroy 函数,你可以覆盖它来取消注册你的监听器

编辑:您使用onCreate(Bundle savedInstanceState)的不是服务调用的 oncreate 签名。利用

public void onCreate() 
于 2012-09-25T18:03:06.973 回答
0

服务和活动使用相同的上下文..您必须获得正确的上下文才能启动活动

比如在服务的 onCreate 方法中获取应用程序上下文

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;
}

}

并使用这个“mContext”来启动活动

于 2012-09-25T18:57:32.917 回答