Intent와 PendingIntent의 차이점


97

나는 몇몇 기사를 읽었고 둘 다 똑같은 일을하는 것 같고 서비스를 시작하는 것의 차이점이 무엇인지 궁금합니다.

Intent intent = new Intent(this, HelloService.class);
startService(intent);

또는 그렇게 :

Calendar cal = Calendar.getInstance();
Intent intent = new Intent(this, MyService.class);
PendingIntent pintent = PendingIntent.getService(this, 0, intent, 0);
AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 30*1000, pintent); 

읽어 보았 듯이 서비스에서 START_STICKY 매개 변수를 반환하면이 두 가지가 동일한 작업을 수행합니다.


차이가 없습니다. 무엇이있을 것이라고 생각합니까? 첫 번째 경우에는 '지금'시작하고 두 번째 경우에는 나중에 시간 / 데이터를 예약하는 것입니다.
Squonk 2014-06-17

답변:


150

의지

Android 인 텐트는 인 텐트, 즉 한 구성 요소에서 애플리케이션 내부 또는 외부의 다른 구성 요소로 메시지를 전달하는 개체입니다. 인 텐트는 애플리케이션의 세 가지 핵심 구성 요소 인 활동, 서비스 및 BroadcastReceivers간에 메시지를 전달할 수 있습니다.

Intent 개체 인 의도 자체는 수동 데이터 구조입니다. 수행 할 작업에 대한 추상적 인 설명을 포함합니다.

예를 들어, 이메일 클라이언트를 시작하고 이메일을 보내야하는 활동이 있다고 가정합니다. 이를 위해 활동은 ACTION_SEND적절한 선택기와 함께 작업이 포함 된 인 텐트를 Android 인 텐트 리졸버로 보냅니다 .

Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:")); // only email apps should handle this

지정된 선택기는 사용자가 이메일 데이터를 보내는 방법을 선택할 수있는 적절한 인터페이스를 제공합니다.

명시 적 의도

// Explicit Intent by specifying its class name
   Intent i = new Intent(this, TargetActivity.class);
   i.putExtra("Key1", "ABC");
   i.putExtra("Key2", "123");

// Starts TargetActivity
   startActivity(i);

암시 적 의도

// Implicit Intent by specifying a URI
   Intent i = new Intent(Intent.ACTION_VIEW, 
   Uri.parse("http://www.example.com"));

// Starts Implicit Activity
   startActivity(i); 

보류중인 의도

PendingIntent는 외부 애플리케이션 (예 : NotificationManager, AlarmManager, 홈 화면 AppWidgetManager 또는 기타 타사 애플리케이션)에 제공하는 토큰으로, 외부 애플리케이션이 애플리케이션의 권한을 사용하여 미리 정의 된 코드를 실행할 수 있도록합니다.

PendingIntent를 다른 응용 프로그램에 부여하면 다른 응용 프로그램이 본인 인 것처럼 지정한 작업을 수행 할 수있는 권한을 부여하는 것입니다 (동일한 권한 및 ID 사용). 따라서 PendingIntent를 빌드하는 방법에주의해야합니다. 예를 들어, 제공하는 기본 Intent는 궁극적으로 다른 곳으로 전송되지 않도록 자신의 구성 요소 중 하나로 명시 적으로 설정된 구성 요소 이름을 가져야합니다.

보류중인 의도의 예 : http://android-pending-intent.blogspot.in/

출처 : Android 인 텐트Android 보류중인 인 텐트

도움이 되었기를 바랍니다.


26

PendingIntent의 래퍼입니다 Intent. 를 수신하는 외부 앱 은으로 래핑 된 PendingIntent콘텐츠를 알지 못합니다 . 외국 앱의 임무는 일부 조건이 충족되면 소유자에게 의도를 다시 보내는 것입니다 (예 : 일정이있는 알람 또는 클릭으로 알림 ...). 조건은 소유자가 제공하지만 외국 앱에서 처리합니다 (예 : 알람, 알림).IntentPendingIntent

외국 앱이 앱에 인 텐트를 보낸 경우 외국 앱이 인 텐트의 콘텐츠를 알고 있음을 의미합니다. 그리고 외국 앱이 의도를 보내기로 결정하면 앱이 일부 조건을 충족하기 위해 의도를 처리해야합니다 => 앱이 시스템의 성능 리소스를 얻습니다.


