Android 에서 Service 와 Thread 의 차 이 를 깊이 분석 하 다.

4215 단어 servicethread구별
Service 는 프로 세 스 도 스 레 드 도 아 닙 니 다.이들 의 관 계 는 다음 과 같 습 니 다.

시간 이 오래 걸 리 는 조작 이 니 Thread 도 완성 할 수 있 겠 구나 라 고 물 어 보 는 친구 도 있 을 것 이다.맞아요.프로그램 에서 시간 이 많이 걸 리 는 일 도 Thread 를 통 해 할 수 있어 요.그러면 Service 가 뭐 가 필요 해 요.다음은 서비스 와 Thread 의 차 이 를 설명 하 겠 습 니 다.
먼저 설명 하고 자 하 는 것 은 프로 세 스 는 시스템 의 최소 자원 배분 단위 이 고 스 레 드 는 최소 실행 단위 이 며 스 레 드 에 필요 한 자원 은 그 가 있 는 프로 세 스 를 통 해 가 져 옵 니 다.
Service 와 Thread 의 차이 점:
Thread:Thread 는 프로그램 이 실행 하 는 가장 작은 단원 으로 Thread 로 비동기 적 인 동작 을 수행 할 수 있 습 니 다.
Service:Service 는 안 드 로 이 드 의 메커니즘 입 니 다.실행 할 때 Local Service 라면 해당 하 는 Service 는 메 인 프로 세 스 의 main 스 레 드 에서 실 행 됩 니 다.Remote Service 라면 해당 서 비 스 는 독립 된 프로 세 스 의 main 스 레 드 에서 실 행 됩 니 다.
Thread 의 실행 은 독립 적 입 니 다.즉,하나의 Activity 가 finish 에 의 해 실 행 된 후에 Thread 나 Thread 의 run 방법 이 실행 되 지 않 으 면 Thread 도 계속 실 행 됩 니 다.따라서 여기 서 문제 가 발생 할 수 있 습 니 다.Activity 가 finish 가 된 후에 이 Thread 의 인용 을 가지 지 않 습 니 다.즉,이 Thread 를 더 이상 제어 할 수 없습니다.다른 한편,다른 액 티 비 티 에서 같은 스 레 드 를 제어 할 방법 은 없다.
예 를 들 어 Thread 가 서버 에 연결 하여 데 이 터 를 검사 해 야 한다 면 이 Thread 는 배경 에서 계속 실행 해 야 합 니 다.이 때 이 Thread 를 만 드 는 Activity 가 끝 났 고 이 Thread 가 멈 추 지 않 으 면 이 Thread 를 더 이상 제어 할 수 없습니다.kill 이 프로그램의 프로 세 스 를 떨 어 뜨리 지 않 는 한.이 때 서 비 스 를 만 들 고 시작 하면 Service 에서 이 Thread 를 만 들 고 실행 하 며 제어 하면 이 문 제 를 해결 할 수 있 습 니 다(모든 Activity 가 같은 서 비 스 를 제어 할 수 있 고 시스템 도 서비스 에 대응 하 는 인 스 턴 스 만 만 만 들 수 있 기 때 문 입 니 다).
따라서 서 비 스 를 하나의 메시지 서비스 로 상상 할 수 있 고 Context 가 있 는 곳 에서 Context.startService,Context.stopService,Context.bindService,Context.unbindService 를 호출 하여 제어 할 수 있 으 며 Service 에 BroadcastReceiver 를 등록 하여 broadcast 를 보 내 제어 하 는 목적 을 달성 할 수 있 습 니 다.이것 은 모두 Thread 가 할 수 없 는 것 입 니 다.
많은 안 드 로 이 드 초보 자 들 이 이런 의혹 을 제기 할 수 있다.서비스 와 Thread 는 도대체 무슨 관계 가 있 을 까?언제 서 비 스 를 써 야 합 니까?언제 또 Thread 를 써 야 합 니까?정 답 은 좀 놀 랄 수 있 습 니 다.Service 와 Thread 사이 에는 아무런 관계 가 없 기 때 문 입 니 다!
이들 을 연결 시 키 는 사람 이 적지 않 은 이 유 는 서비스의 백 스테이지 개념 때문이다.Thread 는 키 스 레 드 를 여 는 데 사 용 됩 니 다.여기 서 시간 이 걸 리 는 작업 을 수행 하면 메 인 스 레 드 의 운행 을 막 지 않 습 니 다.한편,Service 우리 가 처음에 이 해 했 을 때 백 스테이지 임 무 를 처리 하 는 데 사용 되 는 것 이 라 고 생각 했 고 시간 이 걸 리 는 조작 도 여기에 놓 고 실행 할 수 있어 서 헷 갈 렸 다.하지만,만약 내 가 너 에 게 서비스 가 사실 메 인 라인 에서 실행 되 고 있다 고 말한다 면,너 는 그것 이 Thread 와 무슨 관계 가 있다 고 생각 하 겠 니?이 잔혹 한 사실 을 한번 봅 시다.
MainActivity 의 onCreate()방법 에 현재 스 레 드 id 를 인쇄 하 는 문 구 를 추가 합 니 다.

