Android 크로스 응용 프로그램 시작 실례 상세 설명

Android 크로스 응용 프로그램 시작
선언:
여러분 을 믿 습 니 다.자신의 앱 에서 자신 이 쓴 Activity,Service,BroadcastReceiver,contentProvider 를 시작 하 는 경우 가 많 습 니 다.다시 말 하면 이것 은 모두*단일 응용 프로그램 에서 구성 요소 간*의 시작 일 뿐이다.우리 가 다음 에 이야기 하고 자 하 는 것 은 두 개의 응용 간 구성 요소 의 시작 이다.즉,암시 적 인 Intent 방식 으로 B 를 사용 한 구성 요 소 를 시작 하 는 것 이다.
1.시작 하기 전에 크로스 애플 리 케 이 션 이 시작 하 는 두 가지 방식 을 정리 합 니 다.
첫 번 째:Activity 에서 다른 app 구성 요 소 를 시작 합 니 다.

두 번 째:Service 에서 다른 app 구성 요 소 를 시작 합 니 다.

안 드 로 이 드 에는 4 대 구성 요소 가 있 는 것 으로 알려 져 있 습 니 다.그런데 왜 작은 편집 은 Activity 와 Service 에서 다른 응용 을 시작 하 는 4 대 구성 요소 만 소개 합 니까?
사실 BroadcastReceiver 구성 요소 도 4 대 구성 요 소 를 시작 할 수 있 습 니 다.onReceive()방법 에서 context 인 스 턴 스 를 요청 하고 context 인 스 턴 스 가 있 으 면 context 방법 으로 다른 구성 요 소 를 시작 할 수 있 기 때 문 입 니 다.
contentProvider 에 대해 서 는 아직 본 적 이 없다 고 생각 합 니 다.이 아 이 는 자동 으로 일 을 한 적 이 있 습 니 다.모두 수 동적 인 호출 이 라 고 생각 합 니 다.
그래서 코드 를 쓸 때 저 희 는 Activity 나 Service 에서 구성 요 소 를 시작 합 니 다.BroadcastReceiver 는 매우 적 고 contentProvider 는 본 적 이 없습니다.
또한 여러분 에 게 말씀 드 려 야 할 것 은 Context 류 는 추상 적 인 유형 이 고 들 어 오 는 context 인 스 턴 스 는 하위 클래스 에서 이 루어 집 니 다.이런―부모 류 로 변 수 를 설명 하고 하위 클래스 에서 이 루어 지 는 사고방식 은 자바 에서 흔히 볼 수 있 습 니 다.특히 인터페이스 와 추상 류 는 이런 방식 을 자주 사용한다.C 에서 자바 로 바 뀌 는 이런 사람 에 게 는 정말 큰 구덩이 다.
왜 Activity 와 Service 는 그림 속 의 네 가지 방법 을 직접 사용 할 수 있 습 니까?이것 은 Activity 와 Service 가 모두 ContextWrapper 에서 계승 되 기 때문에 하위 클래스 는 부모 클래스 를 가 진 방법 입 니 다.BroadcastReceiver 와 contentProvider 는 아 닙 니 다.구체 적 으로 는 공식 API 를 볼 수 있 습 니 다.
2.크로스 응용 시작 실전
**다음은 본 격 적 으로 오늘 의 주제 에 들 어 갑 니 다:크로스 애플 리 케 이 션 시작 실전**
1:AppA 의 Activity 에서 AppB 의 Activity 를 시작 합 니 다.
Android 는 한 앱 에서 다른 앱 의 Activity 를 시작 하 는 능력 을 제공 합 니 다.이 는 우리 프로그램 이 다른 프로그램의 기능 을 쉽게 호출 할 수 있 게 하여 우리 앱 의 기능 을 풍부하게 합 니 다.예 를 들 어 위 챗 에서 위치 정 보 를 보 내 면 상대방 은 이 위치 정 보 를 클릭 하여 텐 센트 지 도 를 시작 하고 내 비게 이 션 을 할 수 있다.이 장면 은 현실 에서 큰 역할 을 한다.특히 친구 가 낯 선 환경 에서 상대방 을 찾 지 못 할 때 이 기능 은 바로 구세주 이다.
이 글 의 이름 을 다른 프로 세 스 를 시작 하 는 Activity 라 고 부 르 려 고 했 는데 그래 야 긴박 하 다 고 생각 했 습 니 다.모든 앱 이 자신의 가상 컴퓨터 에서 실행 되 기 때문에 모든 가상 컴퓨터 는 하나의 프로 세 스 에서 달 립 니 다.하지만 곰 곰 이 생각해 보면 프로 세 스 라 고 할 수 있 습 니 다.전 제 는 이 앱 이 실행 되 어야 한 다 는 것 입 니 다.한편,안 드 로 이 드 가 제공 하 는 능력 은 다른 앱 을 시작 하지 않 아 도 특정한 Activity 를 시작 할 수 있다.
즉,B 응용 프로그램 은 시작 되 지 않 은 상 태 를 처리 하 는 것 입 니 다.즉,아직 시스템 의 프로 세 스 가 되 지 않 았 습 니 다.그러면 A 가 B 응용 프로그램 을 시작 하 는 특정한 구성 요 소 를 사용 할 때 B 응용 프로그램 은 시스템 의 프로 세 스 가 되 었 습 니까?정 답 은 yes.어떻게 보면 Android Studio 의 Android device monito 에서 가상 머 신 을 결합 해 볼 수 있 습 니 다.

