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

これは私にエラーを与えていないので、提示されるログキャットはありません。

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」を使用してStartActivityを実行します

于 2012-09-25T18:57:32.917 に答える