Service 학습(4)Activity 와 Service 통신 방식 은 세 가지 가 있 습 니 다.

Activity 와 Service 가 통신 하 는 방식 은 세 가지 가 있 습 니 다.
상속 Binder 클래스
  이 방식 은 Acitivity 와 Service 가 같은 애플 리 케 이 션 과 프로 세 스 에 있 을 때 만 사용 할 수 있 습 니 다.예 를 들 어 배경 음악 을 재생 하 는 Service 가 있 을 때 이런 방식 으로 통신 할 수 있 습 니 다.
예 를 들 어 그 사용 방법 을 설명 한다.
  1.Service 의 작성 방법 보기:
package com.amaker.test;

import java.util.Random;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;

public class LocalService extends Service {  
    //        Binder   
    private final IBinder mBinder = new LocalBinder();  
    //          
    private final Random mGenerator = new Random();  
  
    /** 
     *     Binder ,        ,             ,     , Activity   Service    
     */  
    public class LocalBinder extends Binder {  
        LocalService getService() {  
            //   Activity    Service  ,   Activity ,    Service               
            return LocalService.this;  
        }  
    }  
  
    public IBinder onBind(Intent intent) {  
        return mBinder;  
    }  
  
    /** public  ,Activity       */  
    public int getRandomNumber() {  
      return mGenerator.nextInt(100);  
    }  
}  


Service 에서 내부 클래스,Binder 의 하위 클래스 를 정의 합 니 다.이 클래스 를 통 해 Service 의 대상 을 Activity 에 전달 하면 Activity 는 Service 의 공용 방법 과 공용 속성 을 호출 할 수 있 습 니 다.그러나 이런 방식 은 반드시 같은 프로 세 스 와 같은 Application 에 있어 야 합 니 다.
   2.해당 Activity 의 코드 보기:
package com.amaker.test;

import com.amaker.test.LocalService.LocalBinder;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class BindingActivity extends Activity {  
    LocalService mService;  
    boolean mBound = false;  
    
    /**   ServiceConnection,    Service */  
    private ServiceConnection mConnection = new ServiceConnection() {  
        public void onServiceConnected(ComponentName className,  
                IBinder service) {  
            //      LocalService,  IBinder  ,      LocalService    
            LocalBinder binder = (LocalBinder) service;  
            mService = binder.getService();  
            mBound = true;  
        }  
  
        public void onServiceDisconnected(ComponentName arg0) {  
            mBound = false;  
        }  
    };  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
        
        Button btn  = (Button) findViewById(R.id.button1);
        
        
        btn.setOnClickListener(new OnClickListener() {
			
			public void onClick(View v) {
				
				onButtonClick();
			}
		});
    }  
  
    @Override  
    protected void onStart() {  
        super.onStart();  
        //   Service,       mConnetion  onServiceConnected    
        Intent intent = new Intent(this, LocalService.class);  
        bindService(intent, mConnection, Context.BIND_AUTO_CREATE);  
    }  
  
    @Override  
    protected void onStop() {  
        super.onStop();  
        //   Service,          
        if (mBound) {  
            unbindService(mConnection);  
            mBound = false;  
        }  
    }  
  
    /**     button,   Service      */  
    public void onButtonClick() {  
        if (mBound) {  
            //  Service   ,        
            int num = mService.getRandomNumber();  
            Toast.makeText(this, "number: " + num, Toast.LENGTH_SHORT).show();  
        }  
    }  
  
   
}  

