具有不同数据的多个通知

时间:2017-06-17 12:26:30

标签: java android notifications android-pendingintent

我的应用无法解决问题。应用程序从用户获取输入(提醒),然后将其设置为通知。用户可以创建他/她喜欢的任意数量的通知。我希望用户单击通知并进入新活动(提醒),以便他/她可以在TextView中看到提醒。所以我有一个活动(SetReminder),让用户将他的数据放在文本编辑器中。然后我将他的数据保存在hashMap中。 int是用户的字符串数据的id。然后我有一个类(AlarmReceiver)扩展BroacastReceiver并生成通知。在这个类中,我有一个每个通知的id,它匹配SetReminder活动中的hashMap< int int。这样我就会期望用户会看到每个通知的数据。但这并不会发生。我有多个通知(我希望如此),但无论选择哪个通知,用户都会看到最后一个通知的数据。我发布了三个活动的代码。 提前谢谢。

SetReminder.class

    package demo.push_not_demo;


    import android.graphics.PorterDuff;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.MotionEvent;
    import android.view.View;
    import android.widget.Button;
    import android.app.AlarmManager;
    import android.app.PendingIntent;
    import android.content.Intent;
    import android.os.SystemClock;
    import android.widget.EditText;
    import com.kunzisoft.switchdatetime.SwitchDateTimeDialogFragment;
    import java.util.HashMap;



    public class SetReminder extends AppCompatActivity {

private SwitchDateTimeDialogFragment dateTimeFragment;
Button b1,b2,b3;
EditText editText;
public static int counter=0;
public static HashMap<Integer,String> hashMap;
private static final String TAG_DATETIME_FRAGMENT = "TAG_DATETIME_FRAGMENT";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.set_reminder);
    hashMap= new HashMap<Integer, String>();
    b1=(Button) findViewById(R.id.set_date_time);
    b2=(Button) findViewById(R.id.cancel);
    b3=(Button) findViewById(R.id.save);
    b1.setOnTouchListener(touch);
    b2.setOnTouchListener(touch);
    b3.setOnTouchListener(touch);
    editText=(EditText) findViewById(R.id.reminder_edit);
}

View.OnTouchListener touch= new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (v.getId()){
            case R.id.set_date_time:
                if (event.getAction()==MotionEvent.ACTION_DOWN){
                    v.getBackground().setColorFilter(0x77000000, PorterDuff.Mode.SRC_ATOP);
                    v.invalidate();
                }
                else if (event.getAction()== MotionEvent.ACTION_UP){
                    v.getBackground().clearColorFilter();
                    v.invalidate();
                    // Construct SwitchDateTimePicker
                    dateTimeFragment = (SwitchDateTimeDialogFragment) getSupportFragmentManager().findFragmentByTag(TAG_DATETIME_FRAGMENT);
                    if(dateTimeFragment == null) {
                        dateTimeFragment = SwitchDateTimeDialogFragment.newInstance(
                                getString(R.string.label_datetime_dialog),
                                getString(R.string.positive_button_datetime_picker),
                                getString(R.string.negative_button_datetime_picker)
                        );
                    }
                    dateTimeFragment.show(getSupportFragmentManager(), TAG_DATETIME_FRAGMENT);
                }
            break;
            case R.id.cancel:
                if (event.getAction()==MotionEvent.ACTION_DOWN){
                    v.getBackground().setColorFilter(0x77000000, PorterDuff.Mode.SRC_ATOP);
                    v.invalidate();
                    cancelalarm();
                }
                else if (event.getAction()== MotionEvent.ACTION_UP){
                    v.getBackground().clearColorFilter();
                    v.invalidate();
                    Intent intent = new Intent(SetReminder.this,HomeScreen.class);
                    startActivity(intent);
                }
            break;
            case R.id.save:
                if (event.getAction()==MotionEvent.ACTION_DOWN){
                    v.getBackground().setColorFilter(0x77000000, PorterDuff.Mode.SRC_ATOP);
                    v.invalidate();

                }
                else if (event.getAction()== MotionEvent.ACTION_UP){
                    v.getBackground().clearColorFilter();
                    v.invalidate();
                    counter++;
                    hashMap.put(counter,editText.getText().toString());
                    alarmservice();
                }
            break;
        }
        return false;
    }
};

public void alarmservice(){
    Intent intent = new Intent(this,AlertReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    alarmManager.set(alarmManager.ELAPSED_REALTIME_WAKEUP,SystemClock.elapsedRealtime()+ 5000,pendingIntent);
}

public void cancelalarm(){
    Intent intent = new Intent(this,AlertReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    alarmManager.cancel(pendingIntent);
}
    }

AlertReceiver.class

    package demo.push_not_demo;

    import android.app.Notification;
    import android.app.NotificationManager;
    import android.app.PendingIntent;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.support.v4.app.NotificationCompat;
    import android.widget.EditText;

    import java.util.HashMap;

    import static android.support.v4.app.NotificationCompat.DEFAULT_SOUND;
    import static android.support.v4.app.NotificationCompat.PRIORITY_HIGH;
    import static android.support.v4.app.NotificationCompat.VISIBILITY_PUBLIC;

    public class AlertReceiver extends BroadcastReceiver {

public static int id=0;

@Override
public void onReceive(Context context, Intent intent) {
    id++;
    createNotification(context);
}

private void createNotification(Context context) {

    NotificationCompat.Builder notification = new NotificationCompat.Builder(context)
        .setAutoCancel(true)
        .setSmallIcon(R.drawable.offer1)
        .setContentTitle("Notification Title")
        .setContentText("Tap to see your reminder")
        .setPriority(PRIORITY_HIGH)
        .setVibrate(new long[] { 50, 1000, 500, 1000, 1000 })
        .setDefaults(DEFAULT_SOUND)
        .setVisibility(VISIBILITY_PUBLIC);

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

    PendingIntent pendingintent = PendingIntent.getActivity(context,id,intent,PendingIntent.FLAG_ONE_SHOT);
    notification.setContentIntent(pendingintent);
    NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    Notification ntfc =  notification.build();
    nm.notify(id,ntfc);
}


    }

Reminder.class

    package demo.push_not_demo;


   import android.os.Bundle;
   import android.support.annotation.Nullable;
   import android.support.v7.app.AppCompatActivity;
   import android.widget.TextView;

   import static demo.push_not_demo.AlertReceiver.id;
   import static demo.push_not_demo.SetReminder.hashMap;

   public class Reminder extends AppCompatActivity{


TextView txtv;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.reminder);
    txtv=(TextView) findViewById(R.id.reminder_textView);
    txtv.setText(hashMap.get(id));

}
    }

1 个答案:

答案 0 :(得分:0)

不要使用静态ID,在您的代码中ID始终为0.您可以使用Log进行检查!  用另一种方法产生不同的ID。

当您添加具有相同ID的通知时,新通知将替换为上一个通知。对id

使用随机整数