2012-12-26 1 views
3

응용 프로그램이 포 그라운드인지 확인하는 데에는 많은 이유가 있습니다. 예 : - GCM/C2DM 푸시 알림의 트리거로 사용됩니다. 앱의 많은 부분이 앱이 포 그라운드와 백그라운드 일 때 서로 다른 동작을 구현하는 좋은 이유가 있습니다. 다른 이유로는 예를 들어 백그라운드 작업에서 서버를 쿼리하는 것과 같이 귀중한 리소스를 소비하는 서비스를 중단시킬 수 있습니다. 포 그라운드에서 응용 프로그램이 싫어하는 것인지 확인하십시오.

그냥 명확합니다 : 배경 응용 프로그램에 대한 정의는 (내가보기로)이다 : 그것은 활동 중 어느 것도 onStart() 방법을 호출되지 않으며, 아직 onStop() 메소드를 호출하지 않았다
응용 프로그램입니다. 그 시간에만 활동이 사용자의 라이프 사이클에서 볼 수 있기 때문에 그게 바로입니다. 다른 한편에서

-

  • 가 홈 버튼에 반응하는 응용 프로그램을하지 않으려는 구글처럼 보인다는

  • 는에 onBackPressed()에 반응 (그것은 API의 일부가 아니다)은 " Activity을 떠나기위한 지표로 "root/main"활동을 사용하는 것이 좋습니다 (많은 사용자가 뒤로 버튼이 아닌 홈 버튼을 사용하기 때문에).

  • 응용 프로그램이 포 그라운드 인 경우 termine (내 정의에 따라 ..)

내가 API에 뭔가를 놓치지 않았고, 정말 경우 없다면 - 응용 프로그램이있는 경우 쉽게 결정하기 위해 왜이 왜 전경 이냐 아니냐 ???? !!!! 내가 전경하는 응용 프로그램이 스레드에 설명되어 있는지 확인을 할 수있는 알고있는

-

하지만 How to detect when an Android app goes to the background and come back to the foreground @Emil 말과 같은 -은 특별 허가를 필요로하는, 또는 필요로하는 몇 가지 까다로운 논리의 매우 빠른

: 문제가되는 것은

내 질문은 기본적으로 있습니다 (... 내가 더 좋은 생각을 가지고 있지 않기 때문에 즉, 내가 지금 뭘하는지 비록)을 유지하고, 나쁜 접근 냄새하기

  • 좋은 이유로 그러한 API 메소드가 있습니까?

  • 응용 프로그램이 포 그라운드인지 여부를 고려하면 좋지 않은 접근 방법입니까?

  • 응용 프로그램이 포 그라운드인지 여부를 확인하는 다른 방법이 있습니까? 응용 프로그램이 전경인지 나쁜 방법 인 경우

답변

5

은 고려합니까?

전경 대 배경을 고려하는 것이 합리적입니다.

응용 프로그램이 포 그라운드인지 여부를 확인하는 다른 방법이 있습니까?

당신은 대략 두 그룹으로 이것에 대한 시나리오를 나눌 수 있습니다 : 당신이 전경/배경 상태의 변화에 ​​따라 즉시 조치를 취해야 할

  1. 케이스

  2. 케이스 곳 어떤 다른 이벤트가 발생하고 (AlarmManager 알람, 들어오는 시스템 브로드 캐스트 등), 그 시점에서 포어 그라운드에 있는지 여부에 따라 다른 작업을 수행하려고합니다.

전자의 경우 가장 신뢰할 수있는 간단한 옵션은 onUserLeaveHint()입니다. 모든 사례를 다룰 수 있다고 보장 할 수는 없지만 예를 들어 HOME 시나리오를 처리해야합니다. 또한 정적 데이터 멤버에서 시작된 활동의 참조 횟수를 유지하고 대신이를 사용하려고 시도 할 수도 있습니다.

후자의 경우 ordered broadcast이 유용 할 수 있습니다.

+0

당신의 대답은 내 머리 속에서 몇 가지 순서를 만들었습니다 ... 두 번째 시나리오의 해결책으로 주문한 방송에 대해서는 생각하지 않았습니다. 그 경우에는 완벽 해 보입니다. 첫 번째 경우에 대해 - 나는 onUserLeaveHint() 메소드에 익숙하지 않았습니다. 그것이 존재한다는 것을 알기는하지만, 당신이 말했듯이 - 여전히 모든 것을 다루지는 않습니다. 시작된 활동과 멈추지 않은 활동의 수를 나타내는 정적 변수는 내가하고있는 일이며, 당신의 충고 후에 나는 이것과 함께 살 것입니다. 솔루션을 벌채하지 않고 해결책을 찾았습니다. :) –

0

나는 동일한 문제가있었습니다. 내 활동이 포 그라운드 모드가 아닌 경우 푸시 알림을 표시하려고합니다. 다음 코드를 따라 가면 답변을 얻을 수 있습니다.

Context ctx = context.getApplicationContext(); 

    ActivityManager am = (ActivityManager) context 
      .getSystemService(ACTIVITY_SERVICE); 

    // get the info from the currently running task 
    List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1); 

    PackageManager pm = this.getPackageManager(); 

    try { 
     /** 
     * take fore ground activity name 
     */ 
     ComponentName componentInfo = taskInfo.get(0).topActivity; 
     if (printLog == true) { 
      Log.d("Home", "CURRENT Activity ::" 
        + taskInfo.get(0).topActivity.getClassName()); 
      Log.d("Home", "Number Of Activities : " 
        + taskInfo.get(0).numRunning); 
      Log.d("Home", 
        "Componenet Info : " + componentInfo.getPackageName()); 
      Log.d("Home", 
        "Componenet Info : " + componentInfo.getClassName()); 
     } 
     /** 
     * All activities name of a package to compare with fore ground 
     * activity. if match found, no notification displayed. 
     */ 
     PackageInfo info = pm.getPackageInfo(
       "<PackageName>", 
       PackageManager.GET_ACTIVITIES); 
     ActivityInfo[] list = info.activities; 

     for (int i = 0; i < list.length; i++) { 
       Log.d("TAG","Activity : "+list[i].name); 
     } 

    } catch (NameNotFoundException e) { 
     e.printStackTrace(); 
    } 

사용하려면 manifest 파일에 허가를 받아야합니다.

는 사용-권한 안드로이드 : 이름 = "android.permission.GET_TASKS"

실례를 내가 질문을받을 수없는 경우.

+0

답장을 보내 주셔서 감사합니다. 그러나 제가 이미 abot을 알고있는 답을 보여주는 다른 게시물에 대한 링크를 첨부했습니다. 너는 질문의 시체에서 그것을 볼 수있다 .. –

0

앱이 백그라운드에서 실행중인 서비스의 backround 또는 foreground에 있는지 알아야하는 경우 (그렇지 않으면 별 의미가 없습니다), 바인딩을 사용할 수 있습니다. 즉, 바인딩합니다. 모든 당신의 활동 onResume, 모든 활동 onPause에 바인딩 해제. 그런 다음 서비스에서 사용자에 대한 애플리케이션 가시성뿐만 아니라 언제든지 어떤 활동이 열려 있는지를 관리 할 수 ​​있습니다. 안드로이드의 API를 사용하고 안드로이드 OS 코드 자체의 정확성에 의존 할 때 누수 방지 기능과 정적 변수 (필수 변수 인 경우 정리할 수 있음)가 안정적입니다.