[android] PendingIntent는 첫 번째 알림에 대해서는 올바르게 작동하지만 나머지 알림에는 올바르지 않습니다.

  protected void displayNotification(String response) {
    Intent intent = new Intent(context, testActivity.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK);

    Notification notification = new Notification(R.drawable.icon, "Upload Started", System.currentTimeMillis());
    notification.setLatestEventInfo(context, "Upload", response, pendingIntent);

    nManager.notify((int)System.currentTimeMillis(), notification);
}

이 함수는 여러 번 호출됩니다. notification클릭하면 각각 testActivity를 시작하고 싶습니다 . 불행히도 첫 번째 알림 만 testActivity를 시작합니다. 나머지를 클릭하면 알림 창이 최소화됩니다.

추가 정보 : 함수 displayNotification()는라는 클래스에 UploadManager있습니다. 인스턴스화하는 에서 Context전달됩니다 . 에서 실행되는 UploadManager에서도 함수에서 함수 가 여러 번 호출 됩니다.UploadManageractivitydisplayNotification()AsyncTask

편집 1 : 내가로 문자열 응답을 전달하고 있음을 언급하는 것을 잊었다 Intent intentint로서 extra.

  protected void displayNotification(String response) {
    Intent intent = new Intent(context, testActivity.class);
    intent.putExtra("response", response);
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

알림이 생성되었을 때 String 응답이 무엇인지 반영하기 위해 추가 “응답”이 필요하기 때문에 이것은 큰 차이를 만듭니다. 대신을 사용 PendingIntent.FLAG_UPDATE_CURRENT하여 추가 “응답”은에 대한 마지막 호출에서 문자열 응답이 무엇인지 반영합니다 displayNotification().

나는 이것이에 대한 문서를 읽은 이유를 알고 FLAG_UPDATE_CURRENT있습니다. 그러나 현재로서는 어떻게 해결해야할지 모르겠습니다.



답변

사용하지 마십시오 Intent.FLAG_ACTIVITY_NEW_TASKPendingIntent.getActivity, 사용에 대한 FLAG_ONE_SHOT 대신


댓글에서 복사 :

그런 다음 의도에 더미 동작을 설정하십시오. 그렇지 않으면 추가 항목이 삭제됩니다. 예를 들면

intent.setAction(Long.toString(System.currentTimeMillis()))


답변

고민 한 RemoteViews여러 가지 Intents각각 ButtonHomeScreen위젯. 다음을 추가하면 작동했습니다.

1. intent.setAction(Long.toString(System.currentTimeMillis()));

2. PendingIntent.FLAG_UPDATE_CURRENT

        PackageManager pm = context.getPackageManager();

        Intent intent = new Intent(context, MyOwnActivity.class);
        intent.putExtra("foo_bar_extra_key", "foo_bar_extra_value");
        intent.setAction(Long.toString(System.currentTimeMillis()));
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
                intent, PendingIntent.FLAG_UPDATE_CURRENT);
        RemoteViews views = new RemoteViews(context.getPackageName(),
                R.layout.widget_layout);
        views.setOnClickPendingIntent(my_button_r_id_received_in_parameter, pendingIntent);


답변

Set Action이 문제를 해결했습니다. 상황에 대한 나의 이해는 다음과 같습니다.


PendingIntent가 각각 연결된 여러 위젯이 있습니다. 하나가 업데이트 될 때마다 모두 업데이트되었습니다. 플래그는 정확히 동일한 PendingIntents에서 발생하는 일을 설명하기 위해 있습니다.

FLAG_UPDATE_CURRENT 설명은 이제 훨씬 더 잘 읽 힙니다.

동일한 PendingIntent가 이미 존재하는 경우 기존의 모든 PendingIntent를 작성중인 새 PendingIntent로 업데이트하십시오.

똑같은 정의는 엑스트라를 제외하고 전체 PendingIntent를 봅니다. 따라서 각 인 텐트에 다른 추가 기능이 있더라도 (저는 appWidgetId를 추가했습니다) android에 동일합니다.

더미 고유 문자열과 함께 .setAction을 추가하면 OS에 알립니다. 이들은 완전히 다르며 아무것도 업데이트하지 않습니다. 결국 여기에 내가 원하는대로 작동하는 내 구현이 있으며, 여기서 각 위젯에는 자체 구성 의도가 첨부되어 있습니다.

