【问题标题】:Multiple notifications with different data具有不同数据的多个通知
【发布时间】:2017-06-17 12:26:29
【问题描述】:

我的应用程序存在无法解决的问题。该应用程序从用户那里获取输入(提醒),然后将其设置为通知。用户可以创建任意数量的通知,只要他/她喜欢。我希望用户单击通知并进入新活动(提醒),以便他/她可以在 TextView 中看到提醒。所以我有一个活动(SetReminder),它让用户将他的数据放在文本编辑器中。然后我将他的数据保存在 hashMap 中。 int 是用户字符串数据的id。然后我有一个类(AlarmReceiver),它扩展了 BroacastReceiver 并生成通知。在这个类中,我为每个通知都有一个 id,它与 SetReminder 活动中的 hashMap 的 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);
}


    }

提醒类

    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));

}
    }

【问题讨论】:

    标签: java android notifications android-pendingintent


    【解决方案1】:

    不要使用静态 id,在你的代码中,id 总是 0。你可以使用 Log 来检查它! 使用另一种方式生成不同的 id。

    当您添加具有相同 id 的通知时,新通知将替换为最后一个通知。使用随机整数作为 id

    【讨论】:

    • 如果不是静态的,我应该如何从另一个类访问变量......?你能告诉我如何使用 Log 吗?
    • 我认为如果 id 始终为 0,我不会在提醒活动中看到任何内容。我告诉你我可以看到数据...但始终是最后一个数据..如果我错了请纠正我...
    • 看看我在想什么...我希望 id 与 int(counter) hashMap 相同,所以我可以让正确的字符串出现在文本视图中,当用户点击通知...这是错误的吗?如果 id 与 hashMap 中的 int 不匹配,它是否会出现正确的文本? thnx 提前
    • 把你的id放在intent里,直接搜索intent怎么传数据
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    • 1970-01-01
    • 2016-03-29
    相关资源
    最近更新 更多