Android Activity 와 Service 의 데이터 상호작용 에 대한 상세 한 설명
안 드 로 이 드 의 Activity 디자인 은 웹 페이지 와 매우 유사 하 다.페이지 의 전환 과 연결,그리고 페이지 의 포 지 셔 닝 에서 URL 을 통 해 각 페이지 의 독립 적 인 패 키 징 등 측면 에서 볼 수 있 듯 이 주로 사용자 와 상호작용 을 한다.
서 비 스 는 백 스테이지 에서 운영 되 며 묵묵히 사용자 에 게 기능 을 제공 하고 스케줄 링 과 총괄 을 한다.나무의 바닥 부분 이 액 티 비 티 라면 그 거대 한 뿌리 는 서비스 다.Android 의 서비스 구성 요 소 는 독립 된 프로 세 스 나 스 레 드 에서 실행 되 지 않 았 습 니 다.다른 구성 요소 와 마찬가지 로 주 스 레 드 에서 도 실 행 됩 니 다.서비스 구성 요소 가 비교적 오래 걸 리 는 작업 을 수행 하면 주 스 레 드 가 막 히 거나 가사 되 어 사용자 의 작업 에 응답 할 수 없습니다.
따라서 시간 이 걸 리 는 조작 은 UI 스 레 드 에 두 지 마 세 요.UI 5S 로 인해 방송 10s 가 막 혀 ANR 을 유발 할 수 있 습 니 다.
② 사용 의 측면 에서 볼 때:
Service 는 Activity 에 양 방향 연결 을 구축 하고 Activity 에 데이터 와 기능 지원 을 제공 할 수 있 을 뿐만 아니 라 Intent 의 요청 을 단 방향 으로 받 아들 여 데이터 분석 처리 와 기능 스케줄 링 을 할 수 있다.
③ 맡 은 역할 로 말하자면
Activity 의 기능 이 비교적 단일 하 다.주로 응용 이 가지 고 있 는 일부 기능 을 나타 내 고 사용자 와 응용 이 상호작용 을 하도록 도와 주 며 한 사람의 얼굴 과 같다.한편,Service 는 기능 스케줄 러 역할 을 할 수도 있 고 기능 제공 자 역할 을 할 수도 있 습 니 다.트리거 에서 정 보 를 수집 하여 분석 하고 처리 한 다음 에 인터페이스 를 업데이트 하고 데 이 터 를 수정 하거나 다른 조작 을 할 때 기능 스케줄 러 입 니 다.입력 법의 선택 에서 Service 는 기능 제공 자 역할 을 합 니 다.View 구성 요 소 는 Android 에서 사용자 가 실제로 볼 수 있 는 부분 입 니 다.예 를 들 어 버튼,입력 상자 등 은 바로 이러한 종류의 계승 입 니 다.View 는 Activity 와 같은 용기 에 불 러 와 야 의미 가 있 고 반대로 Activity 는 이러한 View 를 불 러 와 야 사용자 와 상호작용 하 는 작업 을 성공 적 으로 수행 할 수 있 습 니 다.그러나 Service 는 이런 화려 한 것 이 필요 하지 않 습 니 다.사건 이 발생 하거나 심 부 름 을 기다 리 기만 하면 된다.
Android 가 서 비 스 를 시작 하 는 방법 은 두 가지 가 있 는데 하 나 는 startService 이 고 하 나 는 bindService 이다.생명 주 기 는 다음 과 같다.
startService 를 실행 할 때 호출 자가 stopService 가 없 으 면 Service 는 계속 배경 에서 실 행 됩 니 다.startService 를 여러 번 호출 하면 이 서 비 스 는 한 번 만 만 만 들 수 있 습 니 다.즉,이 서비스의 onCreate 방법 은 한 번 만 호출 됩 니 다.하지만 startService 를 호출 할 때마다 onStartCommand 방법 이 호출 됩 니 다.
bindService 를 실행 할 때 호출 자가 unbindService 방법 을 호출 하거나 호출 자 Context 가 존재 하지 않 습 니 다(예 를 들 어 Activity 가 finish 되 었 습 니 다).bindService 를 처음 실행 할 때 onCreate 와 onBind 방법 이 호출 되 지만 bindService 를 여러 번 실행 할 때 onCreate 와 onBind 방법 은 여러 번 호출 되 지 않 습 니 다.즉,서비스 와 바 인 딩 서 비 스 를 여러 번 만 들 지 않 습 니 다.여러 구성 요 소 는 이 서비스 에 동시에 연결 할 수 있 지만,모두 연결 을 취소 하면 이 서 비 스 는 삭 제 됩 니 다.
startService 를 사용 하고 bindService 를 사용 하 는 경우 unbindService 와 stopService 를 동시에 호출 해 야 서 비 스 를 종료 할 수 있 습 니 다.
Activity 와 Service 의 상호작용 은 두 가지 방법 이 있 습 니 다.하 나 는 broadcast 를 사용 하 는 것 이 고 다른 하 나 는 bidService 를 사용 하 는 것 입 니 다.본 고 는 bindService 방법 만 소개 합 니 다.
public class MsgService extends Service {
public MsgService() {
}
/**
*
*/
public static final int MAX_PROGRESS = 100;
/**
*
*/
private int progress = 0;
/**
* get() , Activity
*
* @return
*/
public int getProgress() {
return progress;
}
/**
* ,
*/
public void startDownLoad(){
new Thread(new Runnable() {
@Override
public void run() {
while(progress < MAX_PROGRESS){
progress += 5;
//
if(onProgressListener != null){
onProgressListener.onProgress(progress);
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
@Override
public IBinder onBind(Intent intent) {
return new MyBinder();
}
public class MyBinder extends Binder {
public MsgService getService() {
return MsgService.this;
}
}
public interface OnProgressListener {
void onProgress(int progress);
}
/**
*
*/
private OnProgressListener onProgressListener;
/**
* ,
*
* @param onProgressListener
*/
public void setOnProgressListener(OnProgressListener onProgressListener) {
this.onProgressListener = onProgressListener;
}
}
public class MainActivity extends Activity {
private Button button19;
private MsgService msgService;
private int progress = 0;
private ProgressBar mProgressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnExec = (Button) findViewById(R.id.btnExec);
button19 = (Button) findViewById(R.id.button19);
mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
button19.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
msgService.startDownLoad();
}
});
Intent intent = new Intent(this, MsgService.class);
bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);
}
ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
msgService = ((MsgService.MyBinder) iBinder).getService();
msgService.setOnProgressListener(new MsgService.OnProgressListener() {
@Override
public void onProgress(int progress) {
mProgressBar.setProgress(progress);
}
});
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
}
};
@Override
protected void onDestroy() {
unbindService(mServiceConnection);
super.onDestroy();
}
}
예 를 들 어 MsgService 는 시간 이 걸 리 는 다운로드 작업 을 모 의 하고 MainActivity 바 인 딩 서 비 스 는 OnProgressListener 리 셋 을 통 해 다운로드 진 도 를 가 져 오고 진도 바 를 업데이트 합 니 다.이 예 에서 Activity 와 Service 는 같은 프로 세 스에 서 크로스 프로 세 스 호출 Service 에 AIDL 기술 을 사용 해 야 합 니 다.
읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.