본문 바로가기

안드로이드

Service / Notification

다시 스타트하는게 아니라  이미 실행되어있으니까 onbind()가 실행됩니다.

 

service에 생명주기가 있어요.

 

https://blog.naver.com/getinthere/221695417720

 

1. 시작할 때는 onStartCommand()

destory하기 전까지는 또 할수 없음.

 

2. 다시 할때는 이미 실행되어있으니까 onbind()가 실행됩니다.

 

새 프로젝트 액티비티 만들어요~!

 

 

raw폴더 만드는 방법

 

 

 

 

 

서비스만들기

 

 

이렇게 service를 만들면 아래와 같이 AndroidManifest에 등록이 된다.

 

 

 

MainActivity와 Service의 서로 제어권이 없어요.

서로의 context를 가질 수 없어요. 다른 프로세스입니다.

 

지금은 음악을 시작 종료밖에 못함. 일시정지 후 다시 시작할 수가 없다.

 

start되면 service의 mp객체가 실행되다가 멈췄다가 어디서 멈췄는지 알고 있다가

activity와 service는 서로의 레퍼런스에 접근못함(프로세스가 달라서) 접근을 해야하는데

 

하는 방법은

마샬링

 

자바에서 다른 자바 클래스의 필드에 접근하는 것은 메모리공간을 가져오는것이 아니라 필드들 자체를 직렬화해서 (=복제해서) json오브젝트로 가져오는 것인데

메소드는 이렇게 가져올 수 가 없지요 방법은 마샬링이라는 기법을 씁니다.

 

AIDL

안드로이드

인터페이스 정의 다른 데의 함수를 정의

추상메서드로 만들어요.

다른 데서 정보만받고 인터페이스에서 가져와서 쓴다.

원복은 힘듬. 약속을 한거.

 

프로세스간 통신 데이터 통신을 할 수는 있는데 할 일은 없어요 굳이 디비나 데이터가 있는데...

 

직렬화 마샬링(mbr 때문에 씀) 일부 그 클래스

 

직렬화의 mbv 는 직렬화랑 비슷.

 

 

 

서로 다른 프로세스

데이터 공유하는 방법

소켓 통신,

파일에 저장 IO

DB에 데이터 저장 후 데이터에 접근 IO

 

new는 안됨

직렬화

마샬링(MBR, MBV) 동기화 상태를 계속 들고 있음.

 

안드로이드 AIDL이 마샬링 처럼 인터페이스

 

main이 counter에 접근할 없고

 

그래서 그림그릴수가 없고

 

일시정지하고 값을 유지시킬수가 없는데 

AIDL로

 

 

AIDL만들고 나서 make project해서 build 해줘야 한다.

 

 

 

 

이 파일은 자바가 이해 못하니까 build project해주세요

 

 

 

M

 

S

 

count변수에 접근할 수 있

 

그림을 초마다 

 

1. BindDervice호출 하면 onBind() onCreat()가 실행된다. 1+1=>2

2. 스레드 실행하면 컨텍스트 스위칭되는 시간 얼마나 걸릴지 알수 없다. 1

그러면 bind는 null이다. 타이밍이 안맞아서 그렇다.

 

 

타이밍때문에 체크를 두번은 해줘야한다.

handler.post를!

 


 

 

서비스에서 할 일


aidl을 쓸 일은 거의 없고 직접 contentprovider를 만들일은 거의 없다.

 


서비스 클래스 안에
Binnder를 extends해서 LocalBinder 타입으로 내부 클래스 만들어서
안에 함수하나 만들어놓으면 이걸 aidl(ipc통신)이라고 생각해라 - 다른점은 aidl는 (premitive)8가지 자료형만 리턴.
근데 내가 만든 이 함수는 aidl과 달리 서비스를 리턴할 수 있다.

 

안드는 프로세서가 하나밖에 없음. 다 컨텍스트로 관리하고 있음.

LocalBinder 이름처럼 다른 프로세서랑은 공유 못함.

 

 

seek bar위치랑 mp.current랑 동기화
mp객체 필요
MainActivity에서 mp를 알고 있으면 된다.

그래서 public MediaPlayerMap(){
return mp;
  }


aidl랑(ipc통신) 이 방법이랑 차이는

 

aidl는 기본 자료형8가지만 공유하는데

이렇게 하면
레퍼런스를 받을 수 있어요

 

이거는 서비스 

스레드가 백그라운드에서 계속 컨텍스트 스위칭으로 도는 거임.

 

토글 버튼

isPlaying = !isPlaying;

isPlaying = isPlaying*-1;

 

 

main 스레드가 할 일이 있어서 seekbar 못그림.

핸들러 아니면 AsyncTask

 

 

 

 

 

 

 

 

 

 

 

 

'안드로이드' 카테고리의 다른 글

Thread 강제종료  (0) 2020.08.19
Contentprovider  (0) 2020.08.18
Cloud Firestore(noSQL)  (0) 2020.08.12
firebase 구글 로그인  (0) 2020.08.12
MVVM수업연결  (0) 2020.08.12