toggleボタンを押すとサービス開始(タイマー作動、ボタンの表記はResetになる)、またボタンを押すとサービス停止(タイマーリセット)というアプリを作っているのですが、バックグラウンドからアプリに復帰したときに、toggleボタンが元の状態に戻っていまいます(タイマーは動作を続けている)
どうすればボタンの状態を保持できるのでしょうか?
以下がコードです(一部省略)
MainActivity.java
`
// (一部省略)
import android.app.Activity;
import android.content.Intent;
// 以下必要なものをimport
public class MainActivity extends Activity implements OnCheckedChangeListener {
static TextView timer;
static ToggleButton toggle;
private static long settingTime = 60000;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
timer = (TextView) findViewById(R.id.timer); toggle = (ToggleButton) findViewById(R.id.toggleButton1); // 初期時間設定 showTimer(getSettingTime()); // リスナ登録 toggle.setOnCheckedChangeListener(this);
}
TimerService timerTask = new TimerService();
private Intent timerIntent;
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// サービスを開始か停止
if (isChecked == true) {
Toast.makeText(this, "Start", Toast.LENGTH_SHORT).show();
// Start service
startService();
} else {
// Stop service
stopService(timerIntent);
// 設定した時間にリセット
showTimer(getSettingTime());
}
}
public void startService() {
// Serviceに設定時間を送ってサービス開始
timerIntent = new Intent(MainActivity.this, TimerService.class);
timerIntent.putExtra("settingTime", getSettingTime());
startService(timerIntent);
}
}
`
TimerService.java
`
// (一部省略)
import android.app.Service;
import android.content.Intent;
import android.os.CountDownTimer;
import android.os.IBinder;
import android.widget.Toast;
public class TimerService extends Service {
protected MyCountDownTimer cdt;
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// タイマーのインスタンス生成&スタート
cdt = new MyCountDownTimer(intent.getExtras().getLong("settingTime"), 500);
cdt.start();
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
// タイマーインスタンスのキャンセル&破棄
cdt.cancel();
cdt = null;
super.onDestroy();
}
public class MyCountDownTimer extends CountDownTimer {
public MyCountDownTimer(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
MainActivity.showTimer(millisInFuture);
}
@Override public void onFinish() { MainActivity.timer.setText("0:00"); Toast.makeText(getApplicationContext(), "Finished!", Toast.LENGTH_SHORT).show(); // 設定時間にリセット MainActivity.showTimer(MainActivity.getSettingTime()); // トグルボタンをfalse MainActivity.toggle.setChecked(false); // Stop service stopSelf(); } @Override public void onTick(long millisUntilFinished) { // 残り時間表示 MainActivity.showTimer(millisUntilFinished); }
}
}
`
試してみたのは
- SharedPreferences(トグルボタンの状態を保持したい)
- MainActivityのonResume()にいろいろ記述(ライフサイクルがよくわかってない)
などですが、うまくいきません。
Logを仕込んでみたところ、アプリがバックグラウンドに回ると、onPause() -> onStop()と状態遷移して、そこから復帰するときにonCreate() -> onStart() -> onResume()と遷移しているのは分かったのですけど、そこでデフォルトに戻ってしまっているのかな?と。(xmlでのToggleButtonの属性にandroid:checked="false"と記述している)
setChecked(Boolean)で指定してもコールバックメソッドを呼んでしまうので、どうしたものかなと。
長くなりましたが、とにかくトグルボタンの状態を保持したいのです。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2014/07/31 05:29
2014/07/31 06:53
2014/07/31 09:11
2014/07/31 09:22
2014/08/01 04:15
2014/08/01 08:24