[android] Intent와 PendingIntent의 차이점

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

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 매개 변수를 반환하면이 두 가지가 동일한 작업을 수행합니다.



답변

의지

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 보류중인 인 텐트

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


답변

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

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


답변

또 다른 간단한 차이점 :

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

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


답변

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

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

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

최신 정보:

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

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


답변

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

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

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

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

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


답변