Android Activity 와 Service 의 상호작용 방식 에 대해 간단히 이야기 하 다.

다운로드 진 도 를 업데이트 하 는 기능 을 실현 합 니 다.

1.방송 을 통 해 상호작용
서버 측은 현재 다운로드 진 도 를 방송 방식 으로 보 내 고 클 라 이언 트 측은 이 방송의 모니터 를 등록 하여 이 방송 을 가 져 온 후 현재 다운로드 진 도 를 분석 하여 인터페이스 에 업데이트 합 니 다.
장단 점 분석:
방송 방식 을 통 해 Activity 와 Service 의 상호작용 이 간단 하고 실현 하기 쉬 우 며 간단 한 응용 을 감당 할 수 있다.그러나 단점 도 뚜렷 하 다.방송 을 보 내 는 것 은 시스템 의 제약 을 받는다.시스템 은 시스템 급 방송 을 우선 보 내 고 특정한 상황 에서 사용자 정의 방송 이 지 연 될 수 있 습 니 다.또한 방송 수신 기 에서 장시간 작업 을 처리 할 수 없습니다.그렇지 않 으 면 시스템 에 ANR 즉 응용 프로그램 이 응답 하지 않 습 니 다.
2.파일 공유 대화
여기 서 언급 한 공유 파일 은 Activity 와 Service 가 같은 파일 을 사용 하여 데 이 터 를 전달 하 는 목적 을 달성 하 는 것 을 말한다.저 희 는 Shared Preferences 를 사용 하여 공 유 를 실현 할 수 있 습 니 다.물론 다른 IO 방법 으로 도 실현 할 수 있 습 니 다.이런 방식 으로 상호작용 을 실현 할 때 주의해 야 합 니 다.파일 의 읽 기와 쓰기 에 있어 서 같은 시간 에 한 쪽 만 읽 을 수 있 고 두 쪽 이 동시에 쓸 수 없습니다.
장단 점 분석:
이런 방식 으로 Activity 와 Service 의 상호작용 을 실현 하 는 것 은 매우 편리 하 다 고 할 수 있다.마치 파 이 프 를 사용 하고 하 나 는 e 로 쓰 고 하 나 는 밖으로 읽 는 것 과 같다.그러나 이런 방식 에 도 결함 이 있다.기록 데이터 가 비교적 복잡 하고 데이터 의 양 이 많 을 때 기록 과 읽 기 데이터 가 일치 하지 않 는 오 류 를 초래 할 수 있다.동시에 중간 역 을 지 났 기 때문에 이런 조작 은 더욱 시간 이 걸 릴 것 이다.
3.메 신 저 상호작용(메 신 저 상호작용)Handler
Messenger 는 메 시 지 를 보 낼 수 있 는 Handler 대상 을 인용 한 메 시 지 를 번역 합 니 다(mMessenger.send(Message msg)방법 을 사용 합 니 다).이 클래스 는 크로스 프로 세 스 간 에 Message 통신 을 기반 으로 서버 에서 Handler 를 사용 하여 Messenger 를 만 들 수 있 습 니 다.클 라 이언 트 는 이 서버 의 Messenger 대상 을 얻 기만 하면 서버 와 통신 할 수 있 습 니 다.즉,우 리 는 Messenger 를 클 라 이언 트 엔 드 와 서버 엔 드 의 마이크 로 삼 아 의사 소통 을 할 수 있다.
장단 점 분석:
Messenger 를 통 해 Activity 와 Service 의 상호작용 을 실현 하고 조금 만 깊이 들 어가 면 Messenger 도 AIDL 을 통 해 이 루어 진 다 는 것 을 알 수 있다.앞의 두 가지 실현 방식 에 대해 Messenger 방식 은 전체적으로 보면 이해 하기 쉬 운 데 이것 은 평소에 Handler 와 Thread 를 사용 하 는 것 과 같은 이치 이다.
4.서버 에서 사용자 정의 인터페이스 상호작용
인 터 페 이 스 를 사용자 정의 합 니 다.이 인터페이스 에는 현재 다운로드 진 도 를 가 져 오 는 빈 방법 이 있 습 니 다.서버 엔 드 는 Binder 에서 계승 하여 이 인 터 페 이 스 를 실현 하고 현재 다운로드 진 도 를 가 져 오 는 방법 을 덮어 썼 습 니 다.Client 단 은 ServiceConnection 을 통 해 이러한 대상 을 얻 고 현재 다운로드 진 도 를 얻 는 방법 을 사용 하여 실시 간 상호작용 을 실현 할 수 있 습 니 다.

public interface ICountService { 
  public int getCurrentLoad(); 
} 

public class DownLoadService extends Service implements ICountService{ 
private ServiceBinder serviceBinder = new ServiceBinder();  
public class ServiceBinder extends Binder implements ICountService{ 
  @Override 
  public int getCurrentLoad() { 
    Log.i(TAG, "ServiceBinder getCurrentLoad()... i=:"+i); 
    return i; 
  }   
} 
@Override 
public int getCurrentLoad() { 
  return 0; 
} 
}

@Override 
public IBinder onBind(Intent intent) { 
  Log.i(TAG, "DownLoadService.onBind()..."); 
  return serviceBinder; 
} 
클 라 이언 트 의 Timer 는 bindService()가 완 료 된 후 1 초 후에 다운로드 진 도 를 가 져 옵 니 다.가 져 오 는 방법 은 int curLoad=icountService.getCurrentLoad()를 통 해 직접 가 져 옵 니 다.이곳 의 getCurrentLoad()방법 은 DownloadService 내부 클래스 ServiceBinder 의 방법 입 니 다.클 라 이언 트 측은 가 져 온 다운로드 진 도 를 인터페이스 에 업데이트 하고 진 도 를 업데이트 합 니 다.
장단 점 분석:
이런 방법 은 간단 하고 실 용적 이 며 확장 성 이 강하 지만 단점 도 있다.예 를 들 어 서버 의 데 이 터 를 늦게 가 져 와 야 하기 때문에 제로 부터 동기 화 업 데 이 트 를 완전히 실현 할 수 없다.다시 말하자면 사용자 정의 인 터 페 이 스 를 통 해 Activity 와 Service 의 상호작용 을 실현 하 는 방법 은 비교적 실 용적 이다.같은 프로 세 스에 서 통신 할 수 있 으 며,크로스 프로 세 스 통신 을 할 수 없습니다.
5.AIDL 상호작용
원리:AIDL 은 Android 의 IPC 체제 로 크로스 프로 세 스 통신 에 자주 사용 되 며 주로 원 리 는 바 텀 Binder 체 제 를 바탕 으로 한다.
장단 점 분석:
AIDL 은 안 드 로 이 드 에서 프로 세 스 간 통신 에 자주 사용 되 는 방식 으로 골 을 넣 은 벚꽃 을 사용 할 수 있 지만 효율 이 높 고 확장 성 이 좋다.동시에 많은 시스템 서 비 스 는 이런 방식 으로 응용 프로그램 과 통신 을 완성 한다.
이상 은 여러분 께 안 드 로 이 드 액 티 비 티 와 서비스의 상호작용 방식 에 대한 모든 내용 입 니 다.여러분 께 도움 이 되 셨 으 면 좋 겠 습 니 다.많이 응원 해 주세요~

좋은 웹페이지 즐겨찾기