마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

startActivityForResult 관련 또 질문 드립니다 ㅠㅠㅠㅠ

0 추천

RecipeA.java

public void onTimerClicked(View v) {
    Intent intent = new Intent(getApplicationContext(), TimerActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    startActivityForResult(intent, 0);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(resultCode == RESULT_OK && requestCode == 0) {
        RecipeA.mViewPager.setCurrentItem(6);
    }
    else
        RecipeA.mViewPager.setCurrentItem(4);
}

 

TimerActivity.java

public class TimerActivity extends Activity{

    private CountDownTimer countDownTimer;
    private boolean timerHasStarted = false;

    private Button button;
    private TextView tvtimer;

    private long starttime = 1800 * 1000;
    private final long interval = 1 * 1000;
    private int secs;
    private int minutes;
    private int seconds;
    private long remainingmillisec;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
        layoutParams.flags = WindowManager.LayoutParams.FLAG_DIM_BEHIND;
        layoutParams.dimAmount = 0.7f;
        getWindow().setAttributes(layoutParams);
        setContentView(R.layout.activity_timer);

        tvtimer = (TextView) findViewById(R.id.tv_timer);
        button = (Button) findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                if (!timerHasStarted) {
                    Log.d("Starttime", "KK" + starttime);
                    countDownTimer = new MyCountDownTimer(starttime, interval);
                    secs = (int) (starttime / 1000);
                    minutes = (secs % (60 * 60) / 60);
                    seconds = (secs % (60 * 60) % 60);
                    tvtimer.setText("" + String.format("%02d", minutes) + ":" + String.format("%02d", seconds));
                    countDownTimer.start();
                    timerHasStarted = true;
                    button.setText("멈추기");
                } else {
                    starttime = remainingmillisec;
                    Log.d("StoTime", "KK" + starttime);
                    countDownTimer.cancel();
                    timerHasStarted = false;
                    button.setText("시작하기");
                }
            }
        });
    }

    public class MyCountDownTimer extends CountDownTimer {
        public MyCountDownTimer(long starttime, long interval) {
            super(starttime, interval);
        }
        @Override
        public void onFinish() {
            Intent intent = getIntent();
            tvtimer.setText("시간종료");
            setResult(RESULT_OK, intent);
            finish();
        }

        public void resume(){}

        @Override
        public void onTick(long millisUntilFinished) {
            remainingmillisec = millisUntilFinished;
            secs = (int)(millisUntilFinished / 1000);
            minutes = (secs%(60*60)/60);
            seconds = (secs % (60 * 60) % 60);

            tvtimer.setText("" + String.format("%02d", minutes) + ":" + String.format("%02d", seconds));
        }
    }
}

requestCode 체크 이후에도 setCurrentItem(4)가 실행됩니다 ..

- 원하는 것은 타이머 버튼이 눌러지면 타이머가 자동으로 실행되고,

시간이 종료되어 타이머 액티비티가 종료되면 setCurrentItem(6)으로 이동하게 하고 싶습니다

다시 한 번 조언 부탁드립니다 ㅠㅠㅠㅠㅠㅠ

샐리 (440 포인트) 님이 2016년 9월 30일 질문
startActivityForResult를 호출할때 넘기신 intent의 flag 값때문에 그럴겁니다. 우선 플래그에 값을 주지 말고 잘 되는지 테스트해 보세요.

4개의 답변

0 추천
 
채택된 답변
따로 별도의 데이터 교환이 없다면 Timer에서 onFinish 함수에 Intent를 getIntent를 굳이 하시지 마시고

setResult 함수 보면 Intent 없이 그냥 resultCode만 넣어서도 수행 시킬 수가 있습니다.

그렇게 한번 해보세요.

 

그렇게 해도 안되면 첫번쨰 화면에서 Activity flag를 빼보시겠어요?
Development Guy (70,570 포인트) 님이 2016년 9월 30일 답변
샐리님이 2016년 9월 30일 채택됨
또 답변 해주셔서 정말 정말 감사합니다 ㅠ.ㅠ
0 추천
메니페스트에서

launchMode를 singleTask로 설정한 건 아닌지 살펴보세요.

이럴경우 onActivityResult는 무용지물됩니다.
개발자초심 (21,220 포인트) 님이 2016년 9월 30일 답변
ㅠㅠㅠㅠ 해결되었습니다 정말 감사합니다!
0 추천

FLAG_ACTIVITY_NEW_TASK flag로 인하여 Task가 분리되는경우 onActivityResult는 Activity 실행되자 마자 cancel값이 넘어옵니다.

result를 받으시려면 New Task가 아닌 상태로 activity를 호출하셔야합니다.

 

frzin (140 포인트) 님이 2016년 9월 30일 답변
감사합니다ㅠㅠㅠ 덕분에 해결되었습니다!
0 추천

 

remainingmillisec = millisUntilFinished;
            secs = (int)(millisUntilFinished / 1000);
            minutes = (secs%(60*60)/60);
            seconds = (secs % (60 * 60) % 60);

            tvtimer.setText("" + String.format("%02d", minutes)

 

코드의 재사용과 테스트의 용이성을 위해서, 이 부분은 별도의 유틸 클래스로 빼시는 게 좋은 것 같습니다.

public class TimeCountUtil {

public static class MinSec {

     public int minutes;
     public int seconds;

   public MinSec(int minutes, int seconds) {
      this.minutes = minutes;
      this.seconds = seconds;
   }

    public boolean hasMinutes() {
           return minutes != 0;
    }

    public boolean hasSeconds() {
           return seconds != 0;
    }
    
    public String formatMinutes() {
           return String.format("%02d", minutes);
    }

    public String formatSeconds() {
           return String.format("%02d", seconds);
    }
      
    public String toString() {
        StringBuilder sb = new StringBuilder();

        if (hasMinutes()) {
            sb.append(String.format("%02d", minutes));
        }

        if (hasSeconds()) {
            sb.append(String.format("%02d", seconds));
        }

       return sb.toString();
   }
}


public static int millsToSec(long mills) {
     return (int)(mills / 1000);
}

public static MinSec secsToMinSecs(int secs) {
            minutes = (secs%(60*60)/60);
            seconds = (secs % (60 * 60) % 60);

          return new MinSec(minutes, seconds);
}
            
}

 

MicSec minSec = TimeCountUtils.secsToMinSecs(TimeCountUtils.millsToSecs(millisUntilFinished));

tvtimer.setText(micSec.formatMinutes());

 

이렇게 하시면 별도로 TimeCountUtil 만 JUnit 테스트를  하실 수 있습니다.

spark (227,470 포인트) 님이 2016년 10월 1일 답변
spark님이 2016년 10월 1일 수정
...