Log.d("MyService", "MainActivity thread id is " + Thread.currentThread().getId()); 
그리고 MyService 의 onCreate()방법 에 현재 스 레 드 id 를 인쇄 하 는 문 구 를 추가 합 니 다.

 Log.d("MyService", "MyService thread id is " + Thread.currentThread().getId()); 
지금 프로그램 을 다시 실행 하고 Start Service 단 추 를 누 르 면 다음 인쇄 로 그 를 볼 수 있 습 니 다.

이 를 통 해 알 수 있 듯 이 그들의 스 레 드 id 는 완전히 같 습 니 다.이 는 Service 가 메 인 스 레 드 에서 실행 되 고 있 음 을 증명 합 니 다.즉,Service 에서 시간 이 많이 걸 리 는 코드 를 만 들 었 다 면 프로그램 은 반드시 ANR 이 나타 날 것 입 니 다.
너 는 아마 놀 라 서 소 리 를 지 를 것 이다.이것 은 아버 지 를 속 이 는 것 이 아니 냐?그럼 내 가 서 비 스 를 원 하면 무슨 소 용이 있 겠 어?사실 여러분 은 백 스테이지 와 서브 스 레 드 를 연결 하지 않 으 면 됩 니 다.이것 은 완전히 다른 개념 입 니 다.안 드 로 이 드 의 백 스테이지 란 UI 에 전혀 의존 하지 않 는 다 는 것 을 말한다.Activity 가 폐기 되 거나 프로그램 이 종료 되 더 라 도 프로 세 스 가 그대로 있 으 면 Service 는 계속 실 행 될 수 있 습 니 다.예 를 들 어 일부 응용 프로그램 은 서버 와 심장 박동 을 계속 유지 해 야 서비스 로 이 루어 질 수 있다.앞에서 Service 가 메 인 스 레 드 에서 실행 되 고 있다 는 것 을 방금 검증 하지 않 았 습 니까?여기 서 심장 박동 연결 을 계속 실행 하고 있 는데 메 인 스 레 드 의 운행 을 막 지 않 을 까?물론 입 니 다.하지만 우 리 는 Service 에서 하위 스 레 드 를 다시 만 들 수 있 습 니 다.그리고 여기 서 시간 소모 논 리 를 처리 하 는 데 문제 가 없습니다.
어,Service 에서 도 하위 스 레 드 를 만 들 려 고 하 는데 왜 Activity 에서 직접 만 들 지 않 았 어 요?이것 은 Activity 가 Thread 를 제어 하기 어렵 기 때 문 입 니 다.Activity 가 삭 제 된 후에 이전에 만 든 하위 스 레 드 의 인 스 턴 스 를 다시 얻 을 수 있 는 다른 방법 이 없습니다.또한 하나의 Activity 에서 만 든 하위 스 레 드 는 다른 Activity 에서 작 동 할 수 없습니다.그러나 서 비 스 는 다르다.모든 액 티 비 티 가 서비스 와 연 결 된 다음 에 그 방법 을 편리 하 게 조작 할 수 있다.액 티 비 티 가 폐기 되 더 라 도 그 후에 서비스 와 다시 연 결 된 경우 기 존의 서비스 에서 Binder 의 인 스 턴 스 를 얻 을 수 있다.따라서 서 비 스 를 이용 해 백 스테이지 임 무 를 처리 하면 Activity 는 안심 하고 finish 할 수 있 으 며 백 스테이지 임 무 를 제어 할 수 없 는 상황 을 전혀 걱정 할 필요 가 없다.
안 드 로 이 드 에서 서비스 와 Thread 의 차 이 를 심도 있 게 분석 해 드 리 겠 습 니 다.여러분 께 도움 이 되 셨 으 면 좋 겠 습 니 다.많이 응원 해 주세요~

좋은 웹페이지 즐겨찾기