これはかなり奇妙な問題です。読んだ本があります(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が表示されます。
しかし、タスクはまだ発生します。(設定されたしきい値を下回るまたは上回ると振動します)
タスクキラーを開くと、サービスが実行されていません。活動だけがあります(そしてそれを殺すと振動が殺されます)
どの単語を検索すればよいかわかりません。同じ問題を抱えている他の単語は見つかりませんでした。混乱を避けるために、アクティビティに関連するコードのみを投稿しようとしました。サービス全体が掲載されています。さらに必要な場合は、すみやかに我慢します。
洞察を与えてくれてありがとう