십시오 : 안드로이드 startService 사용 및 서비스 라이프 사이클에

방법 컨텍스트 startService를 호출하여, 서비스를 사용하거나 bindService에게 상황에 맞는 방법을 호출하는 두 가지 방법이 있습니다 안드로이드, 우리는 어떤 경우 bindService 메서드 호출을 포함하지 않는 순수한 startService의 사용을 조사 . 당신은, bindService 관련 사용을 알고보고 싶다면 "bindService 사용 안드로이드 및 서비스 라이프 사이클을" .

우리는 상황에 맞는 방법을 호출하여 startService 때, 우리는 항상 무기한 실행되는 서비스 startService 방법에 의해 시작된 서비스를 시작, stopService 단지 내부 또는 외부 전화 서비스는 서비스의 stopSelf 방법 서비스 컨텍스트를 호출 그것은 실행하고 파괴 중지됩니다.

서비스를 이용하기 위해, 우리는 서비스에서 상속해야하고, 다음과 같이 재 작성 :
에서 onCreate, onStartCommand, onBind 및들의 OnDestroy.

이러한 방법은 콜백 방법이 적절한 시간에 안드로이드 운영 체제에 의해 호출되며, 이러한 콜백 메소드가 메인 쓰레드에서 호출되는 점에 유의한다.

에서 onCreate : 서비스 콜백 방식의 서비스에서 onCreate를 생성하고 실행할 때 서비스가 실행되고 있지 않은 경우 startService 실행 방법, 서비스가 이미 진행되고 있다면, 실행 startService 방법에있어서의 서비스에서 onCreate한다. 이 방법은 반복적 방법 서비스에서 onCreate 시작 startService 컨텍스트를 수행 한 경우, 서비스 방법은 먼저 한 번 서비스를 만들 때만 호출되고 다시 호출되지 않습니다. 우리는에서 onCreate 메서드에서 일부 초기화 서비스 관련 작업을 할 수 있습니다.

onStartCommand : startService 방법을 실행 한 후에는 onStartCommand 콜백 메소드 서비스를 수행 후 서비스의 방법을에서 onCreate 호출 할 수 있습니다. startService 방법 컨텍스트 반복적으로 수행하는 경우 즉, 다음 onStartCommand 서비스는 여러 전화의 대응하는 방법이 될 것이다. onStartCommand 방법은 스레드가 데이터를 다운로드하거나 음악을 재생하기 위해 여기에 작성 등 우리가 들어오는 의도 매개 변수에 따른 방법에서 실제 작업을 수행하는 것이 매우 중요합니다.

onBind : 서비스 onBind 방법은 추상적 인 방법, 서비스 클래스 자체는 우리가 아무 소용이없는 경우에도, onBind 방법 오버라이드 (override) 할 수 있어야합니다 추상 클래스입니다. 우리가 방법을 onBind 재 작성하고, null로 반환 될 필요가있을 때 startService에 의한 서비스를 사용하는 경우. 주로 bindService에 사용되는 onBind 방법은 때 메소드 호출 서비스를 사용합니다.

들의 OnDestroy : 서비스의 경우에만 통화 stopService 컨텍스트, 무기한 실행됩니다 startService 방법 서비스에서 시작하거나 파괴가 서비스 콜백 기능을 수행 할 때 서비스, 파괴 실행을 중지 할 것, 내부 stopSelf 메소드를 호출합니다.

우리는 각 콜백 메소드의 기능에 대한 위의 설명을 확인하기 위해 startService의 방법으로 수명주기 서비스를 탐험하기 시작했다, 나는 테스트 케이스에 다음을 썼다.
첫째, 서비스 클래스 TestService를 만들 클래스 서비스, 다음 코드에서 상속 :

package com.ispring.startservicedemo;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

public class TestService extends Service {

    @Override
    public void onCreate() {
        Log.i("DemoLog","TestService -> onCreate, Thread ID: " + Thread.currentThread().getId());
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i("DemoLog", "TestService -> onStartCommand, startId: " + startId + ", Thread ID: " + Thread.currentThread().getId());
        return START_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {
        Log.i("DemoLog", "TestService -> onBind, Thread ID: " + Thread.currentThread().getId());
        return null;
    }

    @Override
    public void onDestroy() {
        Log.i("DemoLog", "TestService -> onDestroy, Thread ID: " + Thread.currentThread().getId());
        super.onDestroy();
    }
}
  
  
  • 1
  • 4
  • 5
  • 6
  • (7)
  • 8
  • 9
  • (10)
  • (11)
  • (12)
  • (13)
  • (14)
  • (15)
  • (16)
  • (17)
  • (18)
  • (19)
  • (20)
  • (21)
  • (22)
  • (23)
  • (24)
  • (25)
  • (26)
  • (27)
  • (28)
  • (29)
  • (30)
  • (31)
  • (32)
  • (33)

우리는 단순히 해당 정보의 각 콜백 메소드 TestService 인쇄, 복잡한 처리 작업을 많이하지 않았다.

그런 다음 우리는 활동의 Serivce 전화를 다음과 같이 해당 코드의 활동은 다음과 같습니다

package com.ispring.startservicedemo;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;


public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Log.i("DemoLog", "Thread ID: " + Thread.currentThread().getId());

        Log.i("DemoLog", "before test startService");

        //连续启动Service
        Intent intent1 = new Intent(this, TestService.class);
        startService(intent1);
        Intent intent2 = new Intent(this, TestService.class);
        startService(intent2);
        Intent intent3 = new Intent(this, TestService.class);
        startService(intent3);

        //停止Service
        Intent intent4 = new Intent(this, TestService.class);
        stopService(intent4);

        //再次启动Service
        Intent intent5 = new Intent(this, TestService.class);
        startService(intent5);

        Log.i("DemoLog", "after test startService");
    }
}
  
  
  • 1
  • 4
  • 5
  • 6
  • (7)
  • 8
  • 9
  • (10)
  • (11)
  • (12)
  • (13)
  • (14)
  • (15)
  • (16)
  • (17)
  • (18)
  • (19)
  • (20)
  • (21)
  • (22)
  • (23)
  • (24)
  • (25)
  • (26)
  • (27)
  • (28)
  • (29)
  • (30)
  • (31)
  • (32)
  • (33)
  • (34)
  • (35)
  • (36)
  • (37)
  • (38)

우리의 처음 세 개의 연속 호출 startService 방법에서 활동 서비스 활동을 시작, 다음 방법 활동 stopService 정지 서비스를 호출 한 다음 startService 방법의 활동을 호출하여 서비스를 시작합니다.

다음과 같이 프로그램을 실행의 출력은 다음과 같습니다 :
여기에 설명 된 사진을 쓰기

우리는 메인 스레드의 ID 1의 위, 당신은 첫 번째 인쇄의 출력을 분석, 우리는 모든 ID 뒤에 스레드를 실행하는 콜백 함수에 인쇄 찾을 개인이 콜백 메소드 서비스임을 나타내는, 1 메인 스레드에서 실행됩니다. 우리가 행 startService 방법에 세 번 호출 후 두 번째로, 우리가 볼 수 있습니다 만 우리가 startService 텐트 오브젝트에 의해 수신 방법을 읽을 수 onStartCommand에서, 세 onStartCommand 방법을 트리거하고,이 세 번, 콜백 메소드에서 onCreate를 트리거 startID가 상이하고, 1, 2, 각각의 호출은 자동으로 각 후속 호출 startService startID가 후 startService startID가이 startID가 호출이 다른 startService를 구별하는 데 사용할 수는 일반적으로 1에서 startID가 번호가 할당되어있는 하나 개 증가로 증가.

우리는 우리가 서비스 방법들의 OnDestroy 수행 찾을 출력을 통해 서비스를 중지하려면 (intent4) 방법의 stopService 활동을 호출 한 후, 정상적인 상황에서 우리들의 OnDestroy 리소스 해제 방법에 몇 가지 작업을 수행 할 수 있습니다. 들의 OnDestroy의 서비스의 인스턴스를 실행 한 후 파괴. 비록 startService 방법은 우리 앞에 세 번 호출하지만, 한 당신은 서비스를 실행 한 통화 stopService를 중지하고 파괴 할 수있다.

우리가 다시 한 번 startService에 의해 (intent5) 서비스 시작이, 출력을 통해 우리가 stopService에 의해 파괴 후 서비스를 나타내는 방법에서 onCreate 서비스의 다시 한번 구현, 찾을 때 마지막으로, 재를 만들어, 이후 startID가에서 다시 콜백 방법은 onStartCommand 다시 호출하고, 하나는 계산을 시작합니다.

마지막으로, 우리가 처음에 활동 서비스에서 작동 있습니다 각각의 출력 코드의 끝은 몇 단어를 쓰기

Log.i("DemoLog", "before test startService");
  
  
  • 1

Log.i("DemoLog", "after test startService");
  
  
  • 1

그러나 찾을 수의 출력을 살펴 보자, 출력에 직접 프로그램 테스트 startService 전 이후, 그러나 즉시 출력 테스트 startService 후 ,이 후 각 콜백 메소드의 내부 출력 TestService을 나타내는입니다 startService () 메소드와 stopService () 메소드는 즉시 실행 후 반환,이 두 가지 방법이 차단되지되는, startService (), stopService () 안드로이드 프레임 워크 의도 객체로 전송되는 비동기 작업있는 서비스를 시작하고 서비스를 중지, 프레임 워크 레이어 다음 비동기 시작은 서비스를 중지합니다.

우리는 라이프 사이클 서비스의 startService 시작으로 요약 다이어그램을 사용합니다 :
여기에 설명 된 사진을 쓰기

안드로이드는 메모리 부족이 현재 실행중인 다음 충분히 당신이 서비스를 다시 만들 때 메모리로 서비스를 파괴 할 수 직면 행동, 서비스를 다시 안드로이드 시스템의 힘은 파괴와 재건입니다 onStartCommand 메소드의 반환 값의 서비스에 따라 달라집니다. 우리는 반환 값이 세 가지 값, START_NOT_STICKY, START_STICKY 및 START_REDELIVER_INTENT을 가지고 사용,이 세 값은 서비스 정적 상수입니다.

START_NOT_STICKY: 如果返回START_NOT_STICKY,表示当Service运行的进程被Android系统强制杀掉之后,不会重新创建该Service,当然如果在其被杀掉之后一段时间又调用了startService,那么该Service又将被实例化。那什么情境下返回该值比较恰当呢?如果我们某个Service执行的工作被中断几次无关紧要或者对Android内存紧张的情况下需要被杀掉且不会立即重新创建这种行为也可接受,那么我们便可将 onStartCommand的返回值设置为START_NOT_STICKY。举个例子,某个Service需要定时从服务器获取最新数据:通过一个定时器每隔指定的N分钟让定时器启动Service去获取服务端的最新数据。当执行到Service的onStartCommand时,在该方法内再规划一个N分钟后的定时器用于再次启动该Service并开辟一个新的线程去执行网络操作。假设Service在从服务器获取最新数据的过程中被Android系统强制杀掉,Service不会再重新创建,这也没关系,因为再过N分钟定时器就会再次启动该Service并重新获取数据。

START_STICKY: 如果返回START_STICKY,表示Service运行的进程被Android系统强制杀掉之后,Android系统会将该Service依然设置为started状态(即运行状态),但是不再保存onStartCommand方法传入的intent对象,然后Android系统会尝试再次重新创建该Service,并执行onStartCommand回调方法,但是onStartCommand回调方法的Intent参数为null,也就是onStartCommand方法虽然会执行但是获取不到intent信息。如果你的Service可以在任意时刻运行或结束都没什么问题,而且不需要intent信息,那么就可以在onStartCommand方法中返回START_STICKY,比如一个用来播放背景音乐功能的Service就适合返回该值。

START_REDELIVER_INTENT는 : 리턴 START_REDELIVER_INTENT 후, 죽일 강제로 안드로이드 시스템을 실행하는 서비스 프로세스를 나타내며, 상황이 반환 START_STICKY와 유사한 경우, 안드로이드 시스템은 다시 한 번 서비스를 다시 작성하고 onStartCommand 콜백 방법을 수행하지만, 차이는 안드로이드 시스템 것입니다 텐트에 전달되기 전에 최후의 수단으로 다시 onStartCommand 서비스를 다시 보존 방법 서비스에 onStartCommand 경과 죽이고 다시 만들어 우리가 의도 매개 변수를 읽을 수 있도록, 다시. 만큼 반환 START_REDELIVER_INTENT로, 다음 onStartCommand 의도의 무게는 확실히 널 (null)이 아닙니다. 우리가 실행하는 서비스 특정 의도에 의존해야하는 경우 (의도 관련 정보 등의 데이터를 읽을 필요), 그리고 이후에 실행 강제로 파괴 다시 만든 다음 같은 서비스 START_REDELIVER_INTENT을 위해 반환하는 것이 필요하다.

관련 보웬 :
안드로이드 배경 음악 간단한 예를 startService 재생하여
startService를 달성하기 위해 샘플 배치를 다운로드하여 안드로이드

전달 : HTTPS : //blog.csdn.net/iispring/article/details/47689819

추천

출처blog.csdn.net/qq_26369907/article/details/93491727