서비스 첫 경험


이 섹션 소개

좋아요, 우리는 처음 세 섹션에서 Android의 활동을 공부하고 공부했습니다. 많은 도움이 될 것이라고 믿습니다. 이 섹션의 시작 부분에서는 Android의 두 번째 구성 요소인 서비스(Service), 좋아요, 더 이상 고민하지 말고 이 섹션을 시작하겠습니다!


1. 쓰레드 관련 개념

서비스를 배우기에 앞서 먼저 쓰레드의 몇 가지 개념을 알아볼까요?

1) 관련 개념:

  • Program: 특정 작업
  • Process
  • 을 완료하기 위해 특정 언어로 작성된 지침 세트(정적 코드 세트): 실행 중인 프로그램 , 시스템 스케줄링 및 자원 할당의 독립적인 단위인 운영 체제는 각 프로세스에 메모리 공간을 할당하세요! 프로그램은 동적으로 순차적으로 실행되어 코드 로딩 및 실행을 경험합니다. 전체 프로세스가 실행되었습니다!
  • Thread: 프로세스보다 작은 실행 단위입니다. 각 프로세스에는 여러 스레드가 있을 수 있습니다. 스레드를 실행하려면 프로세스에 배치해야 하고 프로세스는 프로그램에 의해 관리됩니다. 시스템 일정!
  • 멀티스레딩 이해
  • : 여러 명령을 병렬로 실행하고 스케줄링 알고리즘에 따라 각각에 CPU 시간 조각을 할당합니다. 스레드는 실제로 시간 공유로 실행되지만 전환 시간이 매우 짧아서 사용자는 "동시에"라는 느낌을 받습니다!
2) 스레드 수명 주기:

1.png

3) 스레드를 생성하는 세 가지 방법:

    Thread 클래스 상속
  1. 실행 가능한 인터페이스
  2. Callable 인터페이스 구현
  3. 2에서 만든 스레드를 사용하는 경우 다음과 같이 직접 시작할 수 있습니다:
    new Thread(myThread).start();
    . 더 자주 우리는 다음과 같은 작성 방법인 익명 클래스를 사용하는 것을 좋아합니다:
    new Thread(new Runnable(){
         public void run();
             }).start();
2. 서비스 쓰레드와 쓰레드 쓰레드의 차이점

사실 둘 사이에는 별 관계가 없지만, 많은 친구들이 둘을 혼동하는 경우가 많습니다! 스레드는 프로그램 실행의 최소 단위이자 CPU 할당의 기본 단위인 스레드입니다! 서비스는 오랫동안 백그라운드에 머물 수 있도록 Android에서 제공하는 구성 요소입니다. 사용법은 폴링 작업을 수행하는 것입니다! 또는 백그라운드에서 업데이트를 다운로드하는 등 백그라운드에서 작업을 수행하고 싶을 수도 있습니다! 이 두 개념을 혼동하지 마십시오!

3. 서비스 라이프사이클 다이어그램

2.png

4. 라이프사이클 분석

자, 위 그림의 라이프사이클을 보면 안드로이드에서 서비스를 사용하는 방법에는 두 가지가 있다는 것을 알 수 있습니다.

1)StartService()가 서비스를 시작합니다
2)BindService()가 서비스를 시작합니다
PS: 서비스를 시작한 후 서비스를 바인딩하는 또 다른 방법이 있습니다!


1) 관련 메소드 상세 설명 :

  • onCreate() : 서비스가 처음 생성된 직후 바로 호출되며, Life Cycle 전체에서 사용되는 메소드이다. 순서대로만 호출됩니다!
  • onDestory(): 이 메소드는 서비스가 종료될 때 다시 호출됩니다. 이 메소드는 한 번만 호출됩니다.
  • onStartCommand(intent,flag,startId): 초기 버전은 onStart(intent,startId)입니다. 클라이언트가 startService(Intent) 메서드를 호출하면 다시 호출됩니다. StartService 메서드는 여러 번 호출될 수 있습니다. 그러나 새로운 서비스 객체는 생성되지 않지만 이전에 생성된 서비스 객체는 계속 재사용되지만 콜백은 계속됩니다. onStartCommand() 메소드!
  • IBinder onOnbind(intent): 이 메서드는 서비스에서 구현해야 하는 메서드입니다. IBinder 개체인 경우 앱은 이 개체를 통해 서비스 구성 요소와 통신합니다!
  • onUnbind(intent): 이 메서드는 서비스에 바인딩된 모든 클라이언트의 연결이 끊어지면 다시 호출됩니다!

