Android PendingIntent 란 무엇입니까?


537

나는 안드로이드 초보자입니다. Android 설명서를 읽었지만 여전히 더 설명이 필요합니다. 누구나 정확히 무엇인지 말해 줄 수 있습니까 PendingIntent?

답변:


891

A는 PendingIntent당신이 외국 응용 프로그램에 제공하는 토큰 (예 : NotificationManager, AlarmManager, 홈 화면 AppWidgetManager, 또는 다른 제 3 자 응용 프로그램), 코드의 미리 정의 된 부분을 실행하는 응용 프로그램의 사용 권한을 사용하는 외국 응용 프로그램을 수 있습니다 .

외국 응용 프로그램에 인 텐트를 주면 Intent 자체 권한으로 . 그러나 외부 응용 프로그램에 a를 제공하면 PendingIntent해당 응용 프로그램은 Intent응용 프로그램의 권한을 사용하여 귀하의 응용 프로그램을 실행합니다 .


3
pendingIntents? 알림 만 사용하는 것을 본 것 같습니다 ...
Android 개발자

4
@Johnny_D : 일반적으로, 컴포넌트 이름이 자신의 클래스 중 하나를 명확하게 참조하는 절대 이름 인 명시 적 의도를 작성하려고 함을 의미합니다. 그렇지 않으면 인 텐트가 다른 애플리케이션으로 전송되어 인 텐트가 애플리케이션의 권한으로 실행되므로 문제가 발생할 수 있습니다.
Lie Ryan

3
@LieRyan, 애플리케이션 권한은 매니페스트에서 지정하는 권한입니까? 예 : 인터넷 허가?
Diffy

2
이 "권한 넘겨주기"가 실제로 보안 측면에서 좋지 않습니까? 여러 권한을 부여한 응용 프로그램 A가 있습니다. 그런 다음 훨씬 적은 권한을 사용하는 응용 프로그램 B가 있습니다. 응용 프로그램 A가 PendingIntent를 통해 응용 프로그램 B에서 무언가를 시작할 수 있다면 (A의 모든 권한이 일시적으로 B에있게 됨) B는 해당 권한이있는 장면 뒤에서 할 수있는 일을 할 수 없습니까? 예를 들어 A는 사용자의 연락처를 읽을 수있는 권한이 있지만 B는 읽을 수 없습니다. A가 PendingIntent를 B로 보내면 B는 연락처를 읽고 악의적 인 작업을 수행 할 수 있습니다 (예 : 서버로 보내기).
Tiago

6
@Tiago : 귀하의 경우, 권한있는 응용 프로그램 A가 응용 프로그램 B에 보류중인 의도를 부여하여 B가 연락처 데이터를 읽으려고 할 때 보낼 수 있도록합니다. 사용자에게 B에게주고 싶은 연락처 데이터를 요청하고 B에게만 해당 데이터를 제공하는 것은 A의 책임입니다. Pending Intent는 권한 상승 메커니즘이며, 권한 상승 메커니즘과 마찬가지로 큰 힘을 가지고 큰 책임이 따릅니다. 애플리케이션 B가 사용자가 선택한 연락처 데이터에 대해 신뢰할 수 있는지 여부를 결정하는 것은 사용자의 책임입니다.
Lie Ryan

49

보류중인 의도는 애플리케이션 프로세스의 활성 여부에 관계없이 일부 앱에 앱 대신 조치를 수행하기 위해 제공하는 토큰 입니다.

문서가 충분히 자세하다고 생각합니다 : Pending Intent docs .

(Broadcasting Intents, 알람 예약)과 같은 Pending Intents의 유스 케이스를 생각하면 문서가 더 명확하고 의미가 있습니다.


인 텐트는 앱을 대신하여 작업을 수행하기 위해 다른 앱에 제공하는 일종의 토큰이라고 생각합니다. 보류중인 의도와 의도의 유일한 차이점은 애플리케이션 프로세스 수명입니까?
CopsOnRoad

40

필자의 경우 위의 답변이나 Google의 공식 문서 중 어느 것도 PendingIntent수업 의 개념을 이해하는 데 도움이 되지 않았습니다 .

그런 다음이 비디오 ( Google I / O 2013, Beyond the Blue Dot 세션)를 찾았습니다 . 이 동영상에서 전직 Google 직원 인 Jaikumar Ganesh는 무엇이 무엇인지 설명하고 PendingIntent, 이것이 저에게 큰 그림을 제공했습니다.

아래는 단지 위 비디오의 전사입니다 ( 15:24부터 ).

보류중인 의도는 무엇입니까?

