0

これはかなり奇妙な問題です。読んだ本があります(Android Developer's Cookbook)

私はかなり基本的なアプリを作っています(少なくとも、それは基本的だと思います)

私が抱えている問題はこれです。私が作成したサービスが停止すると、アクティビティがサービスの作業を行います。

携帯電話でZ軸の読み取り値を監視したい(常にバックグラウンドで)

これが私のプロジェクト構造です:TiltMonitorActivity TiltMonitorService

TiltMonitorActivityから:

@Override
        public void onClick(View v) {

            boolean error = false;
            if (tbService.isChecked()) {                    
                try {
                    startService(backgroundService);
                }

                catch (Exception e) {                          
                       error = true;
                }
                finally {
                    if (error)
                    {
                        errorToast();
                    }
                }
            }
            else if (!tbService.isChecked()) {
                try {
                    stopService(backgroundService);
                }

                catch (Exception e){                           
                       error = true;
                }
                finally {
                    if (error)
                    {
                        errorToast();
                    }
                }

            }
        }
});

これもonBackPressed()、onPause、onDestroyに入れます

finish();

サービスを開始/停止するときに作成する意図

final Intent backgroundService = new Intent(this, TiltMonitorService.class);

TiltMonitorServiceから:

  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.IBinder;
import android.os.Vibrator;
import android.widget.Toast;

public class TiltMonitorService extends Service {

    private SensorManager sensorManager = null;

    private Vibrator vibrator = null;

    private float[] accData = new float[3];

    // These are for manual config
    private float FORWARD_THRESHOLD = 5f;
    private float BACKWARD_THRESHOLD = -5f;

    // These are for auto config

    // The phone will face forward, so a positive Z Axis means user is leaning backwards
    // and that a negative Z Axis the user is leaning forward
    private float AUTO_FORWARD_THRESHOLD = -1.5f;
    private float AUTO_BACKWARD_THRESHOLD = 3.5f;

    public static TiltMonitorActivity MAIN_ACTIVITY = null;

    public static void setMainActivity(TiltMonitorActivity activity)
    {
        MAIN_ACTIVITY = activity;
    }

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

    @Override
    public void onCreate() {
        super.onCreate();

        sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
        vibrator = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);

        sensorManager.registerListener( tiltListener, 
                                        sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 
                                        SensorManager.SENSOR_DELAY_NORMAL);

        Toast.makeText(this, "Service created", Toast.LENGTH_LONG).show();

    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Toast.makeText(this, "Service destroyed", Toast.LENGTH_LONG).show();
    }

    private SensorEventListener tiltListener = new SensorEventListener() {

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onSensorChanged(SensorEvent event) {
            accData[0] = event.values[0];
            accData[1] = event.values[1];
            accData[2] = event.values[2];

            checkData(accData);

        }

    };

    private void checkData(float[] accData)
    {
        if ((accData[2] < AUTO_FORWARD_THRESHOLD) || (accData[2] > AUTO_BACKWARD_THRESHOLD))
        {
            vibrator.vibrate(100);
        }

    }

    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);

    }



}

繰り返しになりますが、アクティビティでToggleButtonを押すと、サービスが開始および停止されたというToastが表示されます。

しかし、タスクはまだ発生します。(設定されたしきい値を下回るまたは上回ると振動します)

タスクキラーを開くと、サービスが実行されていません。活動だけがあります(そしてそれを殺すと振動が殺されます)

どの単語を検索すればよいかわかりません。同じ問題を抱えている他の単語は見つかりませんでした。混乱を避けるために、アクティビティに関連するコードのみを投稿しようとしました。サービス全体が掲載されています。さらに必要な場合は、すみやかに我慢します。

洞察を与えてくれてありがとう

4

1 に答える 1

2

推測では、リスナーをonDestroyで登録解除せずに、onCreateに登録するためです。

サービスでは、つまり。

于 2010-12-26T05:10:55.347 に答える