неправильное намерение получено в действии из уведомления (в службе)

У меня действительно странная проблема. Я пишу службу с двумя простыми уведомлениями, вызываемыми потоком, но когда я нажимаю на них, чтобы запустить DestinationActiviy, я обнаружил, что полученное намерение содержит дополнительные сведения о последнем нажатом уведомлении.

Например: Шаг 1) Вызывается SimpleNotification 2 Шаг 2) Вызывается SimpleNotification 1 Шаг 3) Нажмите SimpleNotification 2

Результат: DestinationActivity показывает: «SimpleNotification1»

Не могли бы вы сказать мне, почему? Я действительно удивлен этим...

Это код моей службы:

public class MyLocalService extends Service {

private final static String LOG_TAG = "MyLocalService";

private final static int MAX_NOTIFICATION_NUMBER = 10;

private final static int SIMPLE_NOTIFICATION_ID = 1;

private NotificationManager notificationManager;        

private BackgroundThread backgroundThread;

private Notification notification;

private PendingIntent pIntent;
private int notificationNumber;
private PendingIntent pIntent2;
private Intent intent;
private Intent intent2;

@Override
public void onCreate() {
        super.onCreate();
        backgroundThread = new BackgroundThread();
        backgroundThread.start();
        notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        Log.i(LOG_TAG, "Service Created");

}

public void sendNotification1(){
        notification = new Notification(R.drawable.icon,"Simple Notification1", System.currentTimeMillis());            
        notification.flags |= Notification.FLAG_AUTO_CANCEL;
        intent = new Intent(this, DestinationActiviy.class);
        intent.putExtra("notificationType", "Simple Notification1");
        pIntent = PendingIntent.getActivity(this, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT);     
        notificationNumber++;
        notification.number=notificationNumber;
        notification.setLatestEventInfo(this, "Simple Notification1","Simple Notification Extended", pIntent);
        notificationManager.notify(1, notification);
}

public void sendNotification2(){
        // Creiamo la Notification
        notification = new Notification(R.drawable.icon,"Simple Notification2", System.currentTimeMillis());            
        notification.flags |= Notification.FLAG_AUTO_CANCEL;
        intent2 = new Intent(this, DestinationActiviy.class);
        intent2.putExtra("notificationType", "Simple Notification2");
        pIntent2 = PendingIntent.getActivity(this, 0, intent2,PendingIntent.FLAG_UPDATE_CURRENT);     
        notificationNumber++;
        notification.number=notificationNumber;
        notification.setLatestEventInfo(this, "Simple Notification2","Simple Notification Extended", pIntent2);
        notificationManager.notify(2, notification);
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i(LOG_TAG, "Service Started");
        notificationNumber = 0;
        return super.onStartCommand(intent, flags, startId);
}

@Override
public void onDestroy() {
        backgroundThread.running = false;
        super.onDestroy();
        Log.i(LOG_TAG, "Service Destroyed");
}

@Override
public IBinder onBind(Intent arg0) {
        return null;
}


private final class BackgroundThread extends Thread {
        private final static long MIN_DELAY = 2000L;            
        private final static long MAX_RANDOM_DELAY = 10000L;
        public boolean running= true;
        public void run() {
                Log.i(LOG_TAG, "BackgroundThread Started");                     
                Random random = new Random();
                while(running && notificationNumber<MAX_NOTIFICATION_NUMBER){
                        long randomDelay = MIN_DELAY + Math.abs(random.nextInt() %MAX_RANDOM_DELAY);
                        Log.i(LOG_TAG, "Delay is (ms) "+randomDelay);
                        try{
                                Thread.sleep(randomDelay);
                                }
                        catch(InterruptedException ie){

                        }
                        sendNotification2();
                        sendNotification1();
                }
                stopSelf();
        }
}
}

Служба запускается из MainActivity:

public class LocalServiceTestActivity extends Activity {

private Intent serviceIntent;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    serviceIntent = new Intent(this,MyLocalService.class);
}

public void startLocalService(View button){
    startService(serviceIntent);
}

public void stopLocalService(View button){
    stopService(serviceIntent);
}    
}

И целевая активность:

public class DestinationActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.notification_activity);
    // Otteniamo le informazioni associate all'Intent
    Bundle extras = getIntent().getExtras();
    if (extras != null) {
        TextView textView = (TextView) findViewById(R.id.outputView);
        textView.setText(extras.getString("notificationType"));
    }
}

}

Я также пробовал с тем же намерением, с тем же pendingIntent с тем же уведомлением или наоборот с другим намерением, pendingIntent (например, этот код)... Я не знаю, как это исправить. Пожалуйста, помогите мне, спасибо.


comment
Здесь недостаточно информации. Где запускается служба?   -  person Jivings    schedule 29.01.2012
comment
Я отредактировал свой вопрос. Так понятно? :-)   -  person Aerox    schedule 30.01.2012


Ответы (1)


Когда вы создаете PendingIntent для второго уведомления здесь:

pIntent2 = PendingIntent.getActivity(this, 0, 
                intent2,PendingIntent.FLAG_UPDATE_CURRENT);     

вы указываете флаг PendingIntent.FLAG_UPDATE_CURRENT. Поскольку второе уведомление и первое уведомление «одинаковые» (т. е. они являются намерениями для одного и того же действия), этот флаг предотвращает создание нового PendingIntent. Вместо этого он просто приводит к тому, что существующий PendingIntent модифицируется дополнительными элементами из нового. См. документацию по PendingIntent.

Итак, у вас есть 2 уведомления, которые используют одно и то же PendingIntent. Независимо от того, какое из Уведомлений вы выберете, вы всегда будете получать Дополнения из второго.

person David Wasser    schedule 24.05.2012