안 드 로 이 드 프로 세 스 간 통신 의 몇 가지 실현 방식 에 대해 자세히 알 아 보기

개술
프로그램 간 에 메모 리 를 공유 할 수 없 기 때문이다.서로 다른 응용 프로그램 간 의 상호작용 데이터(크로스 프로 세 스 통신)는 Android SDK 에서 크로스 프로 세 스 통신 에 사용 되 는 4 가지 방식 을 제공 합 니 다.
이 네 가지 방식 은 안 드 로 이 드 시스템 의 네 가지 응용 프로그램 구성 요소 인 Activity,Content Provider,Broadcast 와 Service 에 적합 하 다.그 중에서 Activity 는 프로 세 스 를 넘 어 다른 프로그램의 Activity 를 호출 할 수 있 습 니 다.Content Provider 는 프로 세 스 를 넘 어 다른 프로그램의 데이터(Cursor 대상 으로 되 돌아 가기)에 접근 할 수 있 습 니 다.물론 다른 프로그램의 데 이 터 를 추가,삭제,변경 할 수도 있 습 니 다.Broadcast 는 안 드 로 이 드 시스템 의 모든 응용 프로그램 에 방송 을 보 낼 수 있 고 프로 세 스 간 통신 이 필요 한 응용 프로그램 은 이 방송 을 감청 할 수 있 습 니 다.Service 는 Content Provider 와 유사 하 며 다른 프로그램의 데이터 에 도 접근 할 수 있 지만,다른 것 은 Content Provider 가 Cursor 대상 을 되 돌려 주 고 Service 가 Java 대상 을 되 돌려 주 는 프로 세 스 간 통신 이 가능 한 서 비 스 를 AIDL 서비스 라 고 합 니 다.
 Activity
Activity 의 크로스 프로 세 스 접근 은 프로 세 스 내 접근 과 약간 다 릅 니 다.모두 Intent 대상 이 필요 하지만,크로스 프로 세 스 접근 은 Context 대상 과 Activity 의 Class 대상 을 지정 할 필요 가 없고,접근 할 Activity 에 대응 하 는 Action(문자열)을 지정 해 야 합 니 다.일부 Activity 는 Uri(Intent 구조 방법의 두 번 째 매개 변 수 를 통 해 지정)를 지정 해 야 합 니 다.
안 드 로 이 드 시스템 에서 많은 응용 프로그램 이 프로 세 스 를 뛰 어 넘 을 수 있 는 Activity 를 제공 합 니 다.예 를 들 어 아래 코드 는 전 화 를 걸 수 있 는 Activity 를 직접 호출 할 수 있 습 니 다.

