2013-01-04 3 views
1

Я создаю приложение, в котором есть кнопка, управляющая CountDownTimer, которая запускается независимо от того, открыто или нет приложение. В конце таймера в строке состояния появляется уведомление, в котором пользователь запрашивает запуск другого действия. Этот таймер повторяется с возрастающими интервалами в течение x раз. Кроме того, чтобы предотвратить случайный запуск таймера несколько раз, я отключу кнопку после первого нажатия. В конце цикла повтора обратного отсчета кнопка снова включается.Android, сохраняющий переменную, когда активность уничтожена, а затем воссоздана

Все это прекрасно работает, когда я держу деятельность открытым ...

Моя проблема, когда я нажимаю BACK. Если я снова открою действие, кнопка не сможет повторно активироваться после окончания цикла обратного отсчета. Я считаю, что состояние переменной «count» теряется, когда действие уничтожается.

Я новичок в программировании и буду признателен за любую помощь. Я прошу прощения за то, насколько грязный этот код! Это все еще большая работа. Заранее спасибо!

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    startB = (Button) this.findViewById(R.id.button); 
    startB.setOnClickListener(this); 
    countDownTimer = new MyCountDownTimer(times[count], interval); 
    LoadPreferences(); 
    if (savedInstanceState !=null) 
    { 
     count = savedInstanceState.getInt("mCount"); 
    } 
    else 
    { 
     count=0; 
    } 

} 

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) 
{ 
    savedInstanceState.putInt("mCount", count); 
    super.onSaveInstanceState(savedInstanceState); 
} 
@Override 
public void onBackPressed(){ 
    SavePreferences(); 

    super.onBackPressed(); 
} 

private void SavePreferences(){ 
    SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE); 
    SharedPreferences.Editor editor = sharedPreferences.edit(); 
    editor.putInt("mCount", mCount); 
    editor.putBoolean("state", startB.isEnabled()); 
    editor.commit(); 
} 

private void LoadPreferences(){ 
    SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE); 
    int mCount = sharedPreferences.getInt("count", mCount); 
    Boolean state = sharedPreferences.getBoolean("state",true); 
    startB.setEnabled(state); 
    mCount = count 
} 




      public void onClick(View v) 
       { 
        if (!timerHasStarted) 
         { 
          countDownTimer.start(); 
          timerHasStarted = true; 
          Toast t= Toast.makeText(this,"Timer Started", Toast.LENGTH_SHORT); 
          t.show(); 
         } 
        else 
         { 
          startB.setEnabled(false); 

         } 
       } 

      // CountDownTimer class 
      public class MyCountDownTimer extends CountDownTimer 
       { 

        public MyCountDownTimer(long startTime, long interval) 
         { 
          super(startTime, interval); 
         } 

        @Override 
        public void onFinish() 
         { 

         NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(getBaseContext()) 
         .setSmallIcon(R.drawable.ic_launcher) 
         .setContentTitle("ASL Teacher") 
         .setContentText("Play Lesson One"); 
         //Intent resultIntent= new Intent(); 
         //TaskStackBuilder stackBuilder = TaskStackBuilder.create(MainActivity.this); 
         //stackBuilder.addParentStack(NextActivity.class); 
         //stackBuilder.addNextIntent(resultIntent); 
         //PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 
         //mBuilder.setContentIntent(resultPendingIntent); 
          NotificationManager mNotificationManager = 
          (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 

         // mId allows you to update the notification later on. 
         mNotificationManager.notify(0, mBuilder.build()); 


         Vibrator v= (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); 
         v.vibrate(pattern,-1); 

// Тост т = Toast.makeText (getApplicationContext(), "Времена Вверх" + String.valueOf (раз [число]), Toast.LENGTH_SHORT); // t.show(); count ++;

     if (count < 3) 
         { 

          countDownTimer = new MyCountDownTimer(times[count], interval); 
          countDownTimer.start(); 
         } 

         else 
         { 
         count=0; 
          startB.setEnabled(true); 
          timerHasStarted=false; 

         } 


         } 

ответ

0

Я не знаю, остается ли вопрос актуальным.

Вы должны проверить, где отображается переменная mCount. Когда вы LoadPreferences, вы читаете «mCount» в mCount, используя его значение undefined по умолчанию. Затем вы снижаете значение чтения, выполняя mCount = count. Вы имели в виду счет = mCount?

После LoadPreferences в onCreate вы устанавливаете счет только в соответствии с savedInstanceState. Так что любые значения LoadPreferences для подсчета игнорируются. Когда действие запускается после того, как вы его убили, нажав BACK, значение savedInstanceState будет равно null, но вы не хотите, чтобы count был 0, если предпочтения говорят об ином.

0

Вместо этого использование отменяет метод таймера обратного отсчета и сохраняет оставшееся время, а затем в режиме возобновления активности начинает новый таймер обратного отсчета