5

또 다른 간단한 차이점 :

  • 정상적인 의도는 앱이 죽 자마자 죽습니다.

  • 보류중인 의도는 절대 죽지 않습니다. 알람 서비스, 위치 서비스 또는 기타 서비스에 필요한 한 살아있을 것입니다.


1

AlarmManager를 통해 정기적으로 서비스 시작

활동과 마찬가지로 Android 시스템은 리소스를 절약하기 위해 언제든지 서비스 프로세스를 종료 할 수 있습니다. 이러한 이유로 TimerTask서비스에서 a 를 사용 하여 정기적으로 실행되도록 할 수는 없습니다 .

따라서 서비스를 올바르게 예약하려면 AlarmManager클래스를 사용하십시오 .

최신 정보:

따라서 둘 사이에는 실제 차이가 없습니다. 그러나 서비스의 실행을 보장 할 것인지 여부에 따라 어떤 것을 사용할 것인지 결정할 수 있습니다. 전자 는 보증이없고 나중에 는 사용할 수 있습니다.

AndroidServices 에서 더 많은 정보를 확인 하세요.


2
이것은 실제로 서비스를 직접 시작하는 것과 알람이있는 서비스를 시작하는 것의 "차이점"인 OP의 질문에 실제로 대답하지 않습니다. 또한 OP는 기사의 코드가 OP가 게시 한 것과 거의 동일하기 때문에 링크하는 기사를 보았을 것입니다.
Squonk

AlarmManager에서 서비스를 시작하는 것이 활동보다 안전하고 죽을 가능성이 적다는 의미입니까? 잘못된 것 같아요. 설명해 주시겠습니까? 트윗 담아 가기 더 나아가 서비스를 시작하려는 의도를 만들면서 전달하는 컨텍스트가 더 중요하다고 생각합니다. 활동 (this)의 컨텍스트가 아닌 애플리케이션 (getApplicationContext ())의 컨텍스트를 사용하는 것이 더 안전해야합니다.
Parth 카푸어

@ Eu.Dr. X ... 작업을 실행할 때마다 트리거되는 알람 관리자를 사용하는 것이 좋습니다. 왜? 서비스를 사용하는 경우 특정 시점에 닫히고 특정 시간 (알 수 없음)에 일부 업데이트를 건너 뛸 수 있기 때문입니다. 문맥 의심의 경우, getApplicationContext()엄격하게 원할 때 사용 하거나 사용 하지 말고, 호출 할 때 활동 문맥 또는 응용 문맥 ( stackoverflow.com/questions/7298731/… )을 읽으십시오 .
My God

1

기능적으로 차이가 없습니다.

PendingIntent의 의미는 나중에 다른 응용 프로그램이 자신 인 것처럼 사용할 수 있도록 다른 응용 프로그램에서 처리 할 수 ​​있다는 것입니다. 다음은 문서 의 관련 설명입니다 .

PendingIntent를 다른 응용 프로그램에 부여하면 다른 응용 프로그램이 본인 인 것처럼 지정한 작업을 수행 할 수있는 권한을 부여하는 것입니다 (동일한 권한 및 ID 사용). 따라서 PendingIntent를 빌드하는 방법에주의해야합니다. 예를 들어, 제공하는 기본 Intent는 궁극적으로 다른 곳으로 전송되지 않도록 자신의 구성 요소 중 하나로 명시 적으로 설정된 구성 요소 이름을 가져야합니다.

PendingIntent 자체는 검색에 사용 된 원래 데이터를 설명하는 시스템에서 유지 관리하는 토큰에 대한 참조 일뿐입니다.

따라서 PendingIntent는 원래 Intent (PendingIntent를 만드는 데 사용됨)를 나타내는 데이터에 대한 참조 일뿐입니다.


4
기능적으로 차이가 없다고 말하는 것은 잘못된 것입니다. 두 기능이 동일하다면 왜 1 위에 두 개가 있습니까? PendingIntent는이를 전달하는 구성 요소 (알림을 생성하는 구성 요소)와 동일한 권한을 가진 원격 구성 요소 (예 : NotificationManager)에 의해 실행된다는 점에서 가장 중요한 차이점입니다.
Aniket Thakur 2015-04-05
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.