Intent callIntent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:12345678" ); 
startActivity(callIntent);
Content Provider 
Android 응용 프로그램 은 파일 이나 SqlLite 데이터 베 이 스 를 사용 하여 데 이 터 를 저장 할 수 있 습 니 다.Content Provider 는 여러 프로그램 간 의 데이터 공유 방식(크로스 프로 세 스 공유 데이터)을 제공 합 니 다.응용 프로그램 은 Content Provider 를 이용 하여 다음 작업 을 완성 할 수 있 습 니 다.
1.데이터 조회
2.데이터 수정
3.데이터 추가
4.데이터 삭제
콘 텐 츠 프로 바 이 더 도 같은 프로그램 에 접근 할 수 있 지만 의미 가 없다.Content Provider 가 존재 하 는 목적 은 다른 응용 프로그램 에 데 이 터 를 공유 하고 다른 응용 프로그램 이 데 이 터 를 증가,삭제,변경 할 수 있 도록 하 는 것 입 니 다.
안 드 로 이 드 시스템 자체 가 많은 Content Provider 를 제공 했다.예 를 들 어 오디 오,동 영상,연락처 정보 등 이다.저 희 는 이 Content Provider 를 통 해 관련 정보의 목록 을 얻 을 수 있 습 니 다.이 목록 데 이 터 는 Cursor 대상 으로 되 돌아 갑 니 다.따라서 Content Provider 에서 돌아 온 데 이 터 는 2 차원 표 형식 이다.
방송(방송) 
방송 은 수 동적 으로 프로 세 스 를 뛰 어 넘 는 통신 방식 이다.어떤 프로그램 이 시스템 에 방송 을 보 낼 때 다른 프로그램 은 수 동적 으로 방송 데 이 터 를 받 을 수 밖 에 없다.이것 은 방송국 이 방송 을 하 는 것 처럼 청중 들 은 수 동적 으로 들 을 수 있 을 뿐,주동 적 으로 방송국 과 소통 할 수 없다.
응용 프로그램 에서 방송 을 보 내 는 것 은 비교적 간단 하 다.sendbBroadcast 방법 만 호출 하면 됩 니 다.이 방법 은 Intent 대상 이 필요 합 니 다.Intent 대상 을 통 해 방송 이 필요 한 데 이 터 를 보 낼 수 있 습 니 다.
Service
1.AIDL 서 비 스 를 이용 하여 크로스 프로 세 스 통신 실현
이것 은 제 가 개인 적 으로 추앙 하 는 방식 입 니 다.왜냐하면 브 로드 캐 스 트 에 비해 실현 이 조금 번 거 롭 지만 라디오 처럼 핸드폰 에 방송 이 많 을 때 뚜렷 한 지연 이 있 지 않 고 심지어 방송 이 성공 하지 못 하 는 경우 도 있 기 때 문 입 니 다.
일반적인 Service 는 크로스 프로 세 스 작업 을 수행 할 수 없 음 을 주의 하 십시오.실제 일반적인 Service 와 그 가 있 는 응용 프로그램 은 같은 프로 세 스 에 있 고 새로운 스 레 드 를 만 들 지 않 습 니 다.따라서 일반적인 Service 에서 시간 이 걸 리 는 작업 을 수행 하려 면 새로운 스 레 드 가 필요 합 니 다.
크로스 프로 세 스 통신 을 실현 하려 면 AIDL(Android Interface Definition Language)을 빌려 야 합 니 다.Android 의 크로스 프로 세 스 서 비 스 는 사실 C/S 의 구 조 를 사용 하기 때문에 AIDL 의 목적 은 통신 인 터 페 이 스 를 실현 하 는 것 이다.
우선 간단 한 밤 을 들 어 라.
서버 코드 는 다음 과 같 습 니 다.
 우선 에 이 드 의 코드:

package com.android.service; 
 
interface IData 
{ 
  int getRoomNum(); 
} 
RoomService 의 코드 는 다음 과 같 습 니 다.

package com.android.service; 
 
import android.app.Service; 
import android.content.Intent; 
import android.os.IBinder; 
import android.os.RemoteException; 
 
public class RoomService extends Service{ 
 
  private IData.Stub mBinder=new IData.Stub() { 
     
    @Override 
    public int getRoomNum() throws RemoteException { 
       return 3008; 
    } 
  }; 
 
  @Override 
  public IBinder onBind(Intent intent) { 
    return mBinder; 
  } 
 
} 
Android Manifest 는 다음 과 같 습 니 다.

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
  package="com.android.aidlsampleservice" 
  android:versionCode="1" 
  android:versionName="1.0" > 
 
  <uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="17" /> 
 
  <application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme"    
    <service android:name="com.android.service.RoomService"> 
      <intent-filter> 
        <action android:name="com.aidl.service.room"/> 
      </intent-filter> 
    </service> 
  </application> 
 
</manifest> 
그리고 이 Service 가 있 는 Project 를 실행 하면 됩 니 다.
클 라 이언 트 코드 는 다음 과 같 습 니 다.
클 라 이언 트 에 도 adl 파일 이 있어 야 하기 때문에 가장 쉬 운 방법 은 Service 엔 드 에 있 는 adl 이 있 는 가방 을 직접 복사 하 는 것 입 니 다.또한 주의해 야 할 것 은 onDestroy 에서 Service 와 의 연결 을 해제 하 는 것 입 니 다.
MainActivity.java 의 코드 는 다음 과 같 습 니 다.

package com.example.aidlsampleclient; 
 
import com.android.service.IData; 
 
import android.os.Bundle; 
import android.os.IBinder; 
import android.os.RemoteException; 
import android.app.Activity; 
import android.content.ComponentName; 
import android.content.Intent; 
import android.content.ServiceConnection; 
import android.util.Log; 
import android.view.Menu; 
import android.widget.Button; 
import android.widget.Toast; 
import android.view.View; 
 
public class MainActivity extends Activity implements View.OnClickListener{ 
 
   
  private static final String TAG="MainActivity"; 
  private static final String ROOM_SERVICE_ACTION="com.aidl.service.room"; 
   
