2010-08-14 5 views
0

나는 내 안드로이드 응용 프로그램에서 실행되는 서비스를 가지고 있습니다.이 서비스는 전체 응용 프로그램을 통해 실행해야하는 소켓 클래스이며, 첫 번째 활동이로드 될 때 만듭니다. 이 클래스의 함수를 호출 할 수 있도록이 소켓 클래스의 인스턴스를 어떻게 얻을 수 있습니까?Android ==> 서비스 관련 질문이 있으십니까?

For example 
//how can i get an instance of the running service? 
MyService s = getService(); 
s.writeDataToServer("hello"); 

답변

1

Android 인터페이스 정의 언어 (AIDL)는 올바른 서비스 연결 방법입니다.

밖으로 http://developer.android.com/guide/developing/tools/aidl.html

서비스와 통신하는 방법 정보를 확인합니다.

+0

1 질문, 내가 현재 (서비스 및 활동 사이의 통신)이 처리 오전, 모든 개체 및 메서드 내 서비스에 정적으로 만드는 것입니다. 서비스와 통신하기에 좋지 않은 방법입니까? 예를 들어 액티비티가로드 될 때마다 MyService.setMainActivity (this); 그래서 내 서비스 클래스에있는 정적 변수에 내 활동 인스턴스를 전달합니다. 그리고 내 활동에서 내 서버로 메시지를 보내려 할 때, 나는 내 서비스 클래스에있는 정적 메서드를 호출합니다. MyService.SendDataToServer ("hello"); 내 서비스와 통신하는 것이 좋지 않은 방법입니까? – aryaxt

+3

네, 그 일을하는 것은 정말 나쁜 방법입니다. 서비스 또는 활동은 사용자 모르게 사망 할 수 있습니다. 그러나 IPC 프레임 워크를 사용하여 Android에 구축하면 문제가 발생하지 않는지 확인하거나 정상적으로 처리하면 정상적으로 처리됩니다. 장기적으로 AIDL 인터페이스를 사용하는 것이 훨씬 쉽습니다. 당신이 그것을 읽는 데 몇 분을 소비한다면 그것은 꽤 어려울 수도 있지만 실제로는 꽤 쉽습니다. –

+0

왜 투표가 늦습니까? –

2

사용자가 UI를 적극적으로 사용하지 않을 때 소켓을 열어 둘지 여부에 따라이 작업을 수행하는 방법은 두 가지가 있습니다.

첫 번째 문자는 LocalService이며 일반 문자 Service과 동일합니다 (단, Activity UI 스레드와 동일한 프로세스에서 실행되므로 직접 참조 할 수 있음). 이것은 AIDL을 사용하는 것보다 서비스를 작성하고 사용하는 훨씬 더 가벼운 방법입니다. 응용 프로그램이나 다른 응용 프로그램의 다른 프로세스에서 액세스해야하는 out-of-process 서비스를 만들려는 경우에만 AIDL을 사용하는 것이 좋습니다. 이것은 당신이 필요로하지 않을 확률이 가장 큽니다. LocalService 메서드를 사용하면 백그라운드에서 서비스를 계속 실행하고 UI를 사용하지 않아도 소켓을 계속 열어 둘 수 있습니다.

소켓을 열어 둘 필요가없고 Activity에서 여러 소켓에 액세스하려는 경우 Application 클래스를 확장하여 매니페스트에 등록 할 수 있습니다. 이를 통해 전역 응용 프로그램 상태를 관리 할 수 ​​있습니다. 소켓 생성 및 관리 기능을 해당 클래스에 넣고 다양한 Activity에 대한 액세스 방법을 제공 할 수 있습니다. Application 클래스는 프로세스가 종료 될 때 종료되므로 사용자가 응용 프로그램을 활발하게 사용하지 않을 때 또는 오랜 시간 동안 소켓을 열어 두는 데 적합하지 않습니다.

이 프로세스에 도움이되는 Activity#getApplication() 메서드가 내장되어 있습니다. android:name 속성을 통해 AndroidManifest.xml에서 맞춤 Application 클래스를 지정할 수 있습니다.

+0

LocalService에 대해 한 가지 질문이 있는데, 활동간에 이동하는 동안 서비스를 계속 실행할 수 있습니까? 내 응용 프로그램의 모든 활동은 서버에서 수신 한 데이터를 기반으로 데이터를 표시하며 세션 기반 (요청 세션, 로그인 등)이므로 소켓이 항상 연결되어 있어야합니다. – aryaxt

+1

예, BIND_AUTO_CREATE를 사용하여 startService 또는 bindService를 호출 할 수 있습니다. 이 경우 서비스 중단을 직접 관리해야합니다. – Qberticus

관련 문제