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 기술 을 사용 해 야 합 니 다.
 읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기