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);
}
Fungsi ini akan dipanggil beberapa kali. Saya ingin masing-masing notification
meluncurkan testActivity saat diklik. Sayangnya, hanya notifikasi pertama yang meluncurkan testActivity. Mengklik sisanya akan memperkecil jendela notifikasi.
Informasi tambahan: Fungsi displayNotification()
dalam kelas yang disebut UploadManager
. Context
diteruskan ke UploadManager
dari activity
instance itu. Fungsi displayNotification()
dipanggil beberapa kali dari sebuah fungsi, juga di UploadManager, yang berjalan di file AsyncTask
.
Sunting 1: Saya lupa menyebutkan bahwa saya meneruskan respons String ke Intent intent
sebagai file 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);
Ini membuat perbedaan besar karena saya memerlukan "respons" ekstra untuk mencerminkan respons String saat notifikasi dibuat. Sebaliknya, menggunakan PendingIntent.FLAG_UPDATE_CURRENT
, "respons" ekstra mencerminkan ke mana respons String pada panggilan terakhir displayNotification()
.
Saya tahu mengapa ini berasal dari membaca dokumentasi di FLAG_UPDATE_CURRENT
. Namun, saya tidak yakin bagaimana mengatasinya saat ini.
sumber
Sedang berjuang dengan
RemoteViews
dan beberapa berbedaIntents
untuk masing-masingButton
diHomeScreen
Widget. Berhasil saat ditambahkan ini: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);
sumber
setAction
setAction
, yang dapat Anda lakukan adalahaddCategory
.PendingIntent
digunakanIntent.filterEquals
untuk memeriksa kesetaraan tindakan, data, jenis, kelas, dan kategori. developer.android.com/reference/android/content/…Atur Tindakan Selesaikan ini untuk saya. Inilah pemahaman saya tentang situasinya:
Saya memiliki beberapa widget yang masing-masing memiliki PendingIntent. Setiap kali ada yang diperbarui, semuanya diperbarui. Bendera ada di sana untuk menjelaskan apa yang terjadi dengan PendingIntents yang persis sama.
FLAG_UPDATE_CURRENT deskripsi terbaca jauh lebih baik sekarang:
Jika PendingIntent yang sama yang Anda buat sudah ada, perbarui semua yang lama ke PendingIntent baru yang Anda buat.
Definisi yang persis sama melihat seluruh PendingIntent KECUALI ekstra. Jadi, meskipun Anda memiliki ekstra yang berbeda pada setiap maksud (bagi saya, saya menambahkan appWidgetId) lalu ke android, keduanya sama.
Menambahkan .setAction dengan beberapa string unik tiruan memberi tahu OS. Ini sama sekali berbeda dan tidak memperbarui apa pun. Pada akhirnya, inilah implementasi saya yang berfungsi seperti yang saya inginkan, di mana setiap Widget memiliki konfigurasi sendiri yang dilampirkan Intent:
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);
MEMPERBARUI
Solusi yang lebih baik jika Anda bekerja dengan siaran. Unique PendingIntents juga ditentukan oleh kode permintaan unik. Inilah solusi saya:
//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);
sumber
Saya melihat jawaban tetapi tidak ada penjelasan. Juga tidak ada jawaban yang membahas semua solusi yang mungkin, jadi saya akan mencoba menjelaskannya.
Dokumentasi:
Penyebab masalah:
Anda membuat 2 notifikasi dengan 2 maksud tertunda. Setiap maksud yang tertunda dikaitkan dengan maksud:
Intent intent = new Intent(context, testActivity.class);
Namun, 2 maksud ini sama, oleh karena itu ketika pemberitahuan kedua Anda tiba, maksud pertama akan diluncurkan.
Larutan:
Anda harus membuat setiap maksud unik, sehingga tidak ada maksud tertunda yang akan sama. Bagaimana Anda membuat maksud menjadi unik? Bukan dengan ekstra yang Anda berikan
putExtra()
. Meskipun tambahannya berbeda, maksudnya mungkin masih sama. Untuk membuat setiap maksud unik, Anda harus menyetel nilai unik ke tindakan maksud, atau data, atau jenis, atau kelas, atau kategori, atau kode permintaan: (semua itu akan berfungsi)intent.setAction(...)
intent.setData(...)
intent.setType(...)
intent.setClass(...)
intent.addCategory(...)
PendingIntent.getActivity(context, YOUR_UNIQUE_CODE, intent, Intent.FLAG_ONE_SHOT);
Catatan : Menetapkan kode permintaan unik mungkin rumit karena Anda memerlukan int, sementara
System.currentTimeMillis()
pengembaliannya panjang, yang berarti beberapa digit akan dihapus. Oleh karena itu saya akan merekomendasikan untuk memilih kategori atau tindakan dan menetapkan string unik.sumber
Saya memiliki masalah yang sama, dan dapat memperbaikinya dengan mengubah benderanya menjadi:
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
sumber
Seperti yang dikatakan dokumentasi, gunakan kode permintaan unik:
sumber
Fwiw, saya lebih beruntung
PendingIntent.FLAG_CANCEL_CURRENT
daripada denganPendingIntent.FLAG_UPDATE_CURRENT
.sumber
Saya memiliki masalah yang sama dan saya memperbaikinya dengan langkah-langkah di bawah ini
1) Hapus semua bendera untuk maksud
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
2) masukkan intent.setAction dengan kode di bawah ini
intent.setAction(Long.toString(System.currentTimeMillis()));
3) untuk Pendingintent, masukkan kode di bawah ini
Saya berharap dapat bekerja sama dengan Anda
sumber
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK);
Dalam PendingIntent ada dua parameter int, yang kedua dan yang terakhir. Yang kedua adalah "kode permintaan" dan itu harus berupa nomor unik (misalnya id pemberitahuan Anda), jika tidak (seperti dalam contoh Anda itu sama dengan nol, itu akan selalu ditimpa).
sumber
// Use pending Intent and also use unique id for display notification.... // Get a PendingIntent containing the entire back stack PendingIntent notificationPendingIntent = stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT); NotificationManager mNotificationManager = (NotificationManager) sqlitewraper.context.getSystemService(Context.NOTIFICATION_SERVICE); // Issue the notification mNotificationManager.notify(id, builder.build());
sumber
untuk mengirim data ekstra dengan benar, Anda harus mengirim dengan maksud tertunda id pemberitahuan seperti ini: PendingIntent pendingIntent = PendingIntent.getActivity (konteks, (int) System.currentTimeMillis () , maksud, PendingIntent.FLAG_UPDATE_CURRENT);
sumber
Saya memiliki masalah yang sama, dan menggunakan PendingIntent.html.FLAG_UPDATE_CURRENT untuk memperbaikinya.
Saya telah memeriksa kode sumbernya. Di ActivityManagerService.java , metode kuncinya adalah sebagai berikut. Jika benderanya adalah PendingIntent.FLAG_UPDATE_CURRENT dan updateCurrent adalah true. Beberapa tambahan akan diganti dengan yang baru dan kami akan mendapatkan PendingIntent yang diganti.
IIntentSender getIntentSenderLocked(int type, String packageName, int callingUid, int userId, IBinder token, String resultWho, int requestCode, Intent[] intents, String[] resolvedTypes, int flags, Bundle bOptions) { // ... omitted final boolean noCreate = (flags&PendingIntent.FLAG_NO_CREATE) != 0; final boolean cancelCurrent = (flags&PendingIntent.FLAG_CANCEL_CURRENT) != 0; final boolean updateCurrent = (flags&PendingIntent.FLAG_UPDATE_CURRENT) != 0; flags &= ~(PendingIntent.FLAG_NO_CREATE|PendingIntent.FLAG_CANCEL_CURRENT |PendingIntent.FLAG_UPDATE_CURRENT); PendingIntentRecord.Key key = new PendingIntentRecord.Key( type, packageName, activity, resultWho, requestCode, intents, resolvedTypes, flags, bOptions, userId); WeakReference<PendingIntentRecord> ref; ref = mIntentSenderRecords.get(key); PendingIntentRecord rec = ref != null ? ref.get() : null; if (rec != null) { if (!cancelCurrent) { if (updateCurrent) { if (rec.key.requestIntent != null) { rec.key.requestIntent.replaceExtras(intents != null ? intents[intents.length - 1] : null); } if (intents != null) { intents[intents.length-1] = rec.key.requestIntent; rec.key.allIntents = intents; rec.key.allResolvedTypes = resolvedTypes; } else { rec.key.allIntents = null; rec.key.allResolvedTypes = null; } } return rec; } rec.canceled = true; mIntentSenderRecords.remove(key); }
sumber
Saya memiliki masalah yang sama, dan dapat memperbaikinya dengan mengubah benderanya menjadi:
LayoutInflater factory = LayoutInflater.from(this); final View textEntryView = factory.inflate(R.layout.appointment, null); AlertDialog.Builder bulider= new AlertDialog.Builder(PatientDetail.this); final AlertDialog alert=bulider.create(); bulider.setTitle("Enter Date/Time"); bulider.setView(textEntryView); bulider.setPositiveButton("Save", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { EditText typeText=(EditText) textEntryView.findViewById(R.id.Editdate); EditText input1 =(EditText) textEntryView.findViewById(R.id.Edittime); getDateAndTime(typeText.getText().toString(),input1.getText().toString()); } }); bulider.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); bulider.show(); }
sumber