2014-10-20 3 views
3

나는 안드로이드 애플리케이션 개발에 초보자이기 때문에 내 애플리케이션을 성공적으로 실행하는데 심각한 문제가있다. 내 안드로이드에 안드로이드 플랫폼 개념과 PC 프로그래밍 개념의 사용 부족으로 인해 내 문제의 대부분을 설명 할 수있을 것 같아! ;)Android 백그라운드 서비스 제어 UI 활동

내가 의도 한 것은 UI 기반의 안드로이드 응용 프로그램을 개발하는 것이지만 응용 프로그램이 데몬처럼 작동해야한다는 강한 요구 사항이 있습니다! 내가 대몬이라고 말할 때; 응용 프로그램이 시작되면 UI가 보이지 않아야합니다! 특정 웨이크 업 이벤트에 따라 애플리케이션 표시가 활성화되어 UI가 사용자에게 표시됩니다. 마찬가지로 특정 수면 이벤트에 따라 응용 프로그램 UI를 숨겨야합니다. 안드로이드의 알람 어플리케이션과 비슷한 것.

안드로이드 용 Qt 포트를 사용하고 응용 프로그램이 매력처럼 작동하기 때문에 UI 부분이 매우 쉽습니다. 그러나 이것은 정상적인 응용 프로그램과 동일하게 작동하며 위에서 설명한 요구 사항을 포함하지 않습니다. 나는 Qt 문서를 보았고 이것을 달성 할 조항이 없었고 일부 포럼에서는 이것을 달성하기 위해 안드로이드 SDK 메소드를 사용하도록 권장했다.

저는 자바 전문가가 아니기 때문에 안드로이드 개발에 대해 많이 읽었으며 위의 요구 사항을 만족시키는 응용 프로그램을 만들었지 만 몇 가지 문제가 있습니다. 접근. 그래서 내가 아래에서했던 것을 요약합니다.

  1. android.app.Service 및 overriden onStartCommand에서 나는 깨우기 및 잠자기 이벤트를 확인하는 작업자 스레드를 만들고 있습니다. 토론을 위해 웨이크 업 이벤트가 매 60 분마다라고 가정하고 휴면 이벤트는 웨이크 업 후 5 분과 같습니다. onStartCommand 방법 내에서
  2. , 나는 (6 단계 아래 내가이 일을하고 이유를 설명)을 받기 위해 내 서비스를 만들어 활동을 기대 텐트를
  3. 웨이크 업 조건을 만족에 작업자 스레드, 내 UI 활동을 시작으로 방송하고 다음과 같이

    Intent activityIntent = new Intent(getBaseContext(), MyUIActivity.class); activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); getApplication().startActivity(activityIntent);

  4. 수면 조건을 만족에 작업자 스레드를, 그것을받을 수있는 UI 활동을 기대 인 텐트를 브로드 캐스트하여 완료 내 UI 활동을 요청합니다.

  5. onStartCommand는 결국 START_NOT_STICKY를 반환합니다.
  6. 위의 2 단계에서 서비스를 시작한 후 IntentFilter를 사용하여 BroadcastReceiver 인스턴스를 등록하는 주 활동이 있습니다. Intent를 수신하면 UI 서비스를 닫아 내 서비스를 대몬스럽게 처리하는 finish()를 호출합니다!

위의 설정은 정상적으로 작동하며 적절한 토스트 메시지로 백그라운드에서 서비스를 볼 수 있으며 웨이크 업 조건이 충족되고 Qt 위젯이 화면에 완벽하게 표시 될 때 UI가 표시됩니다. 그러나이 설정이 안전하게 작동하는 데는 몇 가지 문제가 있습니다. 다음은 문제입니다 (실제 문제인지 확실하지 않음).

가끔 앱을 실행하면 onStartCommand 메소드에서 서비스가 시작되었다는 메시지를 볼 수 없지만 logcat에 다음 메시지가 표시됩니다. :

W/ActivityManager( 628): Scheduling restart of crashed service org.example.myapp/.MyService in 1000ms I/ActivityManager( 628): START u0 {flg=0x10000000 cmp=org.example.myapp/.MyApplicationActivity (has extras)} from pid 21764 W/ActivityManager( 628): Permission Denial: starting Intent { flg=0x10000000 cmp=org.example.myapp/.MyApplicationActivity (has extras) } from null (pid=21764, uid=2000) not exported from uid 10129

내가 수동으로 응용 프로그램을 시작하려고하면 잘 작동!

끝으로, finish()를 호출하여 UI 작업을 숨기려고 할 때 이 후

I/WindowState( 628): WIN DEATH: Window{428ef138 u0 org.example.myapp/org.example.myapp.MyApplicationActivity} W/ActivityManager( 628): Scheduling restart of crashed service org.example.myapp/.MyService in 1000ms W/WindowManager( 628): Force-removing child win Window{41962f40 u0 SurfaceView} from container Window{428ef138 u0 org.example.myapp/org.example.myapp.MyApplicationActivity}

, 서비스가 더 이상 활성 상태가 : 나는 다음과 같은 메시지를 볼 때이 없다 생각!

근본적으로 제 질문은 이것이 올바른 방법인가요?

답변

0

잠자기 이벤트가 발생하면 기기가 절전 모드 (예 : 화면 꺼짐) 또는 켜져 있는지 확인하십시오.

이미 잠자는 경우 이미 잠자고 있기 때문에 수신자가 의도를받지 못합니다. 액티비티에 nay 플래그를 설정해야 액티비티가 다시 시작되고 그에 따라 액션을 수행하고 액티비티 인스턴스를 완료 할 때 확인할 수 있습니다.

서비스 수명주기가 활동의 수명주기와 관련되어 있지 않으므로 토스트 메시지가 표시되지 않습니다. 서비스는 명시 적으로 중지하거나 시스템에서 강제 종료 할 때까지 백그라운드에서 계속 실행됩니다.

+0

내가 준 수면 이벤트는 단지 예일뿐입니다. 하지만 장치가 항상 작동하고 잠긴 상태가 아닌지 확인할 수 있습니다. 필자는 다음을 추가해야합니다. UI가 실행될 때마다 화면이 항상 표시되도록해야합니다 (백라이트를 희미하게하거나 자동으로 잠그지 않아야 함). 따라서 내 UI 활동의 onResume 재정의 메서드 내에서 getWindow(). addFlags (LayoutParams.FLAG_KEEP_SCREEN_ON)를 호출하고 onPause 메서드 내에서 getWindow(). clearFlags (LayoutParams.FLAG_KEEP_SCREEN_ON)를 호출하여 장치가 잠자기 상태가되지 않도록합니다. . – asumang

관련 문제