  private Button bindServiceButton; 
  private Button getServiceButton; 
   
   
  IData mData; 
   
  private ServiceConnection conn=new ServiceConnection() 
  { 
 
    @Override 
    public void onServiceConnected(ComponentName name, IBinder service) { 
     
      Log.i(TAG,"----------------onServiceConnected--------"); 
      mData=IData.Stub.asInterface(service); 
    } 
 
    @Override 
    public void onServiceDisconnected(ComponentName name) { 
     
      Log.i(TAG,"----------------onServiceDisconnected-------------"); 
      mData=null; 
       
    } 
     
  }; 
   
  private void initView() 
  { 
    bindServiceButton=(Button)findViewById(R.id.bindServiceButton); 
    getServiceButton=(Button)findViewById(R.id.getServiceButton); 
    bindServiceButton.setOnClickListener(this); 
    getServiceButton.setOnClickListener(this); 
  } 
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    initView(); 
  } 
   
  @Override 
  public void onClick(View v) { 
   switch(v.getId()) 
    { 
    case R.id.bindServiceButton: 
      bindService(); 
      break; 
    case R.id.getServiceButton: 
      getService();   
       break; 
    default: 
       break; 
    } 
  } 
   
   
  private void bindService() 
  { 
    Intent intent=new Intent(); 
    intent.setAction(ROOM_SERVICE_ACTION); 
    bindService(intent,conn,BIND_AUTO_CREATE); 
  } 
   
  private void getService() 
  { 
    try 
    { 
      if(mData!=null) 
      { 
        int roomNum=mData.getRoomNum(); 
        showLongToast("RoomNum:"+roomNum); 
      } 
       
    } 
    catch(RemoteException ex) 
    { 
      ex.printStackTrace(); 
    } 
     
  } 
   
  private void showLongToast(String info) 
  { 
    Toast.makeText(getBaseContext(), info, Toast.LENGTH_LONG).show(); 
  } 
 
  @Override 
  public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
  } 
  @Override 
  protected void onDestroy() { 
    super.onDestroy(); 
    unbindService(conn); 
  } 
} 
activity_main.xml 코드 는 다음 과 같 습 니 다.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  xmlns:tools="http://schemas.android.com/tools" 
  android:layout_width="match_parent" 
  android:layout_height="match_parent" 
  android:paddingBottom="@dimen/activity_vertical_margin" 
  android:paddingLeft="@dimen/activity_horizontal_margin" 
  android:paddingRight="@dimen/activity_horizontal_margin" 
  android:paddingTop="@dimen/activity_vertical_margin" 
  tools:context=".MainActivity" > 
 
  <Button  
    android:id="@+id/bindServiceButton" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="BindService" 
    /> 
  <Button 
    android:id="@+id/getServiceButton" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="GetService" 
    android:layout_below="@id/bindServiceButton" 
    />   
</RelativeLayout> 
실행 결 과 는 다음 과 같 습 니 다.
bubuko.com,布布扣
그리고 조금 복잡 한 밤 을 들 어*.aidl 파일 에 사용자 정의 대상 이 포함 되 어 있 으 면 이 대상 의 클래스 는 Parcelable 인 터 페 이 스 를 실현 하고 이 클래스 의 aidl 파일 을 새로 만들어 야 합 니 다.그렇지 않 으 면 could not find import for class.com.android.service.XX 의 오류 가 발생 할 수 있 습 니 다.그 중 XX 는 클래스 이름 입 니 다.위 에 있 는 밤 인 데 에 이 드 파일 에 새로운 방법 이 추가 되 었 습 니 다.여전히 위의 룸 서 비 스 를 예 로 들 면,
Service 엔 드 의 코드 는 다음 과 같 습 니 다.
Room 클래스 의 코드 는:

package com.android.service; 
 
import android.os.Parcel; 
import android.os.Parcelable; 
 
public class Room implements Parcelable{ 
 
  //    
  private int roomNum; 
  //     
  private float roomSpace; 
  //      
  private boolean hasAirConditioner; 
  //   Wifi 
  private boolean hasWifi; 
  //         
  private String decorativeStyle; 
   
  public static final Parcelable.Creator<Room>CREATOR=new Parcelable.Creator<Room>() { 
 
    @Override 
    public Room createFromParcel(Parcel source) { 
      return new Room(source); 
    } 
 
    @Override 
    public Room[] newArray(int size) { 
      return null; 
    } 
     
  }; 
   
