7

Powiadomienie w Androidzie z zamiarem kliknięcia. Wysyłam powiadomienia po zainstalowaniu motywu. Rozważ zainstaluję 4 motywy, a 4 powiadomienia pojawią się w oknie powiadomień, ale kiedy kliknę każde z powiadomień, rozpocznie się czynność pertikularna, ale intencja ma takie same dane dla każdego zamiaru.Powiadomienie o wielu urządzeniach z Androidem wysyłające te same dane po kliknięciu na

mój kod wygląda tak

@SuppressWarnings("deprecation") 
void sendInstalledNotification(String fileName, String packageName) { 
    NotificationManager notificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); 

    String name = ""; 
    try { 
     name += fileName.substring(fileName.lastIndexOf(".") + 1); 
    } catch (Exception e) { 
     Log.e("NewThemeChooser", "Invalid Package name"); 
     e.printStackTrace(); 
    } 
    name += " Installed"; 
    Notification notification = new Notification(R.drawable.ic_launcher_9, name , System.currentTimeMillis()); 

    Intent intent = new Intent(mContext , ThemeInfo.class); 
    Bundle bundle = new Bundle(); 
    bundle.putString("apkid", packageName); 
    bundle.putBoolean("isApplied", false); 
    intent.putExtra("bundle", bundle); 
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, intent, 0); 
    notification.setLatestEventInfo(mContext, name, "Click to Apply Theme", pendingIntent); 
    notification.flags = Notification.FLAG_AUTO_CANCEL; 
    Log.d("NewThemeChooser__:ThemeChangeReceiver" , "hascode : " + packageName.hashCode() + " installed " + packageName); 
    notificationManager.notify(packageName.hashCode(), notification); 

} 

a ja drukowania zamiarom dane onCreate z ThemeInfo działalności jako

Bundle bundle = getIntent().getBundleExtra("bundle"); 
    apkid = bundle.getString("apkid"); 
    isApplied = bundle.getBoolean("isApplied", false); 

    System.out.println("NewThemeChooser__:bundle apkid " + apkid); 

Wynik Dostaję w logach jest

D/NewThemeChooser__:ThemeChangeReceiver(4423): hascode : -186637114 installed com.test.theme.MiCrease 
D/NewThemeChooser__:ThemeChangeReceiver(4423): hascode : 2106806482 installed com.test.theme.iPhone 
D/NewThemeChooser__:ThemeChangeReceiver(4423): hascode : -1413669305 installed com.test.theme.Simpsons 
D/NewThemeChooser__:ThemeChangeReceiver(4423): hascode : -2146296452 installed com.test.theme.AnnaTheme 
I/System.out(4423): NewThemeChooser__:bundle apkid com.test.theme.MiCrease 
I/System.out(4423): NewThemeChooser__:bundle apkid com.test.theme.MiCrease 
I/System.out(4423): NewThemeChooser__:bundle apkid com.test.theme.MiCrease 
I/System.out(4423): NewThemeChooser__:bundle apkid com.test.theme.MiCrease 

Odpowiedz

18

Miałem ten sam problem, a problem polega na tym, że Android jest trochę zbyt inteligentny i daje ci to samo PendingIntent s zamiast nowych. Z docs:

Częstym błędem ludzi zrobić to utworzyć wiele PendingIntent obiektów z Intent s, że tylko różnią się pod względem treści „ekstra”, spodziewając się dostać inny PendingIntent każdym razem. Tak się nie stało. Części urządzenia Intent, które są używane do dopasowywania, są tymi samymi, które zostały zdefiniowane przez Intent.filterEquals. Jeśli użyjesz dwóch obiektów, które są równoważne według Intent.filterEquals, otrzymasz te same PendingIntent dla obu z nich.

zmodyfikować kod w następujący sposób, aby dostarczyć wyjątkową requestCode:

// ... 
PendingIntent pendingIntent = PendingIntent.getActivity(mContext, packageName.hashCode(), intent, 0); 
// ... 

To zapewni wyjątkowy PendingIntent jest używany, w przeciwieństwie do tego samego jeden.

Pamiętaj, że może nie być unikalny, więc jeśli to możliwe, użyj innej unikalnej liczby całkowitej jako requestCode.

+1

Właściwie to otrzymałem tę poprawkę wcześniej, ale nie zaktualizowałem. dzięki @Oleg –

+0

Wow. ładnie złapać. + 1 Awans. dzięki za udostępnienie –

Powiązane problemy