우 리 는 적어도 두 가지 방법 으로 다른 앱 의 Activity 를 시작 할 수 있다.
첫 번 째―암시 적 Intent 의 action 방식.
이런 방식 을 믿 으 면 모두 가 낯 설 지 않 을 것 이다.여 기 는 너무 많은 해석 을 하지 않 습 니 다.AppB 의 manifest(파일 목록)만 붙 입 니 다.

파일 목록 에서 appB 에는 두 개의 Activity 가 있 음 을 볼 수 있 습 니 다.그 중에서 도 세 컨 드 액 티 비 티 는 앱 A 에 의 해 시작 되 는 액 티 비 티 다.
그러면 저 희 는 appa 의 임의의 구성 요소(Activity 또는 Service)에서 다음 과 같은 호출 을 합 니 다.

Intent intent=new Intent("android.intent.action.SecondActivity");
startActivity(intent);
A 응용 프로그램 에서 B 응용 프로그램의 구성 요 소 를 성공 적 으로 시작 할 수 있 습 니 다.또한,SecondActivity 의 category 는 반드시 파일 목록 에 추가 해 야 합 니 다.그렇지 않 으 면 시작 할 때 잘못 보고 할 수 있 습 니 다.

                : 
1、 A      B   SecondActivity,  B   MainActivity       ?     ,      B,    MainActivity    ,              ,      B MainActivity ?     。

2、    SecondActivity   Back    ,    A   mainActivity  ,           。 
SecondActivity appA mainActivity           ?          ID 。

3、       ,       :Android  Activity   ,   framework  ActivityManager。    ,     N   ,          ,     Activity   ActivityManager         。         Activity   。          Ibinder   。      。

 
두 번 째 는 intent 로 className 이나 component 를 설정 하 는 방법 으로 시작 합 니 다.예 를 들 면 아래 와 같다.
프로젝트 A 와 프로젝트 B 를 새로 만 들 고 B 의 MainActivity 로 A 의 MainActivity 를 시작 합 니 다.키 코드 는 다음 과 같 습 니 다:
ProjectA MainActivity

