2011-03-03 3 views
1

내 앱이 백그라운드에서 큰 xml 파일을 다운로드 한 다음 데이터베이스를 업데이트 할 때 사용해야합니다. 이 업데이트가 사용자를 귀찮게하지 않고 백그라운드에서 자동으로 실행되기를 바랍니다. 이 부분은 쉽게 보이고 AsyncTask는 내가 여기서 사용하고자하는 것 같습니다. 응용 프로그램이 이미 진행Android : 백그라운드에서 업데이트하고 옵션 진행률 막대를 제공하는 방법

에 이미 업데이트 상태보기)
2를 업데이트하지 않고 경우에만 경우
이 1) 수동으로 업데이트를 시작 :

그러나 나는 또한에 대한 사용자 수있는 방법을 제공 할 내가 지금 보는 바와 같이 여기

이 응용 프로그램의 흐름입니다 :
1) 앱은, 주요 활동 2) AsyncTask를 자동으로 응용 프로그램을
3) 사용자를 업데이트의 주요 활동에 의해 시작됩니다
시작됩니다 시작됩니다 선택됩니다 "업데이트 "주 메뉴에서
4) 사용자 i 업데이트는 백그라운드에서 진행되는 경우 업데이트 작업
5)되게 S :
--5A) 사용자가 보는 진행률 표시 줄
--5B) 그렇지 않으면, 사용자는 I 단계 생각 업데이 트를

을 시작하는 옵션을 본다 4 대 5는 내 주요 문제가있는 곳입니다. 업데이트 활동은 주 활동과는 다른 새로운 활동입니다. 업데이트 활동에서 AsyncTask에 액세스하는 방법을 모르겠습니다.

즉, 하나의 활동에서 AsyncTask를 시작하지만 AsyncTask의 진행 상황을 언제든지 열어서 닫을 수있는 두 번째 활동에만 표시하도록 할 수 있습니다.

내가 탐구 해 왔던 몇 가지 옵션에는 Service와 BroadcastReceiver가 포함되어 있지만 좋은 결정을 내리는 데는 충분하지 않습니다.

도움 주셔서 감사합니다.

답변

0

서비스를 살펴 보는 것이 좋을 것 같습니다. 아마도 알림 API를 사용하여 진행 상황을 표시 할 수 있습니다. 이 경우 두 번째 활동이 필요하지 않을 수도 있습니다. 사용자가 업데이트 버튼을 클릭하면 알림 표시 줄에 진행 상태가 표시되며 사용자가 앱을 종료하면 알림 표시 줄이 계속 작동합니다.

+0

제안 해 주셔서 감사합니다. 서비스에 대한 한 가지 확실한 점은 서비스를 한 번에 여러 번 사용할 수 있는지 여부입니다. 예를 들어 앱 (기본 활동)이 시작될 때 업데이트 서비스가 호출 된 후 사용자가 다른 활동에서 업데이트 서비스를 수동으로 요청하면 두 개의 동시 업데이트가 수행됩니까? 아니면 서비스는 기본적으로 싱글 톤과 같은 클래스입니까? –

+0

@Max 헤드 룸은 싱글 톤이 아니며, 어떤 컨텍스트에서든 'startService'를 호출하면 onStartCommand'가'startService'를 호출하는 데 사용 된 인 텐트와 함께 호출됩니다. 따라서 startService는 동시에 여러 작업을 처리 할 수있는 장소입니다. 'que'연산을 원한다면 모든 IntentService를 사용하여 모든 논리를 처리하고 의도가 들어올 때'onStartCommand'를 한 번에 하나씩 끕니다. 희망이 있습니다! – schwiz

1

오케이, 많은 독서와 테스트를 마친 후, 어떻게 끝내 었는가?

AsyncTask가 포함 된 서비스 (UpdateService)가 있습니다. 앱이 시작되면 UpdateService도 자동으로 시작됩니다. 업데이트가 필요하지 않으면 UpdateService가 중지됩니다. 업데이트가 필요한 경우 UpdateService는 AsyncTask에서 파일을 다운로드하고 데이터베이스를 업데이트 할 수있게합니다.

언제든지 사용자가 활동 (UpdateActivity)의 확장 인 업데이트 페이지를 볼 수 있습니다. UpdateActivity가 호출되면 UpdateActivity는 UpdateService에 바인딩됩니다. UpdateService는 시작될 때 (OnStartCommand()) 바인딩 된 경우 (onBind())가 아니라 모든 작업을 수행합니다.

UpdateActivity는 ProgressUpdate()라는 단일 메서드를 포함하는 ProgressListener라는 사용자 지정 인터페이스를 구현합니다. UpdateService는 ProgressListener를 받아 들일 수 있습니다.

UpdateActivity가 UpdateService에 바인딩되면 두 가지 일이 발생합니다. 1) UpdateActivity는 자신에 대한 참조를 UpdateService에 ProgressListener로 보냅니다. 2) AsyncTask의 상태가 점검됩니다. AsyncTask의 상태가 Status.RUNNING이면 UpdateActivity의보기에 진행률 막대가 표시됩니다. 그렇지 않으면 버튼 ("지금 업데이트")이 표시됩니다.버튼을 클릭하면 진행 막대가 표시되고 UpdateService (onStartCommand())가 시작됩니다.

AsyncTask는 백그라운드에서 업데이트를 수행하므로 publishProcess()를 호출하여 진행 보고서를 UpdateService로 다시 보냅니다. ProgressListener (UpdateActivity)가 등록되면 UpdateService는 onProgressUpdate()를 호출하여 진행률 보고서를 해당 UpdateActivity에 보내고 진행률 막대를 업데이트합니다.

사용자는 UpdateActivity를 언제든지 입력하고 종료 할 수 있으며 진행률 막대는 대부분 예상대로 표시됩니다.

이것이이 효과를 얻는 가장 좋은 방법인지는 모르지만 지금은 저에게 효과적입니다.

포인터 주셔서 감사합니다.

관련 문제