前回の記事で、終わらせたアクティビティがまだ生きていて、タイマー処理などが動き続けているようなことを書きました。
が、とりあえず、タイマーやロケーションリスナーを終わらせることが出来たみたいです。
何故前回のコードがダメだったのか考えてみると・・・
おそらく、Timer::cancel()しか呼んでなくて、Timer::purge()を呼んでいなかったから、だと思います。
それぞれの説明には、下記のようにあります。
void cancel() - Cancels the Timer and removes any scheduled tasks.
int purge() - Removes all canceled tasks from the task queue.
canceled task と scheduled task がどのような関係かわかりませんが、
cancel()でTimerをcancelして、putrge()でcanceled taskをremoveする・・・と考えればこの流れでいけるはず。
そのほかにも、消し忘れたリスナがいたので、まとめて消すことにしたら、
今度はうまくいった。
アクティビティ終わらせたら、ファイルへの記録も終わるようになりました。
2回目に起動したアクティビティとダブってファイル記録するということも無くなりました。
・・・たぶん、これでOKなはず。
今回修正したコードはこちら:
public class GetSensorValues extends Activity
implements LocationListener{
Button mFinishButton;
//位置情報を取得するためのマネージャ
LocationManager mLocationManager;
Timer timer = null;
SensorManager sm = null;
//省略
public void onClick(View v)
{
if(v.getId() == R.id.finish_button){
//タイマとリスナは強制終了。
timer.cancel();
timer.purge();
sm.unregisterListener(mSensorListener);
mLocationManager.removeUpdates(this);
finish();
}
}
public void onStop(Bundle savedInstanceState){
//タイマとリスナは強制終了。
timer.cancel();
timer.purge();
sm.unregisterListener(mSensorListener);
mLocationManager.removeUpdates(this);
}