  public Room(int roomNum,float roomSpace,boolean hasAirConditioner,boolean hasWifi,String decorativeStyle) 
  { 
    this.roomNum=roomNum; 
    this.roomSpace=roomSpace; 
    this.hasAirConditioner=hasAirConditioner; 
    this.hasWifi=hasWifi; 
    this.decorativeStyle=decorativeStyle; 
  } 
   
  private Room(Parcel source) 
  { 
    roomNum=source.readInt(); 
    roomSpace=source.readFloat(); 
    boolean[]tempArray=new boolean[2]; 
    source.readBooleanArray(tempArray); 
    hasAirConditioner=tempArray[0]; 
    hasWifi=tempArray[1]; 
    decorativeStyle=source.readString();  
  } 
   
  @Override 
  public String toString() 
  { 
    StringBuilder sb=new StringBuilder(); 
    sb.append("Basic info of room is as follows:
"); sb.append("RoomNum:"+roomNum+"
"); sb.append("RoomSpace:"+roomSpace+"
"); sb.append("HasAirConditioner:"+hasAirConditioner+"
"); sb.append("HasWifi:"+hasWifi+"
"); sb.append("Decorative Style:"+decorativeStyle); return sb.toString(); } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest,int flags) { dest.writeInt(roomNum); dest.writeFloat(roomSpace); dest.writeBooleanArray(new boolean[]{hasAirConditioner,hasWifi}); dest.writeString(decorativeStyle); } }
Room 의 성명 은:

package com.android.service; 
parcelable Room; 
IRoom.aidl 의 코드 는:

package com.android.service; 
import com.android.service.Room; 
 
interface IRoom 
{ 
 Room getRoom(); 
} 
RoomService 의 코드 는:

package com.android.service; 
 
import android.app.Service; 
import android.content.Intent; 
import android.os.IBinder; 
import android.os.RemoteException; 
 
public class RoomService extends Service{ 
 
  private IRoom.Stub mBinder=new IRoom.Stub() { 
     
    @Override 
    public Room getRoom() throws RemoteException { 
      Room room=new Room(3008,23.5f,true,true,"IKEA"); 
      return room;     
    } 
  }; 
   
  @Override 
  public IBinder onBind(Intent intent) { 
    return mBinder; 
  } 
 
} 
AndroidManifest.xml 코드 가 변 하지 않 기 때문에 더 이상 붙 이지 않 습 니 다.다음은 클 라 이언 트 의 코드 입 니 다.

package com.example.aidlsampleclient; 
import com.android.service.IRoom; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.os.RemoteException; 
import android.app.Activity; 
import android.content.ComponentName; 
import android.content.Intent; 
import android.content.ServiceConnection; 
import android.util.Log; 
import android.view.Menu; 
import android.widget.Button; 
import android.widget.Toast; 
import android.view.View; 
 
public class MainActivity extends Activity implements View.OnClickListener{ 
 
   
  private static final String TAG="MainActivity"; 
  //private static final String SERVICE_ACTION="com.aidl.service.data"; 
  private static final String ROOM_SERVICE_ACTION="com.aidl.service.room"; 
   
  private Button bindServiceButton; 
  private Button getServiceButton; 
   
   
  IRoom mRoom; 
   
  private ServiceConnection conn=new ServiceConnection() 
  { 
 
    @Override 
    public void onServiceConnected(ComponentName name, IBinder service) { 
     
      Log.i(TAG,"----------------onServiceConnected--------"); 
      showLongToast("onServiceConnected"); 
      mRoom=IRoom.Stub.asInterface(service); 
    } 
 
    @Override 
    public void onServiceDisconnected(ComponentName name) { 
     
      Log.i(TAG,"----------------onServiceDisconnected-------------"); 
      mRoom=null; 
       
    } 
     
  }; 
   
  private void initView() 
  { 
    bindServiceButton=(Button)findViewById(R.id.bindServiceButton); 
    getServiceButton=(Button)findViewById(R.id.getServiceButton); 
    bindServiceButton.setOnClickListener(this); 
    getServiceButton.setOnClickListener(this); 
  } 
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    initView(); 
  } 
   
  @Override 
  public void onClick(View v) { 
    switch(v.getId()) 
    { 
    case R.id.bindServiceButton: 
      bindService(); 
      break; 
    case R.id.getServiceButton: 
      getService();   
       break; 
    default: 
       break; 
    } 
  } 
   
   
  private void bindService() 
  { 
    Intent intent=new Intent(); 
    intent.setAction(ROOM_SERVICE_ACTION); 
    bindService(intent,conn,BIND_AUTO_CREATE); 
  } 
   
  private void getService() 
  { 
    if(mRoom!=null) 
    { 
      try 
      { 
        showLongToast(mRoom.getRoom().toString()); 
      } 
      catch (RemoteException e)  
      { 
        e.printStackTrace(); 
      } 
    } 
 
  } 
   
  private void showLongToast(String info) 
  { 
    Toast.makeText(getBaseContext(), info, Toast.LENGTH_LONG).show(); 
  } 
 
  @Override 
  public boolean onCreateOptionsMenu(Menu menu) { 
    resent. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
  } 
  @Override 
  protected void onDestroy() { 
    super.onDestroy(); 
    unbindService(conn); 
  } 
} 
우선 Room,IRoom 코드 를 복사 해 야 합 니 다.그렇지 않 으 면 오류 가 발생 할 수 있 습 니 다.
실행 결 과 는 다음 과 같 습 니 다.
bubuko.com,布布扣
분명히 클 라 이언 트 가 서비스 정 보 를 성공 적 으로 읽 었 다.
위 에 들 어 있 는 밤 은 프로 세 스 를 뛰 어 넘 는 것 이 아니 라 크로스 애플 리 케 이 션 입 니 다.주의해 야 할 것 은 크로스 응용 은 반드시 크로스 프로 세 스 이지 만 크로스 프로 세 스 가 반드시 크로스 응용 이 아 닙 니 다.크로스 애플 리 케 이 션 의 경우 AIDL 을 이용 하면 기본적으로 문 제 를 잘 해결 할 수 있 지만'좋 음'일 뿐 실제 적 으로 완벽 하지 않 습 니 다.예 를 들 어 서 비 스 를 추가 하려 면 AIDL 을 이용 하면 adl 파일 을 고 쳐 야 합 니 다.사용자 정의 이미지 와 관련 된 경우 사용자 정의 대상 의 성명 도 추가 해 야 합 니 다.그리고 이런 변 화 는 Service 측의 변화 만 이 아 닙 니 다.클 라 이언 트 도 따라서 바 뀌 어야 한다.분명히 이런 해결 방안 은 우아 하지 않다.
그렇다면 좀 더 우아 한 방법 은 없 을 까?
물론 있 습 니 다.그것 은 Service 를 이용 한 onStartCommand(Intent intent,int flags,int startId)방법 입 니 다.
서버 코드 는 다음 과 같 습 니 다.

package com.android.service; 
 
import android.app.Service; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.IBinder; 
import android.os.RemoteException; 
import android.util.Log; 
import android.widget.Toast; 
 
public class RoomService extends Service{ 
 
  private static final String TAG="RoomService"; 
  private static final int CLEAN_SERVICE=0x1; 
  private static final int ORDER_SERVICE=0x2; 
  private static final int PACKAGE_SERVICE=0x3; 
  private static final String SERVICE_KEY="ServiceName";  
  @Override 
  public void onStart(Intent intent, int startId) { 
    showLog("onStart"); 
  } 
 
  @Override 
  public int onStartCommand(Intent intent, int flags, int startId) { 
    //String action=intent.getAction(); 
    Log.i(TAG,"onStartCommand"); 
     
    int actionFlag=intent.getIntExtra(SERVICE_KEY, -1); 
   switch(actionFlag) 
    { 
    case CLEAN_SERVICE: 
      showShortToast("Start Clean Service Right Now"); 
      break; 
    case ORDER_SERVICE: 
      showShortToast("Start Order Service Right Now"); 
      break; 
    case PACKAGE_SERVICE: 
      showShortToast("Start Package Service Right Now"); 
      break; 
    default: 
      break; 
    } 
    return super.onStartCommand(intent, flags, startId); 
  } 
 
  private void showLog(String info) 
  { 
    Log.i(TAG,info); 
  } 
   
  private void showShortToast(String info) 
  { 
    Toast.makeText(getBaseContext(), info, Toast.LENGTH_SHORT).show(); 
  } 
  @Override 
  public void onDestroy() { 
    showLog("onDestroy"); 
    super.onDestroy(); 
  } 
 
  @Override 
  public void onCreate() { 
    showLog("onCreate"); 
    super.onCreate(); 
  } 
 
 
  @Override 
  public IBinder onBind(Intent intent) { 
    showLog("onBind"); 
    return null; 
  } 
 
  @Override 
  public boolean onUnbind(Intent intent) { 
    showLog("onUnbind"); 
    return super.onUnbind(intent); 
  } 
   
} 
클 라 이언 트 코드 는 다음 과 같 습 니 다.

package com.example.aidlsampleclient; 
import com.android.service.IRoom; 
import com.android.service.RoomService; 
 
import android.os.Bundle; 
import android.os.IBinder; 
import android.os.RemoteException; 
import android.app.Activity; 
import android.content.ComponentName; 
import android.content.Intent; 
import android.content.ServiceConnection; 
import android.util.Log; 
import android.view.Menu; 
import android.widget.Button; 
import android.widget.Toast; 
import android.view.View; 
 
public class MainActivity extends Activity implements View.OnClickListener{ 
 
  private static final String TAG="MainActivity"; 
  private static final String ROOM_SERVICE_ACTION="com.aidl.service.room"; 
   
  private static final int CLEAN_SERVICE=0x1; 
  private static final int ORDER_SERVICE=0x2; 
  private static final int PACKAGE_SERVICE=0x3; 
   
  private static final String SERVICE_KEY="ServiceName"; 
   
  private Button cleanButton; 
  private Button orderButton; 
  private Button packageButton; 
   
  private void initView() 
  { 
    cleanButton=(Button)findViewById(R.id.cleanButton); 
    orderButton=(Button)findViewById(R.id.orderButton); 
    packageButton=(Button)findViewById(R.id.packageButton); 
   
    cleanButton.setOnClickListener(this); 
    orderButton.setOnClickListener(this); 
    packageButton.setOnClickListener(this); 
  } 
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    initView(); 
  } 
   
  @Override 
  public void onClick(View v) { 
  switch(v.getId()) 
    { 
    case R.id.cleanButton: 
      cleanAction(); 
      break; 
    case R.id.orderButton: 
      orderAction(); 
      break; 
    case R.id.packageButton: 
      packageAction(); 
      break; 
    default: 
       break; 
    } 
  } 
     
  private void cleanAction() 
  { 
    startAction(ROOM_SERVICE_ACTION,CLEAN_SERVICE); 
  } 
   
  private void orderAction() 
  { 
    startAction(ROOM_SERVICE_ACTION,ORDER_SERVICE); 
  } 
   
  private void packageAction() 
  { 
    startAction(ROOM_SERVICE_ACTION,PACKAGE_SERVICE); 
  } 
   
  private void startAction(String actionName,int serviceFlag) 
  { 
    //Intent intent=new Intent(this,RoomService.class); 
    Intent intent=new Intent(); 
    intent.setAction(actionName); 
    intent.putExtra(SERVICE_KEY, serviceFlag); 
    this.startService(intent); 
  } 
   
  private void showLongToast(String info) 
  { 
    Toast.makeText(getBaseContext(), info, Toast.LENGTH_LONG).show(); 
  } 
 
  @Override 
  public boolean onCreateOptionsMenu(Menu menu) { 
   resent. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
  } 
  @Override 
  protected void onDestroy() { 
    super.onDestroy(); 
  } 
} 
실행 결 과 는 다음 과 같 습 니 다.
bubuko.com,布布扣
분명히 이때 클 라 이언 트 가 서 비 스 를 순조롭게 받 았 다.
위 에 들 어 있 는 것 은 크로스 애플 리 케 이 션 의 예 입 니 다.같은 애플 리 케 이 션 의 서로 다른 프로 세 스 라면 더욱 간단 한 실현 방법 이 있 습 니 다.
RoomService 의 코드 는 다음 과 같 습 니 다.

package com.android.service; 
 
import com.android.actions.Actions; 
 
import android.app.Service; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.IBinder; 
import android.os.RemoteException; 
import android.util.Log; 
import android.widget.Toast; 
 
public class RoomService extends Service{ 
 