앱 프로세스가 위치 프로세스에 제공하는 토큰이며 , 관심있는 이벤트가 발생하면 위치 프로세스에서이를 사용하여 앱을 깨 웁니다 . 따라서 이것은 기본적으로 백그라운드에서 앱이 항상 실행될 필요는 없음을 의미합니다. 관심있는 일이 발생하면 깨어날 것입니다. 이것은 많은 배터리를 절약합니다.

이 설명은 세션의 슬라이드에 포함 된이 코드 스 니펫으로 더 명확 해집니다.

PendingIntent mIntent = PendingIntent.getService(...);

mLocationClient.requestLocationUpdates(locationRequest, mIntent);

public void onHandleIntent(Intent intent) {   
    String action = intent.getAction();   
    if (ACTION_LOCATION.equals(action)) {       
        Location location = intent.getParcelableExtra(...)   
    }
}

동의하는 것은 매우 간단하고 명확합니다. 그러나 PendingIntent가 다른 앱에 부여하는 권한에 대해서는 알려주지 않습니다.
CopsOnRoad

35

PendingIntent가 필요한 이유는 무엇입니까? 나는 생각했다

  1. 수신 애플리케이션 자체가 Intent또는
  2. Intent같은 목적 으로 단순 을 사용할 수없는 이유

예 :Intent bluetoothIntent= new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

bluetoothIntent권한이없는 다른 응용 프로그램으로 보내면 android.permission.BLUETOOTH_ADMIN수신 응용 프로그램에서 블루투스를 사용할 수 없습니다 startActivity(bluetoothIntent).

이 제한은을 사용하여 극복됩니다 PendingIntent. PendingIntent수신 응용 프로그램을 사용 하면 android.permission.BLUETOOTH_ADMINBluetooth를 활성화 할 필요가 없습니다 . 소스 .


3
bluetoothIntent 예제는 정말 귀중합니다. 감사합니다
Nicks

1
@Kiran-수신 애플리케이션이 Bluetooth를 켤 수있는 경우 (보류 의도 사용) 왜 해당 앱이 매니페스트에이 권한을 포함하지 않았습니까? 전화를 걸 수있는 앱을 만드는 것과 같지만 CALL_PHONE 권한이 포함되어 있지 않습니다. 다른 앱 이이 전화를 걸기 위해 보류중인 의도를 보내도록하기 때문입니다. 이것이 당신이 말하고 싶은 것입니까?
CopsOnRoad

1
@CopsOnRoad PendingIntent의 수신 앱은 모든 요청을 수신하고 요청자를 대신하여 요청을 실행하는 일반 앱일 수 있습니다. 그 역할은 중개인 일 뿐이므로 모든 권한이 없습니다. 이러한 종류의 중개인 앱의 예로는 알림 관리자가 있습니다. 알림 관리자는 권한을 소유하지 않고도 알림에서 의도 한 모든 앱을 시작할 수 있습니다.
Xiao-Feng Li

21

보류 의도는 미래의 어느 시점에서 시작될 의도입니다. 일반 의도는 startActivity(Intent)또는 로 전달되면 즉시 시작됩니다 StartService(Intent).


13

다른 앱이 사용할 수있는 미래의 의도.
다음은 하나를 만드는 예입니다.

Intent intent = new Intent(context, MainActivity.class);
PendingIntent pendIntent = PendingIntent.getActivity(context, 0, intent, 0);

8
"미래"이거나 다른 앱에서 사용할 수있는 의도에 대해 특별한 점을 실제로 설명하지 않기 때문에 공감
Vic

@ WhereDatApp.com 그것은 Antoine de Saint Exupéry에 의해 말되었고 Lewis Galantière에 의해 번역되었다;)
Choletski

@ Choletski 감사합니다, 나는 번역에 대해 몰랐어요 👍
Oded Breiner

13

택시 분석

의지

인 텐트는 일반적으로 서비스를 시작하는 데 사용됩니다. 예를 들면 다음과 같습니다.

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

택시를 부를 때와 같습니다.

Myself = CurrentClass
Taxi Driver = ServiceClass

보류 의도

다음과 같은 것을 사용해야합니다.

Intent intent = new Intent(CurrentClass.this, ServiceClass.class);
PendingIntent pi = PendingIntent.getService(parameter, parameter, intent, parameter);
getDataFromThirdParty(parameter, parameter, pi, parameter);

이제이 제 3자가 귀하를 대신하여 서비스를 시작합니다. 실제 비유는 택시 회사 인 우버 (Uber) 나 리프트 (Lyft)입니다.

Uber / Lyft에 탑승 요청을 보냅니다. 그런 다음 계속해서 귀하를 대신하여 운전사 중 한 명에게 전화하십시오.

따라서:

Uber/Lyft ------ ThirdParty which receives PendingIntent
Myself --------- Class calling PendingIntent
Taxi Driver ---- ServiceClass