2) StartService가 Service를 시작합니다

첫 번째 시작에서는 Service 인스턴스를 생성하고 onCreate() 및 onStartCommand() 메서드를 차례로 호출합니다. 실행 상태로 들어가면 StartService를 다시 호출하여 서비스를 시작하면 새 서비스 개체가 생성되지 않습니다. 시스템은 이전에 생성된 서비스 개체를 직접 재사용하고 해당 개체의 onStartCommand() 메서드를 호출합니다!
그러나 이러한 서비스는 호출자와 필요한 연결이 없습니다. 즉, 호출자가 수명 주기를 종료하면 하지만 stopService가 호출되지 않는 한 서비스는 계속 실행됩니다.
3서비스가 몇 번 시작되더라도 StopService를 한 번만 호출하면 서비스가 중지됩니다


3) BindService가 서비스를 시작합니다

bindService가 서비스를 바인딩하기 위해 처음으로 사용되면 시스템은 서비스 인스턴스를 인스턴스화하고 해당 인스턴스의 onCreate() 및 onBind() 메서드를 호출한 다음 호출자를 호출합니다. IBinder와 Service가 상호 작용할 수 있습니까? BindService를 사용하여 Service를 다시 바인딩하면 시스템은 새 Service 인스턴스를 생성하지 않으며 onBind() 메서드도 나중에 추가된 다른 클라이언트에만 직접 전달합니다.
서비스에서 바인딩을 해제하려면 unbindService()만 호출하면 됩니다. 이때 onUnbind 및 onDestory 메서드가 호출됩니다. 이는 여러 클라이언트가 동일한 서비스에 바인딩된 경우입니다. 상황은 다음과 같습니다 클라이언트는 서비스와의 상호 작용을 완료하면 unbindService() 메서드를 호출하여 바인딩을 해제합니다. 모든 클라이언트가 서비스에서 바인딩 해제되면 시스템은 서비스를 삭제합니다. (startService() 메소드에 의해서도 서비스가 시작되지 않는 한)
3그리고 위의 상황과 달리,bindService 모드의 서비스는 호출자와 관련되어 있으며 이는 다음과 같이 이해될 수 있습니다. "밧줄 위의 메뚜기", 그들은 함께 죽습니다.bindService 이후 호출자가 파괴되면 서비스가 즉시 종료됩니다!
BindService를 통해 서비스를 호출할 때 호출되는 Context의 bindService 분석bindService(Intent Service, ServiceConnection conn , int 플래그)
service: 이 인텐트를 통해 시작될 서비스를 지정합니다.
conn: ServiceConnection 개체, 사용자는 방문자와 서비스 간의 연결을 모니터링합니다. 연결이 성공하면 객체의 onServiceConnected(ComponentName,IBinder) 메서드가 다시 호출됩니다. 서비스가 위치한 호스트가 비정상적인 종료 또는 기타 사유로 인해 종료되는 경우 방문자와의 서비스 연결이 끊어집니다. 연결 시 onServiceDisconnected(CompanentName) 메서드를 호출하고 unBindService() 메서드를 통해 적극적으로 연결을 끊으면 위 메서드가 호출되지 않습니다!
flags:바인딩 시 Service를 자동으로 생성할지 여부를 지정합니다(서비스가 아직 생성되지 않았습니다) , 매개변수는 0(자동 생성 없음), BIND_AUTO_CREATE(자동 생성)일 수 있습니다


4) StartService가 서비스를 시작한 후에는 BindService가 바인딩됩니다.

StartService()를 통해 클라이언트에 의해 서비스가 시작된 경우 다른 클라이언트에 의해 시작됩니다. 그런 다음 서비스에 바인딩하기 위해 서비스 바인딩 서비스()를 호출하고 바인딩을 해제하기 위해 unbindService()를 호출한 다음 마지막으로 서비스에 바인딩하기 위해 BindService()를 호출하는 경우 이때 트리거되는 라이프 사이클 메서드는 다음과 같습니다.
onCreate( )->onStartCommand( )->onBind( )->onUnbind( )->onRebind ( )
PS: 전제는 다음과 같습니다. onUnbind() 메서드는 true를 반환합니다!!! 일부 독자들은 여기서 unbindService를 호출한 후에 Service를 호출하면 안 되는지 의문을 가질 수 있습니다. onDistory() 메소드는 사실 이 서비스가 StartService에 의해 시작되기 때문입니다. , 따라서 바인딩을 해제하기 위해 onUnbind() 메서드를 호출하면 서비스가 종료되지 않습니다!
결론: bindService를 사용하여 시작된 서비스를 바인딩하면 이미 시작된 서비스라는 점에 유의하세요!!! 시스템은 서비스의 내부 IBinder 객체만 활동에 전달하고 서비스의 수명 주기는 전송하지 않습니다. 이는 Activity에 바인딩되어 있으므로 unBindService() 메서드를 호출하여 바인딩을 해제해도 서비스는 삭제되지 않습니다.


