Service 학습(4)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 사용 하기
이 방법 은 대략 위의 두 가지 방법 을 알 고 있다 면 이 방법 은 기본적으로 거의 사용 되 지 않 을 것 이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.