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에서도 함수에서 함수 가 여러 번 호출 됩니다.UploadManager
activity
displayNotification()
AsyncTask
편집 1 : 내가로 문자열 응답을 전달하고 있음을 언급하는 것을 잊었다 Intent intent
int로서 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_TASK
PendingIntent.getActivity, 사용에 대한 FLAG_ONE_SHOT 대신
댓글에서 복사 :
그런 다음 의도에 더미 동작을 설정하십시오. 그렇지 않으면 추가 항목이 삭제됩니다. 예를 들면
intent.setAction(Long.toString(System.currentTimeMillis()))
답변
고민 한 RemoteViews
여러 가지 Intents
각각 Button
의 HomeScreen
위젯. 다음을 추가하면 작동했습니다.
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
.