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

토글버튼 ON OFF에 대해 액티비티 이동해도 값은 저장되는데 이미지가 저장이 안됩니다.

0 추천

메인 액티비티에서 서비스를 이용해 음악을 재생한 후

서브 액티비티에서 토글을 통해 OFF를 하면 음악은 정지가 됩니다

이후 메인 액티비티 갔다가 다시 서브액티비티 오면 토글은 여전히 OFF로 잘 저장되어 있습니다.

 

그러나 문제는 토글의 기능적인 OFF부분은 잘 저장이 되는데 이미지는 저장이 안됩니다.

( 토글이 OFF면 스피커 꺼짐, ON이면 스피커 켜짐 )

 

토글이 OFF인 것에 대해 스피커가 꺼져있는 아이콘으로 나와야 하는데

기능적인 부분은 잘 되지만 이미지부분은 저장되지 않네요 ㅠㅠ 이 문제를 질문드립니다.

 

DialogActivity.java

public class DialogActivity extends AppCompatActivity {
 
    public Boolean isServiceRunning(String BgmService) {

        ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);

        for (ActivityManager.RunningServiceInfo runningServiceInfo : activityManager.getRunningServices(Integer.MAX_VALUE)) {

            System.out.println(runningServiceInfo.service.getClassName());
            if (BgmService.equals(runningServiceInfo.service.getClassName())) {
                return true;
            }
        }
        return false;
    }
    @Override
    protected void onCreate( Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dialog);

        final ToggleButton tb = (ToggleButton)this.findViewById(R.id.toggleButton);
        tb.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

     if(isServiceRunning("org.cheerluv.onoffmenu.BgmService") == true){
                    tb.setBackgroundDrawable(
                            getResources().
                                    getDrawable(R.drawable.volume_mute_white_24dp));
                    Intent intent = new Intent(
                            getApplicationContext(), //현재제어권자
                            BgmService.class);       //이동할 컴포넌트
                    stopService(intent);        //서비스 시작
                }
                else{
                    tb.setBackgroundDrawable(
                            getResources().
                                    getDrawable(R.drawable.volume_up_white_24dp));
                    Intent intent = new Intent(
                            getApplicationContext(), //현재제어권자
                            BgmService.class);       //이동할 컴포넌트
                    startService(intent);        //서비스 시작

                }
            }
        });

 

BgmService.java

    @Override
    public void onCreate() {
        super.onCreate();
        // 서비스에서 가장 먼저 호출됨(최초에 한번만)
        mp = MediaPlayer.create(this, R.raw.bgm);
        mp.setLooping(false); // 반복재생
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // 서비스가 호출될 때마다 실행
        mp.start(); // 노래 시작
        return super.onStartCommand(intent, flags, startId);
    }
}
익명사용자 님이 2017년 9월 16일 질문
2017년 9월 16일 수정
( 서비스를 이용한 음악 구현 및 토글버튼을 이용한 음악 정지 및 재생 버튼 구현 )

1개의 답변

0 추천
액티비티간 이동을 할 때, 기본적으로 이전 상태가 보관되어 있지 않을 수도 있습니다.

일부 액티비티가 메모리에서 사라지는 경우도 발생하는 것으로 알고 있습니다.

따라서, 이런 경우 항상 상태를 보존하고 싶으면, 최종 상태를 SharedPreference에 보관 했다가,

@override

protecvted void onStart() {

}

안에서 다시 보관된 값으로 세팅을 하는게 바람직합니다.

그러면 어떤 상황에서도 마지막 상태를 보여 줄 수 있죠.
Will Kim (43,170 포인트) 님이 2017년 9월 18일 답변
onCreate()는 액티비티가 메모리 상에서 존재해서 재 호출되는 경우에는 다시 수행이 안되는 경우가 일반적입니다. 그 때는 onStart()와 onResume()만 수행이 될 겁니다.
확인 해 보려면, 해당 위치에서 로그를 남겨서 Main 에서 Sub로 왔다갔다 하는 경우에 호출되는 Overrider Methods가 뭔지 확인해 보면 됩니다.
감사합니다! 확인해보고 하도록 하겠습니다
...