Android 에서 Intent 클래스 를 통 해 구성 요소 간 호출 을 실현 하 는 방법

6099 단어 AndroidIntent
Intent 는 Android 에서 다른 구성 요 소 를 호출 하 는 클래스 입 니 다.Intent 를 통 해 Activity,Broadcast Receiver,Service 를 편리 하 게 호출 할 수 있 습 니 다.

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
위의 코드 는 제3자 Activity 를 호출 할 수 있 습 니 다.(제3자 브 라 우 저 를 시작 하여 바 이 두 홈 페이지 를 엽 니 다.)
Intent 는 암시 적 이 고 명시 적 인 구분 이 있 습 니 다.위의 것 입 니 다.

Intent intent = new Intent(Intent.ACTION_VIEW);
만 든 intent 는 암시 적 Intent 라 고 합 니 다.암시 적 인 Intent 를 구축 하려 면 action 을 표시 하 는 문자열 이 필요 합 니 다(예 를 들 어 Intent.ACTIONVIEW 의 값 은"android.intent.action.VIEW"입 니 다.Android 는 이 action 을 처리 할 수 있 는 Activity(manifest 파일 에 있 는 이 Activity 의 intent-filter 에서 설명)를 찾 아 호출 합 니 다.
때때로 여러 개의 Activity 가 특정한 action 을 처리 할 수 있다 고 설명 할 수 있 습 니 다.예 를 들 어:

<activity
  android:name=".Activity1">
  <intent-filter>
    <action android:name="com.abc.def" />
    <category android:name="android.intent.category.DEFAULT" />
  </intent-filter>
</activity>
<activity
  android:name=".Activity2">
  <intent-filter>
    <action android:name="com.abc.def" />
    <category android:name="android.intent.category.DEFAULT" />
  </intent-filter>
</activity>
위의 Activity 1 과 Activity 2 는"com.abc.def"의 action 을 처리 할 수 있다 고 밝 혔 기 때문에 다음 코드 를 실행 할 때

Intent intent = new Intent("com.abc.def");
startActivity(intent);
Activity 1 과 Activity 2 가 모두 요구 에 부합 합 니 다.Android 는'Complete Action Using'대화 상 자 를 꺼 내 서 사용자 가 실행 할 Activity 를 선택 하도록 합 니 다.
주의해 야 할 것 은 암시 적 Intent 호출 과 일치 하려 면 DEFAULT 의 category(즉,)가 포함 되 어야 하 며,명시 적 Intent 와 일치 하려 면 이 category 가 필요 하지 않 습 니 다.
암시 적 인 Intent 에 대해 서 는 action 외 에 도 다양한 정 보 를 제공 하여 안 드 로 이 드 가 최 적 화 된 매 칭 을 선택 하 는 데 도움 을 줄 수 있다.또한 추가 할 수 있 는 다른 정 보 는 host,mimeType,path,pathPattern,pathPrefix,port,scheme 입 니 다.
예 를 들 어 위 Activity 2 의 manifest 설정 에 mimeType 속성 을 추가 합 니 다.

<activity
  android:name=".Activity2">
  <intent-filter>
    <action android:name="com.abc.def" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:mimeType="abc/def"/>
  </intent-filter>
</activity>
그러면:

Intent intent = new Intent("com.abc.def");
startActivity(intent);//  Activity1  

/********************************************/
Intent intent = new Intent("com.abc.def");
intent.setType("abc/def");
startActivity(intent);//  Activity2  

Intent 를 만 들 때 호출 할 클래스(예 를 들 어 new Intent(xx Activity.this,xx.class)를 가리 키 거나 setComponent 를 통 해 지정)를 가리 키 면 이러한 Intent 는 Intent 를 표시 하 는 것 이 라 고 합 니 다.
명시 적 Intent 에 대해 서 는 호출 할 구체 적 인 종 류 를 가 리 켰 기 때문에 Android 는 action,category,data 속성 을 무시 합 니 다.(개인 적 으로 Intent 호출 이 암시 적 인 것 보다 빠르다 고 생각 합 니 다)
Serializable vs Parcelable
Android 는 주로 Intent 를 통 해 구성 요소 간 의 상호 호출 을 실현 하 는 동시에 추가 데 이 터 를 전달 할 수 있 습 니 다.이 데 이 터 는 주로 Bundle 에 저 장 됩 니 다.
Bundle 에 서 는 기본 데이터 형식 을 저장 하고 Serializable 또는 Parcelable 인 터 페 이 스 를 실현 하 는 클래스 를 저장 할 수 있 습 니 다.
Bundle 에 Obj(int 구성원 두 개 를 포함 하 는 간단 한 클래스)를 저장 하려 면 Serializable 또는 Parcelable 인 터 페 이 스 를 실현 할 수 있 습 니 다.다음 과 같 습 니 다.
1.Serializable

public class Obj implements Serializable {
  private int a;
  private int b;
  public Obj(int a, int b) {
    this.a = a;
    this.b = b;
  }
  
  @Override
  public String toString() {
    return "Obj: [" + a + ", " + b + "]";
  }
}
우 리 는 intent.putExtra("obj",new Obj(1,2)를 통 해인 텐트 에 넣 고 obj=(Obj)인 텐트.getSerializableExtra("obj")를 통 해꺼 내 라.
2.Parcelable

public class ObjPar implements Parcelable {
  private int a;
  private int b;
  public ObjPar(int a, int b) {
    this.a = a;
    this.b = b;
  }
  
  @Override
  public String toString() {
    return "Obj: [" + a + ", " + b + "]";
  }
  @Override
  public int describeContents() {
    return 0;
  }
  @Override
  public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(a);
    dest.writeInt(b);
  }
  
  public static final Parcelable.Creator<ObjPar> CREATOR = new Creator<ObjPar>() {
    
    @Override
    public ObjPar[] newArray(int size) {
      return new ObjPar[size];
    }
    
    @Override
    public ObjPar createFromParcel(Parcel source) {
      
      return new ObjPar(source.readInt(), source.readInt());
    }
  };
}
우 리 는 intent.putExtra("obbpar",new ObjPar(1,2)를 통 해인 텐트 에 넣 고 obbpar 를 통 해=  (ObjPar) intent.getParcelableExtra("objpar"); 꺼 내 라.
이상 은 Bundle 에 Object 대상 을 저장 하 는 두 가지 방법 으로 Serializable 인 터 페 이 스 를 실현 하 는 것 이 더욱 간단 하 다 는 것 을 알 수 있다.왜냐하면 그 는 표 시 된 인터페이스 이기 때문에 구체 적 인 방법 을 실현 할 필요 가 없다.파 르 셀 라 블 인 터 페 이 스 를 실현 하 는 것 보다 상대 적 으로 복잡 해 보이 지만 성능 이 크게 향상 되 는 것 이 장점 이다.이것 은 우리 가 Serializable 인 터 페 이 스 를 실현 한 후에 진정한 직렬 화 작업 은 JDK 에 의 해 이 루어 지기 때문이다.그 는 반 사 를 통 해 구성원 변 수 를 얻어 야 한다.반 사 된 성능 이 높 지 않 기 때문에 이런 직렬 화 방식 은 속도 가 느 리 기 때문이다.그러나 Parcelable 인 터 페 이 스 를 실현 할 때 우 리 는 이 인터페이스 에서 정 의 된 방법의 실현(writeToParcel 은 서열 화,createFromParcel 은 반 서열 화)을 제 공 했 기 때문에 반사 적 인 사용 을 피 할 수 있 기 때문에 이런 방식 은 속도 가 빠르다.
그렇다면 이 두 가지 방식 은 성능 차이 가 얼마나 될 까?다음은 해외 사이트 의 테스트 결과 입 니 다.Serializable 은 Parcelable 의 10 배 정도 걸 립 니 다.
  2016520152123213.png (761×1002)

좋은 웹페이지 즐겨찾기