@Override
 public void onClick(View v) {
 Intent intent = new Intent(Intent.ACTION_VIEW);
 String packageName = "com.example.mylife.anotherapp";
 String className = "com.example.mylife.anotherapp.MainActivity";
 intent.setClassName(packageName, className);
 //second method
 //intent.setComponent(new ComponentName("com.example.mylife.anotherapp","com.example.mylife.anotherapp.MainActivity"));
 Bundle bundle = new Bundle();
 bundle.putString("msg", "this message is from project B ");
 intent.putExtras(bundle);
 intent.putExtra("pid", android.os.Process.myPid());
 startActivityForResult(intent, 1);
 //startActivity(intent);
 }

 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 super.onActivityResult(requestCode, resultCode, data);
 switch (requestCode) {
 case 1:
 if(resultCode == RESULT_OK) {
 textView.setText(data.getStringExtra("result"));
 }
 break;
 }
 }
ProjectB MainActivity

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 textView = (TextView)findViewById(R.id.text);

 Intent intent = getIntent();
 if(intent != null) {
 textView.setText(intent.getStringExtra("msg"));
 }
 }

 public void OnClick(View view) {
 Intent intent = new Intent();
 intent.putExtra("result","OK! from project a.");
 this.setResult(RESULT_OK,intent);
 this.finish();//          finish()。
 }
메모:앱 B 에서 Back 키 를 누 르 고 A 를 적용 한 MainActivity 이벤트 로 되 돌아 가면 A 의 onActivity Result()방법 은 되 돌아 오지 않 습 니 다.이 는 ProjectB 의 MainActivity 활동 이 스 택 에서 만 나 왔 을 뿐 소각 되 지 않 았 기 때 문 입 니 다.그리고 ProjectB 의 MainActivity 활동 이 소 멸 될 때 만 A 의 onActivity Result()방법 을 되 돌려 줍 니 다.그럼 Back 버튼 을 누 르 고 되 돌 리 는 거 라면 어떻게 할 까요?이 럴 때 는 app B 의 onBackPressed()방법 을 다시 쓰 면 됩 니 다.

@Override
public void onBackPressed() {
 super.onBackPressed();
 Intent intent = new Intent();
 intent.putExtra("result","OK! from project a.");
 this.setResult(RESULT_OK,intent);
 this.finish();//          finish()。
}
2.A 응용 Activity 에서 시작(정지)-B 응용 서비스
B 의 manifest 적용

B 의 service 를 사용 하 는 코드:

public class MyService extends Service {

 private static final String TAG = "MyService";
 public MyService() {
 }

 @Override
 public IBinder onBind(Intent intent) {
 // TODO: Return the communication channel to the service.
 throw new UnsupportedOperationException("Not yet implemented");
 }

 @Override
 public void onCreate() {
 super.onCreate();
 Log.d(TAG, "onCreate: ");
 }

 @Override
 public int onStartCommand(Intent intent,int flags, int startId) {
 Log.d(TAG, "onStartCommand: ");
 if(intent != null) {
 Log.d(TAG, "onStartCommand: "+intent.getStringExtra("msg"));
 }
 return super.onStartCommand(intent, flags, startId);

 }

 @Override
 public void onDestroy() {
 super.onDestroy();
 Log.d(TAG, "onDestroy: ");
 }
 }
A 코드 적용:

@Override
 public void onClick(View v) {
 Intent intent = new Intent(Intent.ACTION_VIEW);
 String packageName = "com.example.mylife.anotherapp";
 String className = "com.example.mylife.anotherapp.MyService";
 intent.setClassName(packageName, className);

 switch (v.getId()) {
 case R.id.btn_start:
 Bundle bundle = new Bundle();
 bundle.putString("msg", "this message is from project B ");
 intent.putExtras(bundle);
 intent.putExtra("pid", android.os.Process.myPid());
 startService(intent);
 break;
 case R.id.btn_stop:
 stopService(intent);
 break;
 }
 }
테스트 결과:A 앱 은 B 앱 의 서 비 스 를 직접 시작 하지만 B 앱 은 자신의 Activity 를 열지 않 습 니 다.
이번 코드 참조:https://www.jb51.net/article/111896.htm
읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기