Android - 위젯이 얼마나 자주 업데이트되지만 표시될 때만 업데이트됩니까?

StackOverflow https://stackoverflow.com/questions/2416782

문제

매분마다 콘텐츠를 업데이트해야 하는 위젯을 만들겠습니다(시간 관련 데이터 표시).

그러나 위젯이 현재 보이지 않는 경우에는 업데이트할 필요가 없습니다. 즉, 다음과 같습니다.

  • 화면이 꺼져 있어요
  • 다른 앱이 실행 중입니다
  • 위젯이 다른 (보이지 않는) 홈 화면 탭에 배치되었습니다.

장치를 깨우거나 불필요한 계산을 수행하지 않고 매분 표시되는 위젯만 업데이트하는 가장 좋은 방법은 무엇입니까?위젯이 표시되면 업데이트 전 약간의 지연이 허용됩니다.

도움이 되었습니까?

해결책

화면이 꺼져있을 때 업데이트를 유지하려면 알람 매뉴얼 전화를 깨우지 않는 반복 경보를 예약합니다.

질문에있는 다른 두 개의 총알 포인트는 불가능합니다. 위젯이 현재 보이지 않는 홈 화면에 있는지 여부를 감지 할 방법이 없으며 홈 화면을 숨기는 앱이 실행 중인지 확인할 방법이 없습니다. 나는 티켓을 제출했다 http://b.android.com 이 기능을 Android에 추가합니다. 주연을 맡고 싶다면 우선 순위를 얻는 데 도움이됩니다. http://code.google.com/p/android/issues/detail?id=5529&q=reporter:mark.r.baird&colspec=id%20type%20status%20owner%20Summary%20stars

다른 팁

  1. PowerManager에게 isscreenon ()에 대해 물어볼 수 있습니다.
  2. intent action_screen_off/action_screen_on에 등록하고 그에 따라 타이머를 켜거나 끄십시오.

Alarmmanager와 관련하여 위의 답변은 맞지 않지만 많은 휴대 전화가 유형 *_wakeup이 아닌 경우에도 경보를 전달하는 것을 관찰했기 때문에 충분하지 않을 수 있습니다. 장치를 깨우는 다른 응용 프로그램이 설치되어있는 경우 발생할 수 있습니다. 그리고 한 번 깨어 있다면, 그것은 보류중인 모든 경보를 제공합니다.

나는 이것을 명명 한 프로젝트에서 발견했다 24 클록은 검정 코드입니다. 사용자가 집에서 떨어진 동안 위젯을 업데이트하지 마십시오.

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

    List<RunningTaskInfo> runningTasks = am.getRunningTasks(2);
    for (RunningTaskInfo t : runningTasks) {
        if (t != null && t.numRunning > 0) {
            ComponentName cn = t.baseActivity;
            if (cn == null) continue;

            String clz = cn.getClassName();
            String pkg = cn.getPackageName();

            // TODO make this configurable
            if (pkg != null && pkg.startsWith("com.android.launcher")) {
                return true;
            }

            return false;
        }
    }

요구 사항 #2에 대한 답이 될 수 있습니다. 다른 타사 발사기에서는 작동하지 않을 수도 있습니다.

== 업데이트 ==

몇 달 후, 나는 갑자기 홈 화면이 보여 지는지 여부를 감지하는 방법에 대한 아이디어가 갑자기 있습니다. 나는 그것을 내 안에 넣었다 블로그, 그리고 나는 내 욕망에 대한 시험을 실행했고 그것은 잘 작동합니다. 이 방법은 설치된 모든 패키지에 대해 Android를 쿼리하는 것인데,이 패키지 중 하나는 "런처"기능을 포함한 다음 Running Stack의 상단에 있는지 확인합니다. 테스트 한 사람이라면 다른 Android 장치에 액세스 할 수 없으므로 결과를 알려주십시오.

mbaird의 답변은 머리에 딱 박혔습니다.제안된 onVisivilityChange() 구현된 경우 메서드는 위의 모든 경우를 포괄해야 합니다.

그 동안 이것은 일부 유형의 위젯에서는 여전히 실제 문제입니다.jom은 ACTION_SCREEN_OFF/ACTION_SCREEN_ON 인텐트를 수신하기 위해 등록할 수 있는 가능성을 도입했습니다.이는 다른 서비스에서 깨우기를 발생시키기 때문에 깨우지 않는 반복 알람에 의존하는 것만으로는 충분하지 않기 때문에 유용합니다.이러한 작업은 AndroidManifest.xml을 통해 구독할 수 없고 AppWidgetProvider 호출이 허용되지 않기 때문에 어렵습니다. context.registerReceiver().이러한 문제는 다음을 포함한 여러 다른 StackOverflow 질문에서 논의됩니다. ACTION_SCREEN_OFF 듣기, android.intent.action.SCREEN_ON이 수신자 인텐트 필터로 작동하지 않습니다. 그리고 Android - 방송 의도 ACTION_SCREEN_ON/OFF를 수신하는 방법은 무엇입니까?.

자회사를 생성하여 위젯에서 ACTION_SCREEN_OFF/ACTION_SCREEN_ON 인텐트를 구독하는 데 성공했습니다. BroascastReceiver 인스턴스 및 사용 context.getApplicationContext().registerReceiver() 그것을 등록합니다.이는 부정행위일 수 있으며, 적어도 일부 후속 Android 릴리스에서는 등록 단계에서 실패하거나 이벤트가 전달되지 않을 수도 있습니다.이러한 경우를 처리하도록 코딩했지만 지금은 작동합니다. 불행하게도 애플리케이션이 종료되면 이는 실패하게 됩니다.

또 다른 가능성은 isHomeScreenShowing() 설명된 일종의 방법 여기, xandy의 답변에서 참조됩니다.생성된 설치 목록을 캐싱하여 아이디어를 최적화할 수 있습니다. CATEGORY_HOME 애플리케이션을 업데이트하고 ACTION_PACKAGE_ADDED/CHANGED/REMOVED 브로드캐스트를 수신하여 업데이트합니다.

내 전략은 다음과 같습니다.

  • 보이지 않을 때 (반복 알람을 통해) 호출되는 것을 피하십시오.
  • 호출되면 값비싼 작업을 수행하기 전에 화면 상태 및 기타 가시성 표시기를 확인하세요.
  • 그런 다음에만 호출 IntentService 지속적인 네트워크 연결을 포함하여 상대적으로 비용이 많이 드는 작업을 처리합니다.이는 거의 실시간으로 원격 서비스의 상태를 모니터링하는 데 필요합니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top