내 활동 중 하나가 포 그라운드에 있는지 확인하는 방법
이 질문에 이미 답변이 있습니다.
AlarmManager에 의해 트리거되는 BroadcastReceiver를 구현했습니다. AlarmManager는 BOOT_COMPLETED에서 초기화됩니다. 따라서 매니페스트에서 수신자를 선언해야합니다.
내 문제는 내 자신의 활동이 전경에 없을 때만 BroadcastReceiver가 무언가를 수행하기를 원한다는 것입니다 (사용자가 내 응용 프로그램과 상호 작용하지 않음). 원격 서버에서 정보를 가져오고 그가 현재 내 응용 프로그램에있는 경우 사용자에게 알리고 싶지 않습니다.
지금까지 내 응용 프로그램이 포 그라운드에 있는지 확인하는 방법을 찾지 못했습니다. 그런 일을 할 수있는 방법이 있습니까? ActivityManager는 내 애플리케이션이 실행 중인지 여부를 알려주지 만 포 그라운드에 있는지 여부는 알려줍니다.
문제는 여기에 설명 된 것과 거의 동일 합니다. 전경에있는 경우에만 BroadcastReceiver에서 활동 알림
해결책:
여러 솔루션을 평가 한 후 배경 / 전경에서 활동을 처리하는 가장 좋은 방법이라고 생각하는 것을 빠르게 요약하고 싶습니다.
선호하는 방법은 활동의 onResume 메소드에 브로드 캐스트 수신기를 등록하고 onPause의 활동에서 등록을 취소하는 것입니다. 모든 서비스 또는 기타 백그라운드 요소는 활동이 가로 챌 특정 작업과 함께 브로드 캐스트 인 텐트를 전송해야합니다.
활동이 포 그라운드에 있으면 인 텐트 수신자가 등록되고 서비스에서 인 텐트 전송을 직접 처리 할 수 있습니다. 포 그라운드에 있지 않으면 인 텐트를 수신하지 않지만 브로드 캐스트를 호출 한 서비스는 아무도 브로드 캐스트 인 텐트를 가로 채지 않았 음을 알고 자체적으로 처리 할 수 있습니다. 예를 들어 원하는 활동을 시작하고 알림을 표시 할 수 있습니다.
다음 답변 : " 백그라운드에서 실행중인 응용 프로그램 " 은 백그라운드 / 전경 검사에 사용할 수있는 솔루션을 요약합니다.
참고 :
이전에이 답변은를 사용하도록 제안 ActivityManager.getRunningAppProcesses()했지만이 방법은 완전히 신뢰할 수없는 것으로 보였으며 사용을 권장하지 않습니다. 자세한 내용은 위의 링크를 확인하십시오.
활동은 포 그라운드에 있는지 여부에 대한 자체 상태를 추적 할 수 있습니다 (부울을 truein onStart(), falsein으로 설정 onStop()). 아아, 그 부울은 Activity자동으로 제공되지 않습니다 .
ActivityManager#getRunningAppProcesses()목록을 반환합니다 RunningAppProcessInfo. 각각 RunningAppProcessInfo에는 중요도라는 필드가 있습니다. 중요도 RunningAppProcessInfo.IMPORTANCE_FOREGROUND는 사용자가 어떤 활동을 적극적으로 관찰하고 있는지 보여줍니다. 또한이 RunningAppProcessInfo.IMPORTANCE_VISIBLE낮은하지만 가치가 체크 아웃 될 수있다.
활동이 포 그라운드에 있는지 확인하려면 내 솔루션을 확인 하십시오 . http://www.mannaz.at/codebase/android-activity-foreground-surveillance/
논리를 "포 그라운드"에서 "포 그라운드가 아님"으로 쉽게 되돌릴 수 있어야합니다.
AlarmManager에 의해 트리거되는 BroadcastReceiver를 구현했습니다. AlarmManager는 BOOT_COMPLETED에서 초기화됩니다. 따라서 매니페스트에서 수신자를 선언해야합니다.
내 문제는 내 자신의 활동이 전경에 없을 때만 BroadcastReceiver가 무언가를 수행하기를 원한다는 것입니다 (사용자가 내 응용 프로그램과 상호 작용하지 않음). 원격 서버에서 정보를 가져오고 그가 현재 내 응용 프로그램에있는 경우 사용자에게 알리고 싶지 않습니다.
지금까지 내 응용 프로그램이 포 그라운드에 있는지 확인하는 방법을 찾지 못했습니다. 그런 일을 할 수있는 방법이 있습니까? ActivityManager는 내 애플리케이션이 실행 중인지 여부를 알려주지 만 포 그라운드에 있는지 여부는 알려줍니다.
활동 중 하나가 현재 실행중인 포 그라운드 활동인지 확인하는 직접적인 방법이없는 것 같습니다. 단, 주문형 방송과 2 개의 방송 수신기를 사용하면 원하는 효과를 얻을 수 있습니다. 하나의 브로드 캐스트 수신기를 OnResume ()에 등록하고 OnPause ()에 등록 해제해야합니다. 두 번째 broadcast receiver는 이미 완료 한 것처럼 manifest에 선언됩니다. 동적으로 등록 된 수신기가 등록 된 경우 인 텐트를 먼저 수신 한 다음 매니페스트에 등록한 브로드 캐스트 수신기가 알림을받지 않도록 인 텐트를 먹을 수 있도록 수신기에 대한 android : priority를 설정합니다.
창에 포커스가 있는지 테스트 할 수 있지만 dev 문서에 명시된 것처럼 활동이 포 그라운드에있는 것과 동일하지 않습니다.
훨씬 깨끗한 솔루션을 얻으려면 ActivityLifecycleCallbacks 를 사용 합니다.
그것은 수있는 안전하지 읽고, 이 프로덕션에 아래의 예를 사용하기로 결정하기 전에. 내 기기 및 OS 버전의 '가정 개발'에서 작동합니다.
public class App extends Application implements Application.ActivityLifecycleCallbacks {
private boolean inForeground;
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(this);
}
@Override
public void onActivityResumed(Activity activity) {
inForeground = activity instanceof YourActivity;
}
public boolean isInForeground() {
return inForeground;
}
등록 App에 AndroidManifest:
<application
android:name=".App" />
그리고 마지막 퍼즐 조각 :
public class YourReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
App app = (App) context.getApplicationContext();
if(app.isInForeground()){
// do some stuff
}
}
}
'Program Club' 카테고리의 다른 글
| 높이 : 0 패딩을 숨기지 않는 이유 (0) | 2020.12.09 |
|---|---|
| DLL 등록은 무엇을합니까? (0) | 2020.12.09 |
| backbone.js를 배우는 가장 좋은 방법은 무엇입니까? (0) | 2020.12.09 |
| SQL 쿼리에 대한 기본 스키마 설정 (0) | 2020.12.09 |
| 사용 가능한 backbone.js 책이 있습니까? (0) | 2020.12.09 |