2013-05-20 2 views
1

나는 주 업무 및 서비스를 가지고 있습니다. 주 활동은 데이터를 서비스에 준비합니다. 서비스는 데이터를 소비 한 후 mainactivity, mainactivity에 대한 요청을 브로드 캐스트하여 새로운 데이터를 준비하고 서비스에 전달합니다 ...안드로이드 mainactivity 및 서비스 흐름

mainactivity는 사용자가 데이터를 조작 할 수있게합니다. 주전원이 포 그라운드에 있지 않은 경우에 때로 사망합니다.

[문제 1] : 여기서 약간 혼란 스럽습니다. 주 활동이 아직 여기 있지만 UI 스레드와보기가 지워 졌다고 생각합니까? 그래서 UI 스레드를 사용하여 뷰에서 값을 읽고 서비스에 데이터를 보낼 수 없습니까?

[문제점 2] : 어떻게 주전원이 죽었는지 감지하고 서비스가 데이터 자체를 준비하도록 전환 할 수 있습니까?

[문제 3] : 어떻게 강제로 시스템을 죽일 수 있습니까? mainactivity 그래서 프로그램을 디버깅 할 수 있습니까?

감사

업데이트 : 그 그래프는 시간이 초과 될 수 있습니다하지만 여전히 내가 완전히 행동을 이해할 수 없다 읽어 보시기 바랍니다. 사실, 내 질문에 더 많은 것 : 작업 관리자에서 내 응용 프로그램 1 활동 및 1 서비스 및 20MB 램을 소비했습니다. 30 분 후, 내 응용 프로그램은 1 개의 활동과 1 개의 서비스를 가지고 있으며 1.5MB의 램을 소비했습니다. 분명히 뭔가가 활동에 일어났습니다. 그게 뭐죠? 주의 사항 : 내 활동은 서비스 할 데이터 준비를위한 UI Thraad 루프를 사용합니다. 중지/계속 이력서에는 UI 활동에 아무런 영향이 없습니다. 그러면 UI 스레드 활동이 언제 죽을지 어떻게 알 수 있습니까?


업데이트 : 로그 캣 테스트 (로그 메시지를 추가 할 때 onpause/중지시 /들의 OnDestroy라고 ..), 응용 프로그램의 메모리가 1.5MB에 20메가바이트에서 드롭 다운 동안 그러나, 아무도가 호출되지 않습니다.

05-21 23 : 33 : 27.709 : I/mytag (32012)

05-21 23 onResume

요청 : 33 : 30.606 : I/mytag (32012)

05- onPause라고 21 내지 23 : 33 : 31.596 : I/mytag (32012) : 36 : 05.176 :

을 중지시 호출은

05-21 23 지금까지 앱 매니저 20메가바이트 메모리를 사용하여 내 응용을 나타낸다] D를/skia (32012) : 글꼴 캐시에서 144K 제거 [8 entries]

05-21 23 : 36 : 05.246 : D/dalvikvm (32012) : 00 : 10.226 : GC_EXPLICIT는, 52 % 자유 4329K/8839K, 1716K 외부/2137K 1240K 해제는 54ms

05-22 00 D 일시/dalvikvm (32012) : 36 : 10.166 : GC_EXPLICIT가 933K 해제, 53 % 자유 4226K/8839K 외부 1684K/2137K는 85ms

05-22 00 일시 D/dalvikvm (814) GC_EXPLICIT는 56K, 49 % 해방 무료 2775K/5379K, 외부 1625K/2137K는

61ms 내가 30 분을 기다렸다

[이 시점까지, 응용 프로그램 관리자는 1.5MB의 메모리를 사용하여 내 응용 프로그램을 보여줍니다] 일시 정지, 나는하지 않았다 더 이상 로그캣 텍스트 , 테스트가 끝났습니다.

내 앱 메모리를 지우고 싶지만 'onpause/onstop 등'을 트리거하지 않습니다. 어떻게 감지하고 서비스에 뭔가를 할 수 있습니까? 감사합니다.

+0

태그에 대한 활동 대신 android-activity를 사용해야합니다. – Zerkz

+0

또한 데이터 준비를 위해 UI 스레드를 사용해야 할 필요가 있습니까? – Zerkz

답변

1

활동주기를 확인하십시오. 2 및 3에

http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle

답변 (활동이 살해되고있는 서비스/등 "말"로 이동 중지 또는들의 OnDestroy을 위해 뭔가를 구현)이 존재합니다. OnDestroy는 무언가가 "진정으로"곧 죽을 때가 유일합니다.

1 번과 관련하여 귀하의 질문을 완전히 이해하지 못해서 더 잘 설명 할 수 있습니까? 번호 하나에 대한 나의 유일한 생각은 활동을 재창조하는 오리엔테이션 변화를 다루고 있다는 것입니다 (이것은 당신이 어떻게 당신의 뷰를 생성/추가하는지에 따라 문제를 일으킬 수 있습니다).

편집 : 위의 게시 된 링크 .. 활동은 초점을 잃었지만 여전히 (즉, 새로운 비 - 크기 - 전체 또는 투명 활동이 활동의 ​​상단에 포커스가) 볼 수있다 - 만약

에서 일시 중지되었습니다. 일시 중지 된 활동은 완전히 살아 있습니다 (모든 상태 및 구성원 정보를 유지하고 창 관리자에 연결되어 있음). 극도의 메모리 부족 상황에서 시스템에 의해 종료 될 수 있습니다.

- 활동이 다른 활동에 의해 완전히 가려진 경우 중지됩니다. 여전히 모든 상태와 구성원 정보를 유지하지만 더 이상 사용자가 볼 수 없으므로 창을 숨기고 다른 곳에서 메모리가 필요할 때 시스템에 의해 종종 종료됩니다.

- 활동이 일시 중지되거나 중지 된 경우 시스템은 작업 요청을 완료하거나 단순히 프로세스를 종료하여 메모리에서 활동을 삭제할 수 있습니다. 사용자에게 다시 표시되면 완전히 다시 시작하고 이전 상태로 복원해야합니다.

+0

나는 그 그래프를 여러 번 읽었지만 여전히 그 행동을 완전히 이해할 수는 없다. 사실, 내 질문에 더 많은 것 : 작업 관리자에서 내 응용 프로그램 1 활동 및 1 서비스 및 20MB 램을 소비했습니다. 30 분 후, 내 응용 프로그램은 1 개의 활동과 1 개의 서비스를 가지고 있으며 1.5MB의 램을 소비했습니다. 분명히 뭔가가 활동에 일어났습니다. 그게 뭐죠? – manhon

+0

나는 나의 대답을 편집했다. 코드없이 구체적으로 말하기는 어렵습니다. – Zerkz

+0

조언을 주셔서 감사하지만 logcat을 사용하여 테스트했습니다. (onpause/onstop/ondestroy ..가 호출 될 때 로그 메시지 추가), 앱 메모리가 20MB에서 1.5MB로 떨어지는 동안 아무 것도 호출되지 않습니다. – manhon