답변:
A는 PendingIntent
당신이 외국 응용 프로그램에 제공하는 토큰 (예 : NotificationManager
, AlarmManager
, 홈 화면 AppWidgetManager
, 또는 다른 제 3 자 응용 프로그램), 코드의 미리 정의 된 부분을 실행하는 응용 프로그램의 사용 권한을 사용하는 외국 응용 프로그램을 수 있습니다 .
외국 응용 프로그램에 인 텐트를 주면 Intent
자체 권한으로 . 그러나 외부 응용 프로그램에 a를 제공하면 PendingIntent
해당 응용 프로그램은 Intent
응용 프로그램의 권한을 사용하여 귀하의 응용 프로그램을 실행합니다 .
보류중인 의도는 애플리케이션 프로세스의 활성 여부에 관계없이 일부 앱에 앱 대신 조치를 수행하기 위해 제공하는 토큰 입니다.
문서가 충분히 자세하다고 생각합니다 : Pending Intent docs .
(Broadcasting Intents, 알람 예약)과 같은 Pending Intents의 유스 케이스를 생각하면 문서가 더 명확하고 의미가 있습니다.
필자의 경우 위의 답변이나 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가 필요한 이유는 무엇입니까? 나는 생각했다
Intent
또는Intent
같은 목적 으로 단순 을 사용할 수없는 이유예 :Intent bluetoothIntent= new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
bluetoothIntent
권한이없는 다른 응용 프로그램으로 보내면 android.permission.BLUETOOTH_ADMIN
수신 응용 프로그램에서 블루투스를 사용할 수 없습니다 startActivity(bluetoothIntent)
.
이 제한은을 사용하여 극복됩니다 PendingIntent
. PendingIntent
수신 응용 프로그램을 사용 하면 android.permission.BLUETOOTH_ADMIN
Bluetooth를 활성화 할 필요가 없습니다 . 소스 .
다른 앱이 사용할 수있는 미래의 의도.
다음은 하나를 만드는 예입니다.
Intent intent = new Intent(context, MainActivity.class);
PendingIntent pendIntent = PendingIntent.getActivity(context, 0, intent, 0);
택시 분석
의지
인 텐트는 일반적으로 서비스를 시작하는 데 사용됩니다. 예를 들면 다음과 같습니다.
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
PendingIntent는 다른 응용 프로그램 (예 : Notification Manager, Alarm Manager 또는 기타 타사 응용 프로그램)에 제공하는 토큰으로,이 다른 응용 프로그램은 응용 프로그램의 권한을 사용하여 미리 정의 된 코드를 실행할 수 있습니다. 보류중인 인 텐트를 통해 브로드 캐스트를 수행하려면 PendingIntent.getBroadcast ()를 통해 PendingIntent를 가져 오십시오. 보류중인 의도를 통해 활동을 수행하려면 PendingIntent.getActivity ()를 통해 활동을받습니다.
의도는 무엇입니까?
의도는 Android에서 특정 작업을 수행하기 위해 명령을 Android OS로 보낼 수있는 특정 명령입니다. 이를 수행해야하는 조치로 생각하십시오. 이메일을 보내거나 이메일에 사진을 첨부하거나 응용 프로그램을 시작하는 등 수행 할 수있는 많은 작업이 있습니다. 의도를 작성하는 논리적 워크 플로우는 일반적으로 다음과 같습니다. 의도 작성 b. 의도 추가 옵션-> 예. 텍스트 문자열 또는 의도와 함께 전달되는 것과 같은 OS 또는 해당 의도와 관련된 속성에 어떤 유형의 의도를 보내고 있는지 c. 의도를 실행
실제 사례 : 아침에 일어나서 화장실에 갔다고하자. 나는 화장실에가는 것에 대해 먼저 생각해야 할 것이다. 그러나 그것은 실제로 화장실에 나를 데려 가지 않는다. 그런 다음 뇌에 먼저 침대에서 일어나 화장실을 찾은 다음 손을 wash 다음 손을 씻으라고 지시해야합니다. 내가 어디로 가고 있는지 알면 시작하라는 명령을 보내면 내 몸이 행동합니다.
보류 의도 란 무엇입니까?
실제 사례에서 계속해서 샤워하고 싶지만 이빨을 닦고 아침 식사를 한 후에 샤워하고 싶다고 가정 해 봅시다. 그래서 적어도 30-40 분까지는 샤워를하지 않을 것입니다. 나는 여전히 내 머리 속에 옷을 준비한 다음 계단을 화장실로 걸어 간 다음 옷을 벗고 샤워를한다. 그러나 이것은 30-40 분이 지날 때까지 발생하지 않습니다. 샤워 대기중인 PENDING 의도가 있습니다. 30-40 분 동안 보류 중입니다.
이는 보류중인 의도와 일반 의도의 차이와 거의 같습니다. Pending Intent없이 Regular Intent를 만들 수 있지만 Pending Intent를 만들려면 먼저 Regular Intent를 설정해야합니다.
PendingIntent
기본적으로 다른 Intent
객체 를 감싸는 객체입니다. 그런 다음 외부 응용 프로그램으로 전달하여 해당 응용 프로그램에 작업을 수행 할 수있는 권한을 부여합니다. 즉, 자신의 응용 프로그램 프로세스에서 실행 된 것처럼 의도를 실행합니다 (동일한 권한 및 ID). 보안상의 이유로 암시 적이 아니라 항상 명시 적 의도를 PendingIntent에 전달해야합니다.
PendingIntent aPendingIntent = PendingIntent.getService(Context, 0, aIntent,
PendingIntent.FLAG_CANCEL_CURRENT);
쉬운 언어로,
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를 제공함으로써 지정한 작업을 수행 할 수있는 권한이 부여됩니다.
그것이 오랫동안 읽은 후에 배운 것입니다.
이름에서 알 수 있듯이 .. PendingIntent
당신은 그것을 잠시 기다릴 수 있습니다. 그것은 다른 의도로 작동합니다 .. 그것은 당신을 대신하여 수행 할 다른 응용 프로그램에 작업을 제공하는 방법입니다.
보류 의도 지정 작업은 미래에 걸릴 수 있습니다. 향후 인 텐트를 다른 애플리케이션으로 전달하고 인 텐트가 호출 될 때 애플리케이션이 여전히 존재하는지 여부에 관계없이 애플리케이션이 해당 인 텐트를 애플리케이션과 동일한 권한을 가진 것처럼 실행할 수 있도록합니다.
외부 응용 프로그램이 응용 프로그램의 권한을 사용하여 미리 정의 된 코드를 실행할 수 있도록하는 외부 응용 프로그램에 제공하는 토큰입니다.
외부 응용 프로그램에 인 텐트를 제공하고 해당 응용 프로그램이 사용자가 제공 한 인 텐트를 전송 / 브로드 캐스트하면 자체 권한으로 인 텐트를 실행합니다. 그러나 대신 외부 응용 프로그램에 자신의 권한을 사용하여 만든 보류중인 인 텐트를 제공하면 해당 응용 프로그램은 응용 프로그램의 권한을 사용하여 포함 된 인 텐트를 실행합니다.
보류중인 인 텐트를 통해 브로드 캐스트를 수행하려면 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 ()을 호출하여 제거하십시오.