Android 는 AIDL 을 통 해 두 앱 간 에 Service 통신 을 합 니 다.
[지식 준비]
① Android Interface definition languge(adl,android 인터페이스 정의 언어)는 크로스 프로 세 스 호출 을 목적 으로 합 니 다.프로 세 스 는 프로그램 이 os 에서 실행 하 는 캐리어 입 니 다.하나의 프로그램 은 하나의 프로 세 스 에 대응 합 니 다.서로 다른 프로 세 스 는 서로 다른 프로그램 을 말 합 니 다.adl 은 서로 다른 프로그램 간 의 호출 을 실현 합 니 다.
② 메 인 스 레 드 와 서브 스 레 드 통신 은 handler 를 사용 합 니 다.handler 는 서브 스 레 드 에서 메 시 지 를 보 내 고 메 인 스 레 드 에서 메 시 지 를 처리 하여 스 레 드 간 의 통신 을 완성 할 수 있 습 니 다.여러 스 레 드 가 있 더 라 도 프로그램 입 니 다.
③ 서로 다른 프로그램 간 에 adl 통신 을 통 해 통신 방식 이 다양 할 수 있 고 adl 은 그 중의 하나 이다.이 루어 진 결 과 는 자신의 프로그램 이 자신의 다른 방법 을 호출 하 는 것 처럼 프로그램 처럼 느껴 졌 다.
④ 업무 장면:예 를 들 어 쇼핑 앱 은 결제 가 필요 하고 쇼핑 앱 은 타 오 바 오 이 며 결제 앱 은 알 리 페 이 이다.그래서 서로 다른 절차 로 통신 이 필요 합 니 다.
2.먼저 앱 간 의 서비스 와 Activity 간 의 통신 을 소개 합 니 다.
[프로젝트 구조]
【MyService】
[힌트]
① 서비스 생 성
② 상기 방법 으로 만 들 지 않 았 다 면 반드시 등록 을 기억 해 야 한다.
<service
android:name=".MyService"
android:enabled="true"
android:exported="true">
</service>
【코드】
public class MyService extends Service {
public MyService() {
}
@Override
public IBinder onBind(Intent intent) {
return new MyBinder();//return MyBinder ServiceConnection activity MyBinder
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
public void payService(){
Log.i("MyService", "payService: --------");
}
class MyBinder extends Binder{
public void pay(){
payService();
}// Binder service
}
}
【layout_main】버튼 추가,클릭 하면 호출 이 편리 합 니 다.
<Button
android:id="@+id/btn_paly"
android:text="Pay"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
【MainActivity】
public class MainActivity extends AppCompatActivity {
MyService.MyBinder binder = null;
ServiceConnection conn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnPlay = (Button) findViewById(R.id.btn_paly);
conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
binder = (MyService.MyBinder) iBinder;
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
}
};
Intent intent = new Intent(MainActivity.this,MyService.class);
bindService(intent,conn,BIND_AUTO_CREATE);//
btnPlay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (binder!=null){
binder.play();
}
}
});
}
}
【효과】클릭 후 서비스 에서 pay 방법 중의 내용 을 출력 합 니 다.
3.두 앱 간 서비스 통신
[프로젝트 구조]
[절차]
① AppPayProvider 에 MyService 만 들 기
코드 동상
[등록]
I、등록 시(android:enabled="true" android:exported="true")를 true 로 설정 하고 서 비 스 를 노출 시 켜 야 다른 앱 이 접근 할 수 있 습 니 다.
II、"
<service
android:name=".MyService"
android:enabled="true"
android:exported="true">
<!--enable:ture
exported:ture -->
<intent-filter>
<action android:name="com.xqz.apppayprovider.MyService" />
</intent-filter>
</service>
② MainActivity 와 layotmain 은 생 성 을 보류 할 때 어떠한 수정 도 하지 않 지만 삭제 하지 마 십시오.설치 프로그램 이 시작 페이지 를 제공 해 야 하기 때 문 입 니 다.그렇지 않 으 면 오류 가 발생 할 수 있 습 니 다.③ AppPayProvider 에 AIDL 추가
【코드】
[알림]인터페이스 에서 정 의 된 방법 은 Service 의 MyBinder 방법 과 일치 해 야 합 니 다.
④ AIDL 을 만 들 고 방법 을 추가 한 후에 안 드 로 이 드 스튜디오 는 이 에 이 드 를 컴 파일 해 야 합 니 다.에 이 드 규범 에 따라 Binder 서브 클래스 의 코드 를 자동 으로 생 성 합 니 다.
⑤ MyService 의 MyBinder 를 수정 합 니 다.
[힌트]IPay.Stub 계승.그 전에 Make Project 를 해 야 합 니 다.그렇지 않 으 면 연상 할 수 밖 에 없습니다.
⑥ AppPay 사용 자 를 만들어 AppPayProvider 의 MyService 를 조작 합 니 다.
【layout-main】
<Button
android:id="@+id/btnPay"
android:text="pay"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
⑦ AppPayProvider 의 AIDL 을 AppPayUser 에 복사【힌트】I、가방 이름 이 같 아야 합 니 다.디 렉 터 리 위치 에 따라 복사 하고 다음 방법 을 통 해 폴 더 에서 직접 복사 합 니 다."항목 구 조 를 볼 수 있 습 니 다.가방 이름 이 같 음 을 볼 수 있 습 니 다."
II、똑 같이 복사 해서 Make Project
⑧【AppPayUser-MainActivity】
public class MainActivity extends AppCompatActivity {
Button btnPay;
private IPay myBinder;// AIDL
ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
myBinder = IPay.Stub.asInterface(iBinder);
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent();
intent.setAction("com.xqz.apppayprovider.MyService");
// ,
/*android5.0 , servicer App ,
service
( App AndroidManifest )*/
intent.setPackage("com.xqz.apppayprovider");
bindService(intent,conn,BIND_AUTO_CREATE);// Service
btnPay = (Button) findViewById(R.id.btnPay);
btnPay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try {
myBinder.pay();
} catch (RemoteException e) {
// ,
e.printStackTrace();
}
}
});
}
}
【설치】먼저 AppPayProvider 를 설치 하고 AppPayUser 를 설치 합 니 다.
【효과】
run 의 보 기 를 AppPayProvider 로 바 꾸 고 시 뮬 레이 터 AppPayUser 의 pay 단 추 를 누 르 면 AppPayProvider 의 MyService 에서 pay 방법 중의 내용 을 실행 합 니 다.
총화
[앱 간 과 앱 간 의 차이 점]
① 크로스 앱 오픈 서 비 스 는 서 비 스 를 제공 하 는 앱 으로 intent-filter 필 터 를 설정 하고 서 비 스 를 제어 하 는 앱 이 통과 해 야 한다.setAction 과 setPackage 방법 으로 action 과 패키지 이름 을 설정 해 야 서 비 스 를 시작 할 수 있 습 니 다.같은 앱 은 시작 하 는 서비스 만 지정 하면 됩 니 다.
② 앱 을 뛰 어 넘 는 MyBinder 인 스 턴 스 는 AIDL 을 통 해 가 져 와 야 합 니 다.두 응용 프로그램 이 같은 인 터 페 이 스 를 정의 하 는 방법 은 해당 하 는 AIDL 이름.Stub.as 인터페이스 방법 으로 binder 인 스 턴 스 를 얻 은 다음 에 같은 App 의 my Binder 와 사용 하 는 것 과 차이 가 있 습 니까?
③ 앱 을 뛰 어 넘 는 MyBinder 대상 의 사용 은 이상 을 포착 해 야 하 며,같은 앱 은 필요 하지 않 습 니 다.
④ 위의 간단 한 예 에 따라 비슷 한 기능 을 많이 실현 할 수 있다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.