  private static final String TAG="RoomService"; 
  @Override 
  public void onStart(Intent intent, int startId) { 
    showLog("onStart"); 
  } 
 
  @Override 
  public int onStartCommand(Intent intent, int flags, int startId) { 
    //String action=intent.getAction(); 
    Log.i(TAG,"onStartCommand"); 
    String action=intent.getAction(); 
    if(Actions.CLEAN_ACTION.equals(action)) 
    {   
      showShortToast("Start Clean Service Right Now"); 
    } 
    else if(Actions.ORDER_ACTION.equals(action)) 
    { 
      showShortToast("Start Order Service Right Now"); 
    } 
    else if(Actions.PACKAGE_ACTION.equals(action)) 
    { 
      showShortToast("Start Package Service Right Now"); 
    } 
    else 
    { 
      showShortToast("Wrong action"); 
    } 
    return super.onStartCommand(intent, flags, startId); 
  } 
 
  private void showLog(String info) 
  { 
    Log.i(TAG,info); 
  } 
   
  private void showShortToast(String info) 
  { 
    Toast.makeText(getBaseContext(), info, Toast.LENGTH_SHORT).show(); 
  } 
  @Override 
  public void onDestroy() { 
    showLog("onDestroy"); 
    super.onDestroy(); 
  } 
 