5. 라이프 사이클 검증

다음으로 라이프 사이클을 검증하는 코드를 작성합니다.

1) 서비스를 시작하기 위해 StartService의 호출 순서를 검증합니다

먼저 서비스를 맞춤화하고 관련 메소드를 다시 작성합니다. logcat에서:

TestService1.java

public class TestService1 extends Service {
private final String TAG = "TestService1";
//구현해야 하는 메소드
@Override
public IBinder onBind(Intentintent) {
Log.i(TAG, "onBind 메소드가 호출됩니다. !");
return null;
}

//서비스가 생성될 때 호출됨
@Override
public void onCreate() {
                         reate 메소드가 호출됩니다!")
            super.on Create( ; d 메소드는 다음과 같습니다. 전화! ");;.;. onStartCommand (의도, 플래그, startId);
}







// 서비스가 닫히기 전 콜백
@Override
public void ondestroy () {
log.i (tag,”스토리 메소드 호출됩니다!");
            super.onDestroy();
}
}

AndroidManifest.xml 서비스 등록 완료


<!-- 서비스 구성요소 구성과 동시에 작업 구성 -->
<service android:name=".TestService1"> ICE1"/> ㅋㅋㅋ                                          클릭 이벤트에서 startService( ) 및 stopService( )가 각각 호출됩니다! 
  @Override  
  protected  void onCreate(Bundle saveInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

start = (버튼) findViewById(R.id.btnstart)
stop = (버튼) findViewById(R.id.bt nstop); 의도 및 의도 속성
                                                    사용     ‐     ‐ ‐ ‐ 최종 의도                                                                                      의 ’ s ’ s ‐ ‐ ‐ 및 ‐를 사용하여 서비스
       start.setOnClickListener를 사용합니다. (새로운 OnClickListener()                                                                            startService(의도) ;                          }  
        });  ㅋㅋㅋ        stopService(의도);  
                
           }  
        });  
    }  
}


작업 스크린샷:

3.jpg

클릭하여 서비스 시작:

4.jpg

아무 것도 없습니다. 몇 번 더 클릭하세요.

5.jpg

마지막으로 클릭하여 서비스를 중지합니다.

6.jpg

결과 분석:

위의 실행 결과에서 수명 주기 다이어그램에 설명된 내용을 확인할 수 있습니다. 또한 onBind() 메서드가 호출되지 않았으며 서비스를 여러 번 시작하면 onStartCommand만 반복적으로 호출된다는 사실을 발견했습니다. 방법! 서비스를 몇 번 시작해도 stopService는 서비스를 중지합니다!


2) BindService가 서비스를 시작하는 순서를 확인하세요.

코드 작성을 시작하기 전에 먼저 몇 가지 사항을 이해해야 합니다. 첫 번째는 첫 번째 큰 그림 아래에 제공된 Context의 BindService 메서드입니다.

  • ServiceConnection 개체: 방문자와 서비스 간의 연결을 모니터링합니다. 연결이 성공하면 콜백합니다. onServiceConnected(), 비정상적인 종료 또는 기타 사유로 인해 방문자와의 서비스 연결이 끊어지는 경우 연결되면 onServiceDisconnected 메서드가 다시 호출됩니다. unBindService()를 호출하면 이 메서드가 호출되지 않습니다.
  • onServiceConnected 메서드에는 바인딩된 서비스를 구현할 수 있는 IBinder 개체가 있습니다. Service 클래스를 개발할 때 기본적으로 IBinder onBind() 메서드를 구현해야 합니다. IBinder 객체는 ServiceConnection 객체의 onServiceConnected 매개변수로 전달되며 다음을 수행할 수 있습니다. 여기에서 이 IBinder를 통해 서비스와 통신하세요!

