2013-12-18 4 views
4

먼저, 3 일 동안이 문제에 대한 해결책을 찾고 있다고 말하고 싶습니다. 그 질문은 올바른 질문을하거나하지 않는 것일 수도 있습니다. 좋은 접근법. 있다면, 올바른 방향으로 안내 해주십시오.안드로이드 서비스> 활동> ViewPager로 단편

이것은 시나리오입니다. 나는 Activity이고, 바운드 값은 Service입니다. Service은 일부 데이터를 보유하고 있으며 일부 정보가 포함 된 지속적 (지속적인) 알림을 게시하는 동안 필요에 따라 데이터를 처리합니다. Activity에는 ViewPager 안에 Fragments 세 개가 있으며 Service으로 처리 된 데이터가 표시됩니다.

Fragments

는 사용할 수있는 활성 데이터 항목을 표시하는 목록 조각, 사용자가 데이터가 처리되는 방법을 수정할 수 있습니다 각 데이터에 대한 세부 사항과 매개 변수 조각를 표시하는 세부 조각 있습니다.

[서비스] < -> ([활동] -> [ViewPager ([목록], [정보], [매개 변수])])

모든 것이 잘 작동합니다. 내 ActivityService에 바인딩되고, 이후에 ViewPager이 생성되고 은 정보가 Interface인데 반입됩니다.

재미있는 부분이 있습니다. 화면 회전! 사용자가 그들이 ViewPager에 이미 존재하고 다시 작성하지 덕분이야하면서 Activity 서비스를 경계하기 때문에 데이터가 더 이상 화면 Fragments를 회전 할 때 Service으로

는 비동기 적으로 결합하지 않는다.

나는 이것을 알아 내려고 노력해 왔지만 문제를 해결할 지식이 없다고 생각합니다. 조각에 대한 정적 참조를 만들고, 서비스가 리바운드되기 전에 설정했지만 안정적인 솔루션을 얻을 수 없습니다.

내 매니페스트에는 android:configChanges을 사용하지만 각 방향마다 레이아웃이 다릅니다.

나쁜 접근 방식을 사용하는 경우에도 다시 안내해주세요!

+1

머리가없는 부분을 사용하여 데이터를 보관하고 서비스를 바인딩 할 수 있습니다. [여기] (http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html)는 좋은 자습서입니다. 그것은 비동기 작업과 헤드리스 조각을 사용하는 것에 대해 이야기하지만 동일하게 적용 할 수 있습니다. 이것은 화면 회전을 처리 할 때 권장되는 방법입니다. – Naveed

+0

@Kuffs도 제안했듯이, 그냥 했어. 완벽하게 작동합니다! 충분히 너희들에게 감사 할 수 없다! :) –

+0

어쨌든 당신은 코드를 보여줄 수 있습니다, 나는 활동에서 viewpager에서 단편에 대한 인터페이스를 구현하는 방법을 찾고 있습니다. – Lion789

답변

2

어려운 난 당신의 코드를 알고 있지만 큰 소리로 생각하지 않는 경우 제안하는 ....

당신은 (즉, 헤드리스) 표시되지 및 setRetainInstance (참) 세트가 결코된다 "노동자 조각"을 가질 수 그래서 당신이 정한 어떤 상태도 잃지 않습니다.

작업자 조각이 작업 대신 서비스에 바인딩하여 해당 작업에 대한 참조를 유지 관리합니다.

활동과 통신해야하는 경우 콜백으로 수행 할 수 있습니다.

다른 단편은 활동 대신 작업자와 통신 할 수 있습니다.

이 프로세스는 기본적으로 나머지 구성 요소가 호스팅되는 셸보다 약간 활동을 더 만듭니다. 모든 데이터가 보존 된 단편에 보관되므로 로테이션은 아무 것도 잃지 않습니다.

+0

그건 완벽 해! 정말 고맙습니다! 나는 이것에 대해 며칠 전에 생각했으면 좋겠다. –

+0

그냥이 방법을 시도하고 매력처럼 작동합니다! 다시 한 번 감사드립니다! :) –

0

화면 회전 과정에서 활동이 완전히 파괴되고 android : congfigChange 사용이 권장되지 않습니다. 하지만 당신이 할 수있는 일은 saveInstanceState (번들) 메소드를 오버라이드 할 수 있다는 것입니다.이 메소드는 화면 회전에 응답하여 시스템에 의해 파괴 된 시점에 활동에있는 데이터를 저장할 수 있습니다. 나중에 시스템이 번들을 activities onCreate (bundle) 메소드로 전달하거나 restoreInstanceState (Bundle) 메소드에서 가져 오면이를 수신합니다.