2010-07-13 9 views
3

내 애플리케이션이 백그라운드에서 실행되었음을 알리는 방법 (즉, 내 앱의 활동이 더 이상 표시되지 않음) 내 활동 (그래픽, 사운드 클립 및 소켓 연결) 중 몇 가지 사이에서 공유되는 리소스를 릴리스 할 수 있도록 이것을 결정해야합니다.앱이 백그라운드에서 실행 중인지 확인

저는 액티비티의 onStart() 메소드에서 증가하고 onStop()에서 감소한 글로벌 카운터를 유지하는 방법에 대해 생각해 보았습니다. 카운터가 0에 도달하면 모든 활동이 중단되고 내 앱이 백그라운드에서 실행됩니다. 그러나 이것이 100 % 신뢰할 수 있는지 확실하지 않습니다. 또한, 나는 이것을 할 수있는 더 좋은 방법이 있어야한다고 생각합니다.

+2

가능한 복제본 http://stackoverflow.com/questions/3136187/how-to-detect-if-any-of-my-activity-is-front-most-and-visible-to-user – Pentium10

답변

0

영구 저장소에 보관되어 있다고 가정하면 글로벌 카운터를 사용할 수 있습니다. 시스템은 다른 응용 프로그램의 압력에 따라 장치 RAM에서 unload and reload activities까지 무료로 제공되므로 활동의 인스턴스 변수가 해당 데이터를 저장하기에 좋은 선택이 아닐 수 있습니다.

너와 같은 시나리오를 처리하는 Android 방식은 연결 상태를 service에서 관리하고 영구 저장소를 사용하여 응용 프로그램 상태를 모니터링하는 것입니다.

+0

이 서비스는 약간 중량급 인 것 같습니다. 또한, 연결이 필요한 것은 아니며, 앱이 백그라운드에서 실행될 때 공개하고 싶은 그래픽 및 사운드 클립과 같은 다른 활동도 공유합니다. 문제). 물론 카운터는 Activity 인스턴스 변수에 보관되지 않습니다. 아마 내 애플 리케이션에있는 사용자 정의 응용 프로그램 클래스에 살고, 물론 내 애플 리케이션의 전체 일생 동안 지속됩니다. – Haakon

0

이 기능이 필요한 경우 아키텍처가 제대로 설계되지 않았을 수 있습니다. 각 활동은 어떤 식 으로든 "독립형"이어야하므로 중지 될 때 연관된 모든 데이터를 해제해야합니다. 액티비티간에 몇 가지 지속성 데이터를 저장해야하는 경우 SQL 또는 일부 다른 데이터 저장소를 사용하고 액티비티간에 공유 리소스가 필요한 경우이를 사용하십시오. 활동들 간의 결합을 격리하십시오.

+0

아키텍처에는 문제가 없습니다. 애플리케이션이 백그라운드에서 유입 될 때마다 삽입 광고를 게재하려는 이미지입니다. 그렇다면 자원을 지속시키는 문제는 아니지만 앱의 라이프 사이클에서 어떤 일이 발생했는지 파악하는 것입니다. – middlehut

2

당신이 알 필요가 없습니다,하지만 당신에게 대답 : 당신의 주요 활동에

을 : 아직 자신이 시도하지 않은

public boolean inBackground; 

@Override 
public void onPause() 
{ 
    inBackground=true; 
    super.onPause(); 
} 

@Override 
public void onResume() 
{ 
    inBackground=false; 
    super.onResume(); 
} 
0

,하지만 난 생각 일 것이다 다음 .

  • extends Activity (제안한대로 in this SO question) 사용자 지정 활동 클래스를 만듭니다.
  • 모든 액티비티가 사용자 정의 액티비티 클래스를 확장하는지 확인하십시오.
  • @onStop() 메서드를 오버라이드합니다 (Activity life cycle docs 기준).
  • onStop() 코드가 Droid-Fu project에 기반한 아래의 유틸리티 메소드를 호출하여 앱이 백그라운드에 있는지 알아보십시오.

내 새로운 걱정거리 (앱도)가 시작되기 전에 마지막 활동이 종료 될 때 타이밍 창이있을 수 있지만 걱정하지 않으셔도됩니다.

public static boolean isApplicationInBackground(Context context) 
{ 
    ActivityManager am = 
     (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 

    List<RunningTaskInfo> tasks = am.getRunningTasks(1); 

    if (!tasks.isEmpty()) 
    { 
     ComponentName topActivity = tasks.get(0).topActivity; 

     if (!topActivity.getPackageName().equals(context.getPackageName())) 
     { 
      return true; 
     } 
    } 

    return false; 
} 

이 기능을 구현해야 할 수도 있습니다.

업데이트 :이 코드에 대한 빠른 테스트를 수행했습니다.

내 장치에서 실행중인 작업이 ComponentInfo{com.motorola.blur.home/com.motorola.blur.home.HomeActivity}으로 변경되므로 응용 프로그램을 종료하기 위해 홈 키를 누르면 정상적으로 작동하는 것 같습니다. 그러나 코드는 앱을 종료 할 때 뒤로 버튼을 사용할 때 (내 앱이 여전히 실행 중이라고 생각하는 경우) 백그라운드에서 앱을 감지하지 못합니다.

최상위 활동에서 onDestroy()을 (를) 재정의하고 isFinished()을 확인하여 앱이 파괴되고 있음을 확인하면 감지 할 수 있습니다 (예 : 오리 엔테이션 변경의 경우).

관련 문제