Android 에서 Service 서비스의 기초 지식 및 작성 방법 에 대해 자세히 알 아 보기

12197 단어 AndroidService
우선 서비스 가 무엇 인지 확인 해 볼 까요?
        서 비 스 는 안 드 로 이 드 시스템 의 서비스 입 니 다.사용자 와 직접 상호작용 을 할 수 없고 사용자 나 다른 프로그램 에서 시작 해 야 합 니 다.우선 순위 가 높 습 니 다.프론트 에 있 는 응용 보다 우선 순위 가 낮 지만 배경 에 있 는 다른 응용 보다 우선 순위 가 높 습 니 다.이 는 시스템 이 메모리 가 부족 해서 이용 되 지 않 은 자원 을 없 앨 때 소 각 될 확률 이 매우 적다 는 것 을 결정 한다.
그럼 언제 서 비 스 를 사용 해 야 합 니까?
        서 비 스 는 백 스테이지 에서 실행 되 는 애플 리 케 이 션 으로 사용자 에 게 주 목 받 는 초점 을 잃 었 다 는 것 을 잘 알 고 있 습 니 다.이것 은 우리 와 음악 을 틀 어 놓 은 후에 그림 을 보 러 가 고 싶 습 니 다.이때 우 리 는 음악 이 멈 추고 싶 지 않 습 니 다.여 기 는 service 를 사용 할 것 입 니 다.또 예 를 들 어 우리 가 다운로드 링크 를 연 후에 우 리 는 눈 을 부 릅 뜨 고 그 가 다운로드 한 후에 다른 일 을 하고 싶 지 않 을 것 이다.그렇지?이때 만약 에 우리 가 핸드폰 을 백 스테이지 에서 다운로드 하면 서 뉴스 같은 것 을 보 여 주 려 면 service 를 사용 해 야 한다.
서비스 분류:
       일반적으로 서 비 스 는 로 컬 서비스 와 원 격 서비스 로 나 뉜 다 고 생각 합 니 다.
      1.로 컬 서비스:말 그대로 현재 같은 프로 세 스에 적용 되 고 있 는 서비스 입 니 다.서로 공 통 된 메모리 영역 을 가지 고 있 기 때문에 일부 데이터 공유 에 특히 편리 하고 간단 합 니 다.
      2.원 격 서비스:주로 서로 다른 프로 세 스 간 의 서비스 접근 과 관련된다.안 드 로 이 드 의 시스템 보안 때문에 우 리 는 서로 다른 프로 세 스 간 에 일반적인 방식 으로 데 이 터 를 공유 할 수 없습니다.여기 안 드 로 이 드 가 AIDL 도 구 를 제공 합 니 다.(android interface description language)android 인터페이스 설명 언어.뒤에서 우 리 는 그것 에 대해 상세 하 게 소개 할 것 이다.
서비스 시작 프로 세 스
context.startService()시작 프로 세 스:
context.startService()  -> onCreate()  -> onStart()  -> Service running  -> context.stopService()  -> onDestroy()  -> Service stop
서비스 가 실행 되 지 않 았 다 면 안 드 로 이 드 는 onCreate()를 먼저 호출 한 다음 onStart()를 호출 합 니 다.
Service 가 실행 되 었 다 면 onStart()만 호출 되 기 때문에 하나의 Service 의 onStart 방법 은 여러 번 중복 호출 될 수 있 습 니 다.
stopService 를 사용 할 때 on Destroy 를 직접 사용 합 니 다.호출 자가 직접 종료 하고 stopService 를 사용 하지 않 으 면 Service 는 계속 배경 에서 실 행 됩 니 다.이 Service 의 호출 자 는 다시 시작 하면 stopService 를 통 해 서 비 스 를 닫 을 수 있 습 니 다.
그래서 startService 를 호출 하 는 생명 주 기 는:onCreate-->onStart(여러 번 호출 가능)-->onDestroy 입 니 다.
context.bindService()시작 프로 세 스:
context.bindService()  -> onCreate()  -> onBind()  -> Service running  -> onUnbind()  -> onDestroy()  -> Service stop
 
