안드로이드에서 서비스 안의 방법의 호출, 오픈, 귀속【입문】
4206 단어 android
왜 new Service () 를 통해 서비스의 방법을 호출할 수 없습니까?
서비스는 시스템 new에서 나온 것입니다. 시스템 new가 나온 후에 상하문이 왜 준비되는지 저희가 직접 new로 가는 서비스와 시스템 new의 서비스는 같은 대상이 아니기 때문에 상하문을 가져올 수 없습니다.
어떤 방식으로 서비스의 방법을 호출합니까
Android에서 서비스를 호출하는 방법을 제공하는 해결 방안은 서비스의 에이전트를 얻는 것이다
서비스 프록시 반환
서비스는 onBind () 방법으로 에이전트를 되돌려줍니다. 그 되돌려주는 값은 Ibinder의 실현 클래스입니다.
@Override
public IBinder onBind(Intent intent) {
System.out.println(" , IBinder ");
return new MyBinder();
}
Ibinder의 실현 클래스를 만듭니다. Ibinder는 하나의 인터페이스입니다. 이 인터페이스를 실현하려면 안에 있는 모든 방법을 실현해야 하기 때문에 매우 불편합니다. 시스템은 우리에게 편리한 실현 클래스 Binder를 제공했습니다. 이 클래스가 Binder를 계승하도록 하면 우리는 에이전트 방법을 제공할 수 있습니다public class MyBinder extends Binder{
public void callMethodInService(String name){
methodInService(name);
}
}
귀속 서비스는 그 에이전트를 얻고 서비스의 방법을 호출합니다public class MainActivity extends Activity {
//
private MyBinder myBinder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//
public void bind(View view){
//2. Service
Intent intent = new Intent(this,TestService.class);
//1. Service
//intent Service
//conn , conn
//BIND_AUTO_CREATE , .
bindService(intent, new MyConn(), BIND_AUTO_CREATE);
}
//3.
private class MyConn implements ServiceConnection{
//
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//4. ,
myBinder = (MyBinder) service;
}
// .
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
//
public void call(View view){
//5. ,
myBinder.callMethodInService(" ", 250);
}
}
귀속 서비스 호출 서비스 방법의 절차
서비스 코드 작성
public IBinder onBind(Intent intent) {}
서비스 내부에서 대리인 대상 MyBinder
를 정의onbind 방법에서 대리인 대상 되돌리기Activity 코드에서 귀속된 방식으로 서비스에 연결bindService(intent, new MyConn(), BIND_AUTO_CREATE);
서비스 Connection의 실현 클래스에 서비스가 되돌아오는 대리인 대상public void onServiceConnected(ComponentName name, IBinder service)
을 얻는 방법이 있다강제 유형 변환 Ibinder에서 MyBinder 유형으로 변환myBinder = (MyBinder) service;
대리인 대상을 호출하는 방법--서비스 안의 방법을 간접적으로 호출했다. 인터페이스를 통해 코드 내부에서 이루어진 세부 사항을 숨기다
코드의 디자인 방식을 배웁니다. 만약에 내부 유형에 여러 가지 방법이 있다면 그 중의 일부만을 폭로하고 싶을 때 인터페이스를 통해 노출하고 싶은 방법을 폭로할 수 있습니다.
내부 클래스를public로 설정하면 모든 방법이 노출되고 내부 클래스를private로 설정하면 모든 방법을 다른 사람이 사용할 수 없습니다구체적인 실현 방식: 내부 클래스를private로 설정하고 노출하고자 하는 방법을 공공 인터페이스에 추출귀속 방식으로 서비스의 생명 주기를 시작합니다
귀속 방식으로 서비스 오픈: 서비스가 존재하지 않으면 onCreate()--->onBind()를 실행하고 onStart()와 onStartCommand() 방법을 실행하지 않습니다바인딩 해제 서비스: onUnbind () --->onDetroy () 여러 번 귀속 서비스: 서비스는 한 번만 생성되고,onCreate() 방법은 한 번만 실행되며,onBind() 방법도 한 번만 실행됩니다실제 개발할 때 서비스 호출 방법이 필요하면 귀속 서비스로 한 번만 귀속할 수 있습니다.여러 번 묶으면 묶음을 풀 때 onUnbind () 방법이 호출되지 않을 뿐만 아니라 두 번째 묶음을 풀 때 프로그램 이상을 초래할 수 있습니다.
두 가지 오픈 서비스 방식의 비교
start 방식으로 서비스 시작
서비스가 시작되면 장기 백그라운드가 운행되고 서비스와 오픈자(Activity)는 아무런 관계가 없다. 오픈자가 퇴장하면 서비스는 계속 백그라운드에서 장기 운행한다오픈자(Activity)는 서비스에 있는 방법을 호출할 수 없습니다시스템 설정 인터페이스에서 관찰할 수 있음
bind 방식으로 서비스 오픈
오픈자(Activity)가 종료되면 서비스도 종료오픈자(Activity)는 중간인을 간접적으로 이용하여 서비스 안의 방법을 호출할 수 있다시스템 설정 인터페이스에서 볼 수 없습니다.
서비스가 열리고 동시에 귀속되면 서비스가 멈추지 않습니다. 귀속 서비스를 해제해야 서비스를 정지할 수 있습니다.
혼합 방식으로 서비스를 시작합니다.
서비스가 장기적으로 백그라운드에서 운행되고 서비스 안에 호출되는 방법을 확보하기 위해 혼합된 방식으로 서비스를 시작한다.
코드를 작성하려면 다음 절차를 따르십시오.
start 방식으로 서비스 오픈bind 방식 귀속 서비스(서비스 호출 가능한 방법)unbind 방식으로 귀속 해제 서비스stop 방식으로 서비스 중지
로컬 및 원격 서비스
로컬 서비스 local 서비스 코드는 현재 응용 프로그램 내부에 있습니다 원격 서비스remote 서비스 서비스의 코드는 다른 응용 프로그램에 있습니다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.