2012-10-19 2 views
3

Service와 BroadcastReceiver 사이에 혼동이 있습니다. 위치 기반 앱에서 일하고 있습니다. 이 때, 나는 그/그녀의 위치 (예 : 10 미터)에 중요한 변화가있을 때마다 데이터베이스에 사용자의 위치를 ​​저장하려고합니다.위치를 자주 얻고 저장하는 것이 더 낫습니다 - 서비스 또는 BroadcastReceiver?

LocationListener를 사용하고 있는데 정상적으로 작동합니다. 하지만 내 딜레마는 다음과 같습니다. onLocationChanged() 메서드를 작성하는 위치 - BroadcastReceiver 또는 서비스의 onReceive() 메서드에서?

그리고 만약 내가 서비스를 사용한다면 어떤 서비스 방법으로 아래 코드를 작성해야합니까?

LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 

    LocationListener locationListener = new LocationListener() { 
     public void onLocationChanged(Location location) { 
      if(location != null){ 
       //Code to populate location-data into the database table. 
      } 

     public void onStatusChanged(String provider, int status, Bundle extras) {} 

     public void onProviderEnabled(String provider) {} 

     public void onProviderDisabled(String provider) {} 
     }; 

    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 5, 10, locationListener); 

사람이 그것을 구현하는 더 좋은 방법이 무엇인지 저를 제안시겠습니까 : 여기

내 위치 수신기입니까? Service와 BroadcastReceiver에 대한 Android 개발자 문서를 모두 읽었지만 아직 사용법을 구별 할 수 없습니까?

답변

1

내 의견으로는, 당신이하고 싶은 일에 달려 있습니다.

브로드 캐스트를 수신 할 때 작은 것을하고 싶다면, onReceive() 방법으로 BroadcastReceiver에서 할 수 있습니다. 그러나 onReceive()은 기본 응용 프로그램 스레드에서 호출됩니다. 그래서 안드로이드 OS는 너무 오래 걸리면 그것을 죽일 것이다.

따라서 다소 시간이 걸리기를 원하면 배경 스레드에서 Service으로해야합니다. 제안 된대로 서비스의 onStart() 메소드에 코드를 삽입 할 수 있습니다. 아무 것도하지 않으면 서비스를 계속 실행하지 마십시오 (배터리 허리와 다른 리소스 허리). 방송을 수신 할 때마다 서비스를 시작하고 할당 된 작업을 완료하는 즉시 완료하십시오.

P. Mark L. Murphy (일명 CommonsWare)에는 Android 개발에 대한 여러 권의 훌륭한 책이 있습니다. Google 바쁜 코더 가이드 안드로이드 개발.

UPDATE : 응용 프로그램이 백그라운드로 이동 할 때 백그라운드 작업을 취소하는 당신의 욕망에 대해

.

중간에 백그라운드 작업이 중단 된 경우 수행 할 작업을 고려하십시오. 이 상황을 처리해야합니다. 문제가 없으면 AsyncTask 또는 Service을 사용하여 백그라운드에서 작업을 수행 할 수 있습니다. 선택은 작업의 크기와 유형에 따라 달라집니다.

AsyncTask은 일반적으로 백그라운드 작업을 수행하고 결과를 UI 스레드에 게시하기위한 것입니다. 안드로이드 설명서 suggestsAsyncTask에 대한 작업이 몇 초를 넘지 않아야합니다. 반면에 Service은 UI와의 통신없이 긴 작업을 수행하도록 설계되었습니다.

취소 정보. AsyncTask은 UI 스레드에 지쳐 활동이 끝나면 취소됩니다. 서비스를 중단 하시려면 귀하의 활동에서 stopService()으로 전화해야합니다.

위치 정보를 자주 저장해야하는 경우 활동 시작시 서비스를 시작하고 서비스의 onBind() 방법을 사용하여 통신 한 다음 onPause() 활동 방식으로 서비스를 중지 할 수 있습니다.

+0

고맙습니다. 그래서 위의 코드를 백그라운드 스레드, 즉 AsyncTask에 넣어야한다고 말씀하십니까? –

+0

의존))) 서비스를 실행하는 동안 장치가 절전 모드로 전환되지 않도록 하시겠습니까? 이것은 좋은 일이 아닙니다 (OS가 전원 관리를하도록해야합니다).하지만이 서비스가 필수적이라고 절대적으로 확신하는 경우 ... –

+0

내 앱이 포 그라운드에있는 경우에만 내 서비스를 실행하고 싶습니다. 앱이 백그라운드에서 실행되면이 서비스가 중단됩니다. 그거 괜찮아? –

2

용도에 따라 다릅니다. 백그라운드에서 위치를 파악하려면 서비스에서 사용하십시오.

BroadcastReciever의 onReceive 메소드는 수신하도록 등록한 작업이있는 경우에만 호출합니다.

포 그라운드에서 수행하려는 경우 활동에서 간단하게 사용할 수 있습니다. 그러나 활동이 끝나면 위치를 알 수 없습니다.

따라서 사용자는 기능에 따라 결정합니다.

+0

+1 나. 따라서 서비스에서 위의 코드를 작성하는 방법은 무엇입니까? –

+0

코드를 onStart 메소드에 작성하십시오. 서비스를 끝내는 것을 잊지 마라. finish() 메소드를 호출 할 때까지 계속 실행됩니다. – Guna

+0

그리고 서비스는 어디에서 끝내야합니까? 모든 활동에서? –

2

서비스는 백그라운드에서 코드를 실행하는 데 사용되며, 사용자가 백그라운드에서 앱을 넣은 후에 (주로 집이나 뒤로 버튼) 앱 다운로드를 주로 사용합니다. BroadcastReceivers

내가 BroadcastReceiver 도움이되지 수 있기 때문에 여기에 서비스를 사용하려는 생각 ... sendBroadcast() 방법을 통해 전송 된 메시지를 수신하는 데 사용되며, 블루투스, 인터넷 가용성과 같은 시스템 알림을 잡을 다른 응용 프로그램에서 메시지를 가져 오는 데 사용된다 앱이 백그라운드에있는 경우 위치 변경을 청취해야합니다.

+0

내 앱이 전경에있을 때만 위의 작업을 수행하고 싶습니다. –

+0

그것은 실제로 원하는 것에 달려 있습니다 .. 위치 풀링은 장치 배터리를 배출하는 꽤 좋은 방법이기 때문에 항상 서비스를 실행하는 것을 권장하지 않습니다. – Cata

관련 문제