onBind()는 클 라 이언 트 에 게 IBind 인터페이스 인 스 턴 스 를 되 돌려 줍 니 다.IBind 는 클 라 이언 트 가 서 비 스 를 되 돌려 주 는 방법 을 허용 합 니 다.예 를 들 어 Service 의 인 스 턴 스,실행 상태 또는 다른 작업 을 받 을 수 있 습 니 다.이 럴 때 호출 자(Context,예 를 들 어 Activity)를 Service 와 연결 하고 Context 가 종료 되면 Srevice 는 onUnbid->onDestroy 를 호출 하여 종료 합 니 다.
그래서 bindService 를 호출 하 는 생명 주 기 는:onCreate-->onBind(한 번 만,여러 번 연결 할 수 없습니다)-->onUnbind-->onDestory 입 니 다.
Service 가 열 릴 때마다 닫 히 는 과정 에서 onStart 만 여러 번 호출 될 수 있 습 니 다(여러 번 startService 를 통 해 호출 됨).다른 onCreate,onBind,onUnbind,onDestory 는 한 생명 주기 에 한 번 만 호출 될 수 있 습 니 다.
2016411141501384.gif (558×544)
서비스 수명 주기:
     Activity 에 비해 service 의 생명 주 기 는 더 이상 간단 할 수 없습니다.onCreate()->onStart()->onDestroy()세 가지 방법 만 있 습 니 다.