요약:
1단계:사용자 정의 서비스에서 Binder를 상속하고 자체 IBinder 개체를 구현합니다.
2단계:onBind() 메서드를 통해 반환 IBinder 개체
3단계:서비스를 바인딩하는 클래스에서 ServiceConnection 개체를 정의하고 두 가지 메서드를 재정의합니다. onServiceConnected 및 onDisconnected! 그런 다음 IBinder가 직접 전달한 매개변수를 읽으세요.

좋아요. 다음 단계는 확인을 위한 코드를 작성하는 것입니다. 그럼 BindService의 사용법과 메소드 호출 과정을 보여드리겠습니다! 코드는 비교적 간단하므로 설명하지 않겠습니다.

TestService2.java:

public class TestService2 extends Service {
private final String TAG = "TestService2";
private int count; private boolean quit;

//onBinder 메소드에서 반환된 개체 정의
private MyBinder 바인더 = new MyBinder(); Public Class MyBinder EXTENDS BINDER {
Public Int GetCount () {
Return Count C iBinder Onbind (Intent Intent ) {
       Log.i(TAG, "onBind 메소드가 호출되었습니다!");                                                                      Create() {
        super.onCreate( ); T LOG.I (태그, "Oncreate 메소드가 호출되었습니다!")
// Count 값을 동적으로 수정하는 스레드 생성
new thread () {
public void run () {
awile (! Quit) ㅋㅋㅋ                                         {
                         Thread.sleep(1000)
                                                                                                           . Time -back@@Override
Public Boolean Onbind(인텐트 인텐트) {
Log.i(태그, "Onbind 메서드가 호출됩니다!");
공개 무효 onDestroy () {
super.ondestroy ();
this.quit = true;
log.i (태그, "onDestroyed 메소드가 호출되었습니다!") { T LOG.I (태그, "Onrebind 메소드가 호출되었습니다!"); super.onrebind(공격)
}}}

AndroidManifest에 서비스 구성요소를 등록합니다. name="com.jay.example.service.TEST_SERVICE2"/>                                   

MainActivity.java:

public class MainActivity extends Activity {

private Button btnbind;
private Button btnstatus;

//모든 것을 유지합니다. 시작된 서비스의 IBinder 개체는 ServiceConnection 개체도 정의합니다.
TestService2.MyBinder 바인더; ServiceConnection conn = new ServiceConnection() {
                                                                                                                                       System.out.println("------서비스 연결이 끊어졌습니다 --------------------- "); ("-- ----서비스 연결됨------");
                                                                          |                    le saveInstanceState) {
            super.onCreate(savedInstanceState )
setContentView(R.layout.activity_main)
btnbind = (버튼) findViewById(R.id.btnbind);
btnstatus = (버튼) findViewById(R.id.btnstatus);        최종 인텐트 인텐트 = 새 인텐트();  
        intent.setAction("com.jay.example.service.TEST_SERVICE2");  ㅋㅋㅋ绑정서비스  
               bindService(intent, conn, Service.BIND_AUTO_CREATE);                
           }  
        });  ㅋㅋㅋ |  ㅋㅋㅋ Toast.makeText(getApplicationContext(), "서비스 수의 개수:"  
+ 바인더.getCount(), Toast.LENGTH_SHORT).show();
                                                                                        

서비스를 잠그려면 클릭하세요:

7.jpg계속해서 잠금을 클릭하세요: 변경 없음

8.jpgGet 현재 서비스 상태:

9.jpgUnbind:

10.jpgIf we Tie again 설정 후 바로 Activity를 닫으면 오류가 보고됩니다. 그러면 onUnbind 및 onDestory 메소드가 자동으로 호출됩니다!

위의 실행 결과는 수명 주기 다이어그램에서 다음을 확인합니다.

11.jpgBindService를 사용하여 서비스를 바인딩하고 onCreate(), onBind() 메서드를 순서대로 호출합니다. onBind() 메소드에서 사용자 정의 IBinder 객체를 반환한 다음 호출할 수 있습니다. ServiceConnection의 onServiceConnected() 메소드는 이 메소드에서 얻을 수 있습니다. 관련 작업을 수행하는 IBinder 개체는 서비스 바인딩이 해제될 때 자동으로 호출됩니다. onUnbind 및 onDestroyed 메소드는 물론 여러 클라이언트가 바인딩된 경우 모두 차단을 해제해야 합니다. 바인딩은 파괴를 위해 onDestoryed 메소드를 호출합니다!