11

PendingIntent는 다른 응용 프로그램 (예 : Notification Manager, Alarm Manager 또는 기타 타사 응용 프로그램)에 제공하는 토큰으로,이 다른 응용 프로그램은 응용 프로그램의 권한을 사용하여 미리 정의 된 코드를 실행할 수 있습니다. 보류중인 인 텐트를 통해 브로드 캐스트를 수행하려면 PendingIntent.getBroadcast ()를 통해 PendingIntent를 가져 오십시오. 보류중인 의도를 통해 활동을 수행하려면 PendingIntent.getActivity ()를 통해 활동을받습니다.


7

의도는 무엇입니까?

의도는 Android에서 특정 작업을 수행하기 위해 명령을 Android OS로 보낼 수있는 특정 명령입니다. 이를 수행해야하는 조치로 생각하십시오. 이메일을 보내거나 이메일에 사진을 첨부하거나 응용 프로그램을 시작하는 등 수행 할 수있는 많은 작업이 있습니다. 의도를 작성하는 논리적 워크 플로우는 일반적으로 다음과 같습니다. 의도 작성 b. 의도 추가 옵션-> 예. 텍스트 문자열 또는 의도와 함께 전달되는 것과 같은 OS 또는 해당 의도와 관련된 속성에 어떤 유형의 의도를 보내고 있는지 c. 의도를 실행

실제 사례 : 아침에 일어나서 화장실에 갔다고하자. 나는 화장실에가는 것에 대해 먼저 생각해야 할 것이다. 그러나 그것은 실제로 화장실에 나를 데려 가지 않는다. 그런 다음 뇌에 먼저 침대에서 일어나 화장실을 찾은 다음 손을 wash 다음 손을 씻으라고 지시해야합니다. 내가 어디로 가고 있는지 알면 시작하라는 명령을 보내면 내 몸이 행동합니다.

보류 의도 란 무엇입니까?

실제 사례에서 계속해서 샤워하고 싶지만 이빨을 닦고 아침 식사를 한 후에 샤워하고 싶다고 가정 해 봅시다. 그래서 적어도 30-40 분까지는 샤워를하지 않을 것입니다. 나는 여전히 내 머리 속에 옷을 준비한 다음 계단을 화장실로 걸어 간 다음 옷을 벗고 샤워를한다. 그러나 이것은 30-40 분이 지날 때까지 발생하지 않습니다. 샤워 대기중인 PENDING 의도가 있습니다. 30-40 분 동안 보류 중입니다.

이는 보류중인 의도와 일반 의도의 차이와 거의 같습니다. Pending Intent없이 Regular Intent를 만들 수 있지만 Pending Intent를 만들려면 먼저 Regular Intent를 설정해야합니다.


나는 단순함과 예를 정말로 좋아했습니다. 나는 그 단어들과 그것을 잘 이해했습니다.
Josema

나는이 포스트가 당신에게 유용하다는 것이 기쁘다. Josema
Narendra Motwani

이것은 위의 Shakeeb Ayaz의 설명과 정확히 동일합니다. 누가 누구로부터 복사 했습니까? :)
likejudo

5

PendingIntent기본적으로 다른 Intent객체 를 감싸는 객체입니다. 그런 다음 외부 응용 프로그램으로 전달하여 해당 응용 프로그램에 작업을 수행 할 수있는 권한을 부여합니다. 즉, 자신의 응용 프로그램 프로세스에서 실행 된 것처럼 의도를 실행합니다 (동일한 권한 및 ID). 보안상의 이유로 암시 적이 아니라 항상 명시 적 의도를 PendingIntent에 전달해야합니다.

 PendingIntent aPendingIntent = PendingIntent.getService(Context, 0, aIntent,
                    PendingIntent.FLAG_CANCEL_CURRENT);

4

쉬운 언어로,
1. 수행하려는 의도 및 목표 조치에 대한 설명. 먼저 인 텐트를 작성하고 실행하려는 특정 Java 클래스를 인 텐트로 전달해야합니다.
2. PendingIntent.getActivity, PendingIntent.getActivities (Context, int, Intent [], int), PendingIntent.getBroadcast (Context, int, Intent, int) 및 PendingIntent로 클래스 조치 클래스 인 Java 클래스를 호출 할 수 있습니다. getService (컨텍스트, int, Intent, int); 여기 1 단계에서 나온 인 텐트가 표시됩니다.
3. 다른 응용 프로그램에 PendingIntent를 제공함으로써 지정한 작업을 수행 할 수있는 권한이 부여됩니다.

그것이 오랫동안 읽은 후에 배운 것입니다.


3