Intent configureIntent = new Intent(context, ActivityPreferences.class);

configureIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);

configureIntent.setAction("dummy_unique_action_identifyer" + appWidgetId);

PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, configureIntent,
    PendingIntent.FLAG_UPDATE_CURRENT);

최신 정보


방송으로 작업하는 경우 더 나은 솔루션입니다. Unique PendingIntents는 고유 요청 코드로도 정의됩니다. 내 해결책은 다음과 같습니다.

//Weee, magic number, just want it to be positive nextInt(int r) means between 0 and r
int dummyuniqueInt = new Random().nextInt(543254);
PendingIntent pendingClearScreenIntent = PendingIntent.getBroadcast(context,
    dummyuniqueInt, clearScreenIntent, PendingIntent.FLAG_UPDATE_CURRENT);


답변

답변은 보이지만 설명은 없습니다. 또한 가능한 모든 해결책을 다룰 수있는 답변이 없으므로 명확하게 설명하겠습니다.

선적 서류 비치:

동시에 활성화 된 여러 개의 개별 PendingIntent 개체가 필요한 경우 (예 : 동시에 표시되는 두 개의 알림으로 사용) 서로 다른 개체와 연결하기 위해 다른 개체가 있는지 확인해야합니다. PendingIntents. Intent.filterEquals에서 고려하는 Intent 속성 중 하나이거나 getActivity (Context, int, Intent, int), getActivities (Context, int, Intent [], int), getBroadcast (Context, int)에 제공된 다른 요청 코드 정수일 수 있습니다. , Intent, int) 또는 getService (Context, int, Intent, int).

문제의 원인 :

2 개의 보류중인 인 텐트로 2 개의 알림을 생성합니다. 보류중인 각 인 텐트는 인 텐트와 연결됩니다.

Intent intent = new Intent(context, testActivity.class);

그러나이 두 인 텐트는 동일하므로 두 번째 알림이 도착하면 첫 번째 인 텐트가 시작됩니다.

해결책:

보류중인 인 텐트가 동일하지 않도록 각 인 텐트를 고유하게 만들어야합니다. 의도를 고유하게 만드는 방법은 무엇입니까? 당신이 넣은 엑스트라가 아닙니다 putExtra(). 엑스트라가 다르더라도 인 텐트는 여전히 동일 할 수 있습니다. 각 인 텐트를 고유하게 만들려면 인 텐트 작업, 데이터, 유형, 클래스, 카테고리 또는 요청 코드에 고유 한 값을 설정해야합니다. (모두 작동 함)

  • 동작: intent.setAction(...)
  • 데이터: intent.setData(...)
  • 유형: intent.setType(...)
  • 수업: intent.setClass(...)
  • 범주: intent.addCategory(...)
  • 요청 코드: PendingIntent.getActivity(context, YOUR_UNIQUE_CODE, intent, Intent.FLAG_ONE_SHOT);

참고 : 고유 한 요청 코드를 설정하는 것은 int가 필요하기 때문에 까다로울 수 있지만 System.currentTimeMillis()long 을 반환하므로 일부 숫자가 제거됩니다. 따라서 카테고리 또는 액션으로 이동 하여 고유 한 문자열을 설정하는 것이 좋습니다 .


답변

나는 같은 문제가 있었고 플래그를 다음과 같이 변경하여 해결할 수있었습니다.

PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);


답변

문서에 따르면 고유 한 요청 코드를 사용하십시오.

동시에 활성화 된 여러 개의 개별 PendingIntent 개체가 필요한 경우 (예 : 동시에 표시되는 두 개의 알림으로 사용) 서로 다른 개체와 연결하기 위해 다른 개체가 있는지 확인해야합니다. PendingIntents. Intent.filterEquals에서 고려하는 Intent 속성 중 하나이거나 getActivity (Context, int, Intent, int), getActivities (Context, int, Intent [], int), getBroadcast (Context, int)에 제공된 다른 요청 코드 정수일 수 있습니다. , Intent, int) 또는 getService (Context, int, Intent, int).


답변

FWIW, 내가 더 잘 행운이 있었다 PendingIntent.FLAG_CANCEL_CURRENT보다 PendingIntent.FLAG_UPDATE_CURRENT.