Activity 에서 service 와 관련 된 방법:
  • startService(Intent intent):service 를 시작 합 니 다
  • stopService(Intent intent):서비스 정지만약 에 우리 가 service 중의 일부 데 이 터 를 사용 하거나 그 중의 일부 방법 을 방문 하려 면 다음 과 같은 방법 을 통 해
  • public boolean bindService(Intent intent, ServiceConnection conn, int flags) ;
  • public void unbindService(ServiceConnection conn);
  • intent 는 서비스 로 이동 하 는 intent 입 니 다.예 를 들 어 Intent intent=new Intent();intent.setClass(this,MyService.class);
    
    /** 
      *    service   。 
      * name    service      
      * service  service   onBund    IBinder,            
      */ 
     @Override 
     public void onServiceConnected(ComponentName name, IBinder service) { 
      Log.i("  ", "    !"); 
      MyBinder binder = (MyBinder)service; 
      MyService myService = binder.getMyService(); 
      int count = myService.getCount(); 
      Log.i("  ", "count="+count); 
       
     } 
    
       
    서비스 사용 절차:
    STEP 1:우 리 는 service 류 를 계승 하여 자신의 service 를 실현 해 야 한다.
    service 의 일부 값 에 접근 하려 면 Binder 를 계승 한 내부 클래스 를 제공 합 니 다.onBund()방법 을 통 해 service 요청 에 되 돌려 줍 니 다.이곳 은 실제 적 으로 내부 류 가 외부 류 속성 에 접근 할 수 있 는 특징 을 교묘 하 게 이용 했다.        
    두 번 째 단계:android Manifest.xml 에 등록 합 니 다.예 를 들 어:
    
    <!-- 
     service    
     -->
     <service android:name="MyService"></service>
    <!-- 
     service    
     -->
    
    
    세 번 째 단계:activity 에서 시작,바 인 딩,해제 또는 서 비 스 를 중단 합 니 다.
    (많은 책 에서 서비스 와 사용 자 는 상호작용 을 할 수 없다 고 하 는데 사실은 이 말 이 정확 하지 않 습 니 다.우 리 는 activity 와 서 비 스 를 통 해 상호작용 을 할 수 있 잖 아 요!나 는 확실한 설 은 서비스 와 사용자 가 직접적인 상호작용 을 할 수 없다 는 것 이 라 고 생각한다.
    예시
    다음은 service 를 호출 하여 음악 을 듣 는 예 를 제공 합 니 다.
    activity 코드:
    
    package cn.com.chenzheng_java; 
     
    import cn.com.chenzheng_java.MyService.MyBinder; 
    import android.app.Activity; 
    import android.content.ComponentName; 
    import android.content.Intent; 
    import android.content.ServiceConnection; 
    import android.os.Bundle; 
    import android.os.IBinder; 
    import android.util.Log; 
    import android.view.View; 
    import android.view.View.OnClickListener; 
    import android.widget.Button; 
    /** 
     * @description  service        
     */ 
    public class ServiceActivity extends Activity implements OnClickListener{ 
     private Button button_start ; 
     private Button button_bind ; 
     private Button button_destroy ; 
     private Button button_unbind; 
     
     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.service); 
       
      button_start = (Button) findViewById(R.id.button1_service); 
      button_bind = (Button) findViewById(R.id.button2_service); 
      button_destroy = (Button) findViewById(R.id.button3_service); 
      button_unbind = (Button) findViewById(R.id.button4_service); 
       
      button_start.setOnClickListener(this); 
      button_bind.setOnClickListener(this); 
      button_destroy.setOnClickListener(this); 
      button_unbind.setOnClickListener(this); 
       
     } 
     
     private class MyServiceConnection implements ServiceConnection{ 
     
      /** 
       *    service   。 
       * name    service      
       * service  service   onBund    IBinder,            
       */ 
      @Override 
      public void onServiceConnected(ComponentName name, IBinder service) { 
       Log.i("  ", "    !"); 
       MyBinder binder = (MyBinder)service; 
       MyService myService = binder.getMyService(); 
       int count = myService.getCount(); 
       Log.i("  ", "count="+count); 
        
      } 
     
      @Override 
      public void onServiceDisconnected(ComponentName name) { 
       Log.i("  ", "     !"); 
      } 
       
     } 
      
     private MyServiceConnection serviceConnection = new MyServiceConnection(); 
     @Override 
     public void onClick(View v) { 
      if(v == button_start){ 
       Intent intent = new Intent(); 
       intent.setClass(getApplicationContext(), MyService.class); 
       startService(intent); 
      } 
       
      if(v == button_bind){ 
       Intent intent = new Intent(); 
       intent.setClass(getApplicationContext(), MyService.class); 
       bindService(intent,serviceConnection , BIND_AUTO_CREATE); 
      } 
      if(v==button_destroy){ 
       Intent intent = new Intent(); 
       intent.setClass(getApplicationContext(), MyService.class); 
       stopService(intent); 
      } 
      if(v==button_unbind){ 
       unbindService(serviceConnection); 
      }   
       
     } 
      
    } 
    
    
    서 비 스 를 계승 하 는 클래스:
    
    package cn.com.chenzheng_java; 
     
    import android.app.Service; 
    import android.content.Intent; 
    import android.media.MediaPlayer; 
    import android.os.Binder; 
    import android.os.IBinder; 
    import android.util.Log; 
     
    /** 
     * @description      service 
     * @author chenzheng_java 
     * @since 2011/03/18 
     */ 
    public class MyService extends Service { 
     MediaPlayer mediaPlayer; 
     
     /** 
      *      bindService              IBinder  ,         , service            
      */ 
     @Override 
     public IBinder onBind(Intent intent) { 
      Log.i("  ", "service    !"); 
      return new MyBinder(); 
     } 
     
     @Override 
     public void onCreate() { 
      Log.i("  ", "service    !"); 
     
      mediaPlayer = MediaPlayer.create(this, R.raw.aiweier); 
      mediaPlayer.setLooping(false); 
      super.onCreate(); 
     } 
     
     @Override 
     public void onDestroy() { 
      mediaPlayer.stop(); 
      Log.i("  ", "service    !"); 
      super.onDestroy(); 
     } 
     
     @Override 
     public void onRebind(Intent intent) { 
      Log.i("  ", "service      !"); 
      super.onRebind(intent); 
     } 
     
     @Override 
     public void onStart(Intent intent, int startId) { 
      mediaPlayer.start(); 
      Log.i("  ", "service start  !"); 
      super.onStart(intent, startId); 
     } 
     
     @Override 
     public boolean onUnbind(Intent intent) { 
      mediaPlayer.stop(); 
      Log.i("  ", "service    !"); 
      return super.onUnbind(intent); 
     } 
     
     private int count = 100; 
     
     public int getCount() { 
      return count; 
     } 
     
     public void setCount(int count) { 
      this.count = count; 
     } 
     
     public class MyBinder extends Binder { 
      /** 
       * @return        service   
       */ 
      MyService getMyService() { 
       return MyService.this; 
      } 
     } 
     
    } 
    
    
    service.xml 코드:
    
    <?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 
     <Button android:text="  " android:id="@+id/button1_service" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> 
     <Button android:text="  " android:id="@+id/button2_service" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> 
     <Button android:text="  " android:id="@+id/button3_service" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> 
     <Button android:text="  " android:id="@+id/button4_service" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> 
    </LinearLayout> 
    
    
    androidManifest.xml
    
    <?xml version="1.0" encoding="utf-8"?> 
    <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
      package="cn.com.chenzheng_java" 
      android:versionCode="1" 
      android:versionName="1.0"> 
     <uses-sdk android:minSdkVersion="8" /> 
     
     <application android:icon="@drawable/icon" android:label="@string/app_name"> 
      <activity android:name="ServiceActivity" 
         android:label="@string/app_name"> 
       <intent-filter> 
        <action android:name="android.intent.action.MAIN" /> 
        <category android:name="android.intent.category.LAUNCHER" /> 
       </intent-filter> 
      </activity> 
    <!-- 
     service     
     --> 
     <service android:name="MyService"></service> 
    <!-- 
     service     
     --> 
     </application> 
     </manifest> 
    
      
    최종 효과 도:
    2016411141629351.gif (348×195)

    좋은 웹페이지 즐겨찾기