IBinder 를 통 해 LocalService 대상 을 얻 고 Public 방법 을 사용 하 는 것 입 니 다.
Messenger 사용
   위의 방법 은 같은 프로 세 스에 서 만 사용 할 수 있 으 며,다른 프로 세 스 의 Service 와 통신 하려 면 Messenger 를 사용 할 수 있 습 니 다.
    사실 IPC 를 실현 하 는 방식 은 AIDL 도 있 지만 Messenger 를 추천 하 는 것 은 두 가지 장점 이 있 습 니 다.
      1.Messenger 방식 을 사용 하 는 것 이 AIDL 방식 을 사용 하 는 것 보다 훨씬 간단 하 다.
      2.Messenger 를 사용 할 때 Activity 에서 들 려 오 는 모든 메 시 지 는 하나의 대기 열 에 있 고 동시에 Service 를 요청 하지 않 기 때문에 스 레 드 가 안전 합 니 다.프로그램 이 Service 에 다 중 스 레 드 로 접근 하려 면 AIDL 을 사용 하 십시오.그렇지 않 으 면 Messenger 방식 을 사용 하 는 것 이 좋 습 니 다.
  그러나 사실 Messenger 밑바닥 은 AIDL 로 이 루어 진 것 입 니 다.실현 방식 을 보고 Service 의 코드 를 먼저 봅 니 다.
package com.amaker.service;

import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.widget.Toast;

public class MessengerService extends Service {  
    /**   Handler       */  
    static final int MSG_SAY_HELLO = 1;  
    
    
    /** 
     *   Messenger     Service  Handler,Activity       Message Service,Service  Handler    。 
     */  
    final Messenger mMessenger = new Messenger(new IncomingHandler());  
    
  
    /** 
     *  Service  Activity      Handler 
     */  
    class IncomingHandler extends Handler {  
        public void handleMessage(Message msg) {  
            switch (msg.what) {  
                case MSG_SAY_HELLO:  
                    Toast.makeText(getApplicationContext(), "hello!", Toast.LENGTH_SHORT).show();  
                    break;  
                default:  
                    super.handleMessage(msg);  
            }  
        }  
    }  
  
  
    /** 
     *  Activity  Service   ,          IBinder,Activity   IBinder    Messenger,    Service Handler      
     */  
    public IBinder onBind(Intent intent) {  
        Toast.makeText(getApplicationContext(), "binding", Toast.LENGTH_SHORT).show();  
        return mMessenger.getBinder();  
    }  
}  


Activity 코드 다시 보기:
package com.amaker.service;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class ActivityMessenger extends Activity {  
    /**  Service  Message Messenger   */  
    Messenger mService = null;  
  
    /**        Service */  
    boolean mBound;  
  
    private ServiceConnection mConnection = new ServiceConnection() {  
        public void onServiceConnected(ComponentName className, IBinder service) {  
            // Activity     Service  
            //     service   Messenger  ,       Service  Message, Service      
            mService = new Messenger(service);  
            mBound = true;  
        }  
  
        public void onServiceDisconnected(ComponentName className) {  
            mService = null;  
            mBound = false;  
        }  
    };  
  
    
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
        
        Button btn = (Button) findViewById(R.id.button1);
        
        btn.setOnClickListener(new OnClickListener() {
			
			public void onClick(View v) {
				
				sayHello();
			}
		});
    }  
  
    @Override  
    protected void onStart() {  
        super.onStart();  
        //   Service  
        bindService(new Intent(this, MessengerService.class), mConnection,  
            Context.BIND_AUTO_CREATE);  
    }  
  
    @Override  
    protected void onStop() {  
        super.onStop();  
        //     
        if (mBound) {  
            unbindService(mConnection);  
            mBound = false;  
        }  
    }  
    
    public void sayHello() {  
        if (!mBound) return;  
        //  Service    Message  
        Message msg = Message.obtain(null, MessengerService.MSG_SAY_HELLO, 0, 0);  
        try {  
            mService.send(msg);  
        } catch (RemoteException e) {  
            e.printStackTrace();  
        }  
    }  
}  

메모:위 에 적 힌 코드 는 Activity 에서 Service 로 만 메 시 지 를 보 낼 수 있 습 니 다.Service 에서 Activity 로 메 시 지 를 보 내 려 면 코드 를 거꾸로 쓰 면 됩 니 다.
AIDL 사용 하기
  이 방법 은 대략 위의 두 가지 방법 을 알 고 있다 면 이 방법 은 기본적으로 거의 사용 되 지 않 을 것 이다.

좋은 웹페이지 즐겨찾기