13

Context.startService안드로이드 : PendingIntent.getService 대 Context.startService와 서비스 시작

Intent intent = new Intent(context, MyService.class); 
context.startService(intent); 

PendingIntent.getService

Intent intent = new Intent(context, MyService.class); 
PendingIntent pi = PendingIntent.getService(context, 0, intent, 0); 
pi.send(); 


질문

  1. 언제 Context.startService 대 PendingIntent를 사용하여 서비스를 시작 하시겠습니까?
  2. 왜 다른 것을 사용하나요?

답변

18

실제로 차이점은 없습니다.

특히 Context 메서드는 직접 시작하는 데 사용됩니다. 여기서 PendingIntent는 일반적으로 도킹 될 때이 인 텐트를 시작하는 알림과 함께 사용되며 사용자가 (일반적으로) 도청 할 때까지 지연됩니다. 하나; 일반적으로 PendingIntent를 직접 보내지는 않습니다.

PendingIntent는 계류중인 계류 중이며, 은 현재이 아니지만 가까운 미래에 발생합니다. 의도가있는 반면, 바로 그 순간에 보내집니다.

PendingIntent가 사용 중일 때 보류 중이 아닌 경우 더 이상 PendingIntent가 아니며 의도적으로 의도 한 것입니다. 전적 목적을 상실 함.

+0

그래서 'PendingIntent'를 사용하여 서비스를 시작하고자 할 때가 있습니까? –

+2

가까운 시일 내에 서비스를 시작하려면 이상적인 경우입니다. 사용자 계정에 사용할 수있는 새 업데이트를 표시하는 알림이 있다고 가정 해 보겠습니다. 이상적으로는 서버에 연결하여이 정보를 다운로드하는 보류중인 의도가있을 것입니다. 사용자가 즉시 알림을 두드 리거나, 사용자의 편의를 기다리는 방식으로 사용자가 알림을 탭했거나 사용자가 상관하지 않으면 알림을 취소하고 다음 새 업데이트가 같은 방식으로 반응합니다. – JoxTraex

+0

위대한 설명, 고마워! – damluar

1

위젯에는 PendinIntents가 많이 사용됩니다. 실행중인 위젯의 레이아웃은 코드에 속하지 않지만 대신 시스템의 제어하에 있으므로 인터페이스 요소에 직접 클릭 리스너를 할당 할 수 없습니다. 위젯에서 버튼을 이용하여 서비스를 시작합니다이 경우

// get the widget layout 
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.id.widget_layout); 

// prepare to listen the clicks on the refresh button 
Intent active = new Intent(context, WidgetCode.UpdateService.class); 
PendingIntent refreshPendingIntent = PendingIntent.getService(context, 0, active, 0); 
remoteViews.setOnClickPendingIntent(R.id.buttonWidgetRefresh, refreshPendingIntent); 

// send the changes to the widget 
AppWidgetManager.getInstance(context).updateAppWidget(appwidgetid, remoteViews); 

: 사용자가 그들을 접촉 그렇게하면 대신 당신은의 PendingIntent는 "실행"처럼 뭔가를 (버튼 같은) 이러한 요소에 PendingIntent를 할당합니다. 일반적으로 putExtras()를 사용하여 추가 정보를 의도에 넣어 서비스가 필요한 정보를 얻습니다.

+0

매니페스트 에 서비스를 추가하고 export = "true"속성을 추가해야 함을주의하십시오. – Lior