명시 적 대 암시 적 인 텐트를 사용한 안드로이드 서비스 시작

표준 Android 설명서에 따르면 서비스를 시작하는 방법 (시작된 서비스)은 다음과 같은 명시적인 의도를 사용하는 것입니다.

// Using explicit intent:
Intent serviceIntent = new Intent(getApplicationContext(), MyService.class);
// or:
Intent serviceIntent = new Intent(this, MyService.class);
startService(serviceIntent);

다음과 같이 매니페스트에 지정된 동작 문자열을 사용하여 암시 적 인 텐트를 사용하여 서비스를 시작 / 중지 할 수도 있습니다.

// Using implicit intent:
static final String serviceAction = "com.example.my.app.services.MYSERVICE";
Intent serviceIntent = new Intent(serviceAction);
startService(serviceIntent);

// AndroidManifest.xml:
<service android:name="com.example.my.app.services.MyService"
   android:exported="false" android:process=":services" >
   <intent-filter>
      <!-- Start/Stop service -->
      <action android:name="com.example.my.app.services.MYSERVICE" />
   </intent-filter>
</service>

서비스가 로컬에서만 사용되는 경우 (타사 응용 프로그램을 시작하거나 바인딩 할 수 없음) 설명서에 매니페스트 서비스 태그에 인 텐트 필터를 포함해서는 안되며 내 보낸 태그를 false로 설정해야합니다.

참고 : 활동 및 서비스는 별도의 프로세스 (: 응용 프로그램 및 : 서비스 프로세스)에서 실행됩니다. 액티비티와 서비스 간의 통신은 AIDL 인터페이스를 구현함으로써 수행됩니다 (AIDL 원격 인터페이스만으로도 활동 사이 에서뿐만 아니라 다음에서 실행되는 서비스 사이에서 IPC를 동시에 처리해야하는 서비스 내에서 멀티 스레딩을 할 수 있기 때문에 수행됩니다. 서비스 프로세스).

내 질문은 다음과 같습니다.

Q1 : 앱에서 사용하는 활동과 서비스가 서로 다른 두 가지 프로세스로 실행될 때 서비스를 시작하고 중지하기 위해 명시적인 의도를 통해 암시 적 인 텐트를 사용해야합니까?

질문 2 : : 응용 프로그램 프로세스가 사라지고 (메모리가 아닌) 파괴되고 : : 서비스 프로세스가 백그라운드에서 실행 중일 때 새로운 응용 프로그램 프로세스에서 이미 실행중인 : 서비스 프로세스로 다시 연결하려면 어떻게해야합니까? 어떻게 든 나는 the : services 프로세스에 대한 참조를 다시 얻어서 그 프로세스 내에서 실행중인 서비스를 멈출 수 있어야한다. 이것은 AIDL afaik를 사용하여 수행 할 수 없습니다.

문제는 안드로이드는 자원이 부족할 때 : 애플리케이션 프로세스를 쉽게 파괴 할 수 있으며, 서비스 프로세스가 계속 실행되는 한 괜찮습니다.
(예, 서비스를 전경 서비스로 설정하여 프로세스에 영향을 줄 수 있음을 알고 있습니다. 나도 설명서를 읽을 수 있지만 그게 내 문제는 아닙니다.)

활동과 서비스가 분리 된 프로세스에 있고 AIDL을 사용할 때 내 질문과 관련된 정보 나 답변을 찾을 수 없으며 응용 프로그램 프로세스가 Android 프로세스에 의해 사망 ​​한 후 또는 서비스 프로세스가 “발견”되어야 할 때 사용자가 앱을 다시 시작합니다 (이전에 앱을 떠난 후).

모든 전문가 수준의 조언을 환영합니다.

우수 답변
A1 : 귀하의 활동과 서비스가 다른 프로세스에서 실행 되더라도 여전히 동일한 애플리케이션에 속합니다. 당신은 여전히 ​​명시 적 의도를 사용할 수 있습니다. 암묵적인 의도를 사용하여 어떤 이점도 보지 못합니다. (어떤 것이 있으면 알려주십시오 :))

A2 : 여기에 몇 가지 사실을 적어 보겠습니다.

> “Bind”서비스가 아닌 “Started”서비스의 수명주기는이 서비스를 시작한 Activity의 수명주기와 별개입니다. 날씨가 둘 다 동일 프로세스 또는 다른 프로세스에서 실행중인 경우에도 마찬가지입니다.
> 어느 시점에서든 하나의 서비스 인스턴스 만 살아납니다. 당신의 액티비티가 startService ()를 호출 할 때, 서비스 인스턴스가 아직 실행되지 않았다면 생성 될 것입니다.이 경우 서비스는 onCreate () 콜백을받습니다. 그러나 Service가 이미 실행중인 경우 프레임 워크는 이미 실행중인 프로세스 (이 경우에는 onCreate () 콜백 없음)에서 onStartCommand () 콜백을 호출하기 만하면됩니다. 다시 이것은 활동과 관계없이 사실이며 서비스는 동일한 프로세스 또는 다른 프로세스에서 실행됩니다.

이제 귀하의 질문에 대답하기 위해 서비스가 여전히 실행 중이면 (이전 활동에 의해 startService () 호출로 인해) bindService () / startService ()가 기존 서비스에 연결하는지 확인합니다.

희망이 당신에게 도움이 되길 바랍니다. 다른 특정 질문이 있으면 알려주십시오.

원본 텍스트를 나타내십시오:명시 적 대 암시 적 인 텐트를 사용한 안드로이드 서비스 시작 - 코드 로그