PendingIntent는 일반 Intent를 외부 앱에 부여한 토큰으로 사용자의 권한으로 실행합니다. 예를 들어 :

음악 앱에 알림 PendingIntent앱이 READ_EXTERNAL_STORAGE허용하지 않는 권한이 있기 때문에 브로드 캐스트를 보내지 않으면 음악 앱의 알림으로 음악을 재생 / 일시 정지 할 수 없습니다. 알림은 시스템 서비스이므로 외국 앱입니다.


좋은 예!
likejudo

2

이름에서 알 수 있듯이 .. PendingIntent

당신은 그것을 잠시 기다릴 수 있습니다. 그것은 다른 의도로 작동합니다 .. 그것은 당신을 대신하여 수행 할 다른 응용 프로그램에 작업을 제공하는 방법입니다.


1
이에 대한 실제 사례를 제시 할 수 있습니까?
CopsOnRoad

0

보류 의도 지정 작업은 미래에 걸릴 수 있습니다. 향후 인 텐트를 다른 애플리케이션으로 전달하고 인 텐트가 호출 될 때 애플리케이션이 여전히 존재하는지 여부에 관계없이 애플리케이션이 해당 인 텐트를 애플리케이션과 동일한 권한을 가진 것처럼 실행할 수 있도록합니다.

외부 응용 프로그램이 응용 프로그램의 권한을 사용하여 미리 정의 된 코드를 실행할 수 있도록하는 외부 응용 프로그램에 제공하는 토큰입니다.

외부 응용 프로그램에 인 텐트를 제공하고 해당 응용 프로그램이 사용자가 제공 한 인 텐트를 전송 / 브로드 캐스트하면 자체 권한으로 인 텐트를 실행합니다. 그러나 대신 외부 응용 프로그램에 자신의 권한을 사용하여 만든 보류중인 인 텐트를 제공하면 해당 응용 프로그램은 응용 프로그램의 권한을 사용하여 포함 된 인 텐트를 실행합니다.

보류중인 인 텐트를 통해 브로드 캐스트를 수행하려면 PendingIntent.getBroadcast ()를 통해 PendingIntent를 가져 오십시오. 보류중인 의도를 통해 활동을 수행하려면 PendingIntent.getActivity ()를 통해 활동을받습니다.

수행하려는 의도 작업이지만 나중에 수행 할 의도입니다. 얼음에 의도를 두는 것으로 생각하십시오. 필요한 이유는 애플리케이션의 유효한 컨텍스트에서 인 텐트를 작성하고 시작해야하기 때문이지만 기술적으로 애플리케이션 컨텍스트 외부에 있으므로 조치를 실행하려고 할 때이를 사용할 수없는 경우가 있습니다 ( 두 가지 일반적인 예는 알림 또는 BroadcastReceiver에서 활동을 시작하는 것입니다.

PendingIntent를 작성하면 (예 : 다른 액티비티 또는 서비스 내에서) 컨텍스트를 가지고있는 동안 액티비티를 시작하여 애플리케이션의 일부를 시작하기 위해 해당 객체를 외부로 전달할 수 있습니다. 사용자를 대신하여.

PendingIntent는 프로세스가 종료 된 후에도 응용 프로그램이 작동 할 수있는 수단을 제공합니다. PendingIntent를 작성한 응용 프로그램이 종료 된 후에도 해당 Intent를 계속 실행할 수 있다는 점에 유의해야합니다. 수행 할 의도 및 대상 조치에 대한 설명입니다. 이 클래스의 인스턴스는 getActivity (Context, int, Intent, int), getBroadcast (Context, int, Intent, int), getService (Context, int, Intent, int); 리턴 된 오브젝트는 다른 응용 프로그램으로 전달되어 나중에 사용자를 대신하여 설명 된 조치를 수행 할 수 있습니다.

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

PendingIntent 자체는 단순히 토큰을 검색하는 데 사용 된 원래 데이터를 설명하는 시스템에서 유지 관리하는 토큰에 대한 참조입니다. 즉, 소유중인 응용 프로그램의 프로세스가 종료 되더라도 PendingIntent 자체는 제공된 다른 프로세스에서 계속 사용할 수 있습니다. 생성 응용 프로그램이 나중에 동일한 종류의 PendingIntent (같은 작업, 동일한 의도 작업, 데이터, 범주 및 구성 요소 및 동일한 플래그)를 다시 검색하는 경우 여전히 유효한 경우 동일한 토큰을 나타내는 PendingIntent를받습니다. 따라서 cancel ()을 호출하여 제거하십시오.


0

보류 의도는 다른 응용 프로그램에 특정 작업을 수행 할 수있는 모든 권한을 부여하는 의도입니다. 주요 활동이 삭제되면 Android OS는 권한을 다시 가져옵니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.