  @Override 
  public void onCreate() { 

    showLog("onCreate"); 
    super.onCreate(); 
  } 
 
 
  @Override 
  public IBinder onBind(Intent intent) { 
    showLog("onBind"); 
    return null; 
  } 
 
  @Override 
  public boolean onUnbind(Intent intent) { 
    showLog("onUnbind"); 
    return super.onUnbind(intent); 
  } 
   
}
MainActivity 의 코드 는 다음 과 같 습 니 다.

package com.android.activity; 
import com.android.activity.R; 
import com.android.service.RoomService; 
 
import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.Menu; 
import android.widget.Button; 
import android.widget.Toast; 
import android.view.View; 
import com.android.actions.Actions; 
 
public class MainActivity extends Activity implements View.OnClickListener{ 
 
  private static final String TAG="MainActivity"; 
 
  private static final String SERVICE_KEY="ServiceName"; 
   
  private Button cleanButton; 
  private Button orderButton; 
  private Button packageButton; 
   
  private void initView() 
  { 
    cleanButton=(Button)findViewById(R.id.cleanButton); 
    orderButton=(Button)findViewById(R.id.orderButton); 
    packageButton=(Button)findViewById(R.id.packageButton); 
   
    cleanButton.setOnClickListener(this); 
    orderButton.setOnClickListener(this); 
    packageButton.setOnClickListener(this); 
  } 
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    initView(); 
  } 
   
  @Override 
  public void onClick(View v) { 
   switch(v.getId()) 
    { 
    case R.id.cleanButton: 
      cleanAction(); 
      break; 
    case R.id.orderButton: 
      orderAction(); 
      break; 
    case R.id.packageButton: 
      packageAction(); 
      break; 
    default: 
       break; 
    } 
  } 
     
  private void cleanAction() 
  { 
    startAction(Actions.CLEAN_ACTION); 
  } 
   
  private void orderAction() 
  { 
    startAction(Actions.ORDER_ACTION); 
  } 
   
  private void packageAction() 
  { 
    startAction(Actions.PACKAGE_ACTION); 
  } 
   
  private void startAction(String actionName) 
  { 
    Intent intent=new Intent(this,RoomService.class); 
    intent.setAction(actionName); 
    this.startService(intent); 
  } 
   
  private void showLongToast(String info) 
  { 
    Toast.makeText(getBaseContext(), info, Toast.LENGTH_LONG).show(); 
  } 
 
  @Override 
  public boolean onCreateOptionsMenu(Menu menu) { 
   resent. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
  } 
  @Override 
  protected void onDestroy() { 
    super.onDestroy(); 
  } 
} 
인쇄 된 log 를 통 해 알 수 있 듯 이 클 라 이언 트 가 Context.startService(Intent)를 호출 할 때마다 Service 는 onStart Command->onStart 를 다시 실행 합 니 다.그러나 AIDL 을 사용 하면 바 인 딩 서 비 스 를 사용 한 후에 onStart 를 반복 하지 않 고 후자 의 대가 가 더 적은 것 이 분명 하 다.
Service:프론트 서비스,우리 가 자주 사용 하 는 날씨,음악 은 모두 프론트 서 비 스 를 이용 하여 이 루어 집 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기