서비스 시작을위한 Android onCreate 또는 onStartCommand


105

일반적으로 Android 서비스를 만들 때 onCreate메서드를 구현 하지만 마지막 프로젝트에서는 작동하지 않습니다. 구현을 시도했는데 onStartCommand작동하는 것 같습니다.

문제는 서비스를 구현해야 할 때 어떤 방법이 필요한가요? 어떤 방법을 구현해야합니까? onCreate, onStartCommand또는 둘 다? 그리고 각각의 역할은 무엇입니까?


onCreate항상 상관없이 호출됩니다
IgorGanapolsky

답변:


189

onCreate()Service객체가 인스턴스화 될 때 호출됩니다 (예 : 서비스가 생성 될 때 ). 이 메서드에서 한 번만 수행해야하는 작업을 수행해야합니다 (예 : 일부 변수 초기화 등). 인스턴스화 된 객체 당onCreate() 한 번만 호출 됩니다.

onCreate()실제로 한 번만 초기화하고 싶거나 필요한 경우 에만 구현 하면 됩니다 .

onStartCommand()클라이언트가를 사용하여 서비스를 시작할 때마다 호출 됩니다startService(Intent intent) . 이것은 onStartCommand()여러 번 호출 될 수 있음을 의미합니다 . 클라이언트가 서비스에서 무언가를 요청할 때마다 필요한 작업을이 메서드 에서 수행해야합니다. 이는 서비스가 수행하는 작업과 클라이언트와 통신하는 방법 (또는 그 반대)에 따라 크게 달라집니다.

구현하지 않으면 클라이언트가 전달 onStartCommand()하는 정보를 얻을 수 없으며 서비스가 유용한 작업을 수행하지 못할 수 있습니다.IntentonStartCommand()


6
동일한 서비스의 두 인스턴스가 애플리케이션 내에 존재할 수 있습니까?
jacktrades 2013 년

1
@jacktrades 이론적으로 문서에 따르면 : 아니요. 그러나 Android에는 실제로 특정 상황에서 서비스의 여러 인스턴스를 생성하는 버그가있는 것 같습니다. 그러나 내가 말했듯이 이것은 버그이며 우리는 그것을 마음대로 안정적으로 재현 할 수 없었습니다. 왜 물어 보니?
David Wasser

3
@Mr_and_Mrs_D 내가 아는 한 공식적인 버그는보고되지 않았습니다. 그러나 이런 일이 발생했다는보고가 여러 개 있으며 그 상황을 알고있는 애플리케이션이 있습니다. 문제를 작고 반복 가능한 것으로 줄일 수 없었으므로 직접 버그를 신고하지 않았습니다. 문서는 서비스가 싱글 톤이라고 명시 적으로 설명하지 않지만 그것이 의도 한 바는 매우 분명합니다. 'startService ()'에 대한 문서를보십시오 . 서비스가 아직 실행 중이 아니면 서비스가 생성되고 시작되고 실행중인 경우 계속 실행된다는 것을 명시합니다
David Wasser 2013

6
@Diffy를 호출 할 때 startService()서비스가 실행되고 있지 않으면 Android는 서비스 클래스의 인스턴스 (서비스 개체)를 만든 다음 onCreate()해당 개체 를 호출 합니다. 그런 다음 onStartCommand()해당 개체 를 호출 합니다. 잠시 후 다시을 호출 startService()하면 서비스가 계속 실행 중이면 Android는 새 서비스 객체를 생성하지 않습니다. 대신 onStartCommand()기존 서비스 개체 만 호출 합니다. 분명합니까?
David Wasser 2014 년

1
사랑해! 마법 (Y)처럼 일 (y)는 매우 간단하고 좋은 설명
힐튼 Khadka

11

서비스는 활동과 동일하게 작동합니다. 서비스associate한 번 원하는 onCreate것은 초기화처럼 진행됩니다.

startService를service 사용 하여이 호출 될 때마다 . onStartCommand호출됩니다. 수행 할 모든 작업을 전달할 수 있습니다. 음악 플레이어와 같이 재생, 일시 중지, 작업 사용 중지

그리고 당신은 operation in service행동을 보내고 그것을 받음으로써 무엇이든 할 수 있습니다.onStartCommand

onCreate 생성자처럼 작동합니다.

짧게 편집

onCreate()를 다시 호출 할 때마다 ServiceWhereas onStartCommand()호출 을 처음 시작할 때만 호출 startService합니다. 음악 재생, 중지, 일시 중지와 같은 작업을 설정할 수 있습니다.

public void onStartCommand()
{
     if(intent.getAction.equals("any.play")
     {
        //play song
     }
     else if(intent.getAction.equals("any.stop")
     {}
}

그렇다면 startService (intent)를 사용하여 서비스를 호출하면 onCreate ()가 호출되지 않습니까? 나는 항상 startSevice (intent)에 의해 서비스를 시작했기 때문에 '서비스 객체'가 무엇인지 이해하지 못합니다.
Diffy

당신은 제대로 서비스 개체를 인스턴스화 한 또는 아마 당신은 당신의 매니페스트에 서비스가없는
AndroidGeek

startService (new Intent (this, ServiceName.class));
AndroidGeek 2014 년

그러나이 방법을 서비스 인스턴스화라고 부릅니까? 그러면 서비스 개체는 어디에 있습니까?
Diffy

인 텐트를 사용하여 Activity 및 Service를 호출하는 방법은 Android에서 Activity 및 Service를 여는 책임이 있습니다. 서비스 객체로하고 싶은 일을 의도적으로 할 수도 있습니다. 서비스에 데이터를 전달하는 것을 의미합니다
AndroidGeek 2014 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.