java - 该应用程序只能管理推送通知

标签 java android push-notification alarmmanager

我试图管理一组推送通知。

1. 我的第一个问题是只有最后设置的通知才能收到我的智能手机。我相信它没有创建新实例,但它覆盖了唯一的实例。我该如何解决?

2. 我的第二个问题是我希望从应用程序中,用户可以删除确定通知的时间表。

这是我在MovieAdapter.java 中的代码(主要方法是getNotificationscheduleNotificationdeleteNotification):

public class MoviesAdapter extends RecyclerView.Adapter<MoviesAdapter.ViewHolder>{

    private PendingIntent pendingIntent = null;


    private Context context;
    private List<Movie> movies;
    private View itemView;
    private RecyclerView rv;

    //per la data
    private EditText fromDateEtxt;
    private EditText eReminderTime;
    private boolean active = false;

    private int mese = (Calendar.getInstance().getTime().getMonth())+1;
    private int anno = (Calendar.getInstance().getTime().getYear())+1900 ;
    private int giorno = Calendar.getInstance().getTime().getDate();
    private int ora;
    private int minuti;
    private int secondi;
    private boolean modify = false;
    private Date datatime;

    private static String tipo = "NOTIFY";

    //non sono ancora sicuro se metterlo qui

    private WorkManager mWorkManager;
    static MoviesFragment fragmentInstance;
    static SectionsPageAdapter spa;

    public MoviesAdapter(Context context, List<Movie> movies, MoviesFragment fragment) {
        this.context = context;
        this.movies = movies;
        this.fragmentInstance = fragment;
        this.spa = null;
    }

    public MoviesAdapter(Context context, List<Movie> movies, SectionsPageAdapter spa) {
        this.context = context;
        this.movies = movies;
        this.spa = spa;
        this.fragmentInstance = null;
    }

    @Override
    public MoviesAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView;
            /*if(getTipo().equals("Suggested"))
            {
                itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_movie, parent, false);
                return new ViewHolder(itemView);
            }
                else if(getTipo().equals("Watched"))
                {
                    itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_movie_watched, parent, false);
                    return new ViewHolder(itemView);
                }
                else if(getTipo().equals("Notify"))
            {*/

        itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_movie, parent, false);

        return new ViewHolder(itemView);
        //}
        //return null;
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, final int position) {
        mWorkManager = WorkManager.getInstance();

        final Movie movie = movies.get(position);
        Glide.with(context)
                .load(movie.getPosterUrl())
                .placeholder(R.drawable.poster_placeholder)
                .into(holder.posterView);
        holder.title_movie.setText(movie.getTitle());
        // prende solo la data + anno
        String yourString = String.valueOf(movie.getReleaseDate());
        String date = yourString.substring(0, 10);
        String year = yourString.substring(yourString.length()-5,yourString.length());

        //per fare il testo bold
        final SpannableStringBuilder sb = new SpannableStringBuilder("Release: "+date+year);

        final StyleSpan bss = new StyleSpan(android.graphics.Typeface.BOLD); // Span to make text bold
        final StyleSpan nss = new StyleSpan(Typeface.NORMAL); //Span to make text italic
        sb.setSpan(bss, 0, 7, Spannable.SPAN_INCLUSIVE_INCLUSIVE); // make first 4 characters Bold
        sb.setSpan(nss, 7, sb.length()-1, Spannable.SPAN_INCLUSIVE_INCLUSIVE); // make last 2 characters Italic


        holder.release_date.setText(sb);
        if(getTipo().equals("NOTIFY")) {
            Toast.makeText(context, "Notify", Toast.LENGTH_LONG).show();
            holder.movie_notify.setVisibility(View.VISIBLE);
            holder.notifyButton.setVisibility(View.GONE);
            holder.changeDateTimeButton.setVisibility(View.VISIBLE);
            holder.watchedButton.setVisibility(View.VISIBLE);
            holder.removeButton.setVisibility(View.VISIBLE);

            String yourString1 = String.valueOf(movie.getNotifyDate());
            Log.i("STRINGA",yourString1);
            if(!(yourString1.equals("null"))) {
                date = yourString1.substring(0, 16);
                year = yourString1.substring(yourString1.length() - 5, yourString1.length());
                //per fare il testo bold
                final SpannableStringBuilder sb1 = new SpannableStringBuilder("Notify: " + date + year);
                final StyleSpan bss1 = new StyleSpan(android.graphics.Typeface.BOLD); // Span to make text bold
                final StyleSpan nss1 = new StyleSpan(Typeface.NORMAL); //Span to make text normal
                sb1.setSpan(bss1, 0, 6, Spannable.SPAN_INCLUSIVE_INCLUSIVE); // make first 4 characters Bold
                sb1.setSpan(nss1, 6, sb.length() - 1, Spannable.SPAN_INCLUSIVE_INCLUSIVE); // make last 2 characters Italic
                holder.movie_notify.setText(sb1);
            }

            holder.removeButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    MovieDatabase md = new MovieDatabase(context);
                    md.deleteMovie(movies.get(position).getId());

                    deleteNotify(pendingIntent);
                    refreshLists();
                }
            });

            holder.changeDateTimeButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    alertFormElements(position, true);
                }
            });

            holder.watchedButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    MovieDBModel mdm = new MovieDBModel(movies.get(position).getId(), movies.get(position).getTitle(), movies.get(position).getOverview(),
                            movies.get(position).getPosterUrl(), movies.get(position).getBackdropUrl(), movies.get(position).getTrailerUrl(),
                            movies.get(position).getReleaseDate(), movies.get(position).getRating(), movies.get(position).isAdult(),null);
                    MovieDatabase.updateMovieType(movies.get(position).getId(), 2,MainActivity.getMovieDatabase());
                    String testo = "Added " + movies.get(position).getTitle() + "\n" + "in tab watched";
                    Toast tostato = Toast.makeText(context, testo, Toast.LENGTH_SHORT);
                    tostato.show();
                    refreshLists();
                }
            });
        }

        //solo se è di tipo suggested
        if(getTipo().equals("SUGGESTED")) {
            //disabilitare bottone remove

            holder.movie_notify.setVisibility(View.GONE);
            holder.removeButton.setVisibility(View.GONE);
            holder.notifyButton.setVisibility(View.VISIBLE);
            holder.watchedButton.setVisibility(View.VISIBLE);
            holder.changeDateTimeButton.setVisibility(View.GONE);
            Toast.makeText(context,"Suggested", Toast.LENGTH_LONG).show();

            holder.notifyButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {


                    alertFormElements(position, false);
                }
            });
            holder.watchedButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    MovieDBModel mdm = new MovieDBModel(movies.get(position).getId(), movies.get(position).getTitle(), movies.get(position).getOverview(),
                            movies.get(position).getPosterUrl(), movies.get(position).getBackdropUrl(), movies.get(position).getTrailerUrl(),
                            movies.get(position).getReleaseDate(), movies.get(position).getRating(), movies.get(position).isAdult(),null);
                    MovieDatabase.insertMovie(mdm, 2, MainActivity.getMovieDatabase());
                    String testo = "Added " + movies.get(position).getTitle() + "\n" + "in tab watched";
                    Toast tostato = Toast.makeText(context, testo, Toast.LENGTH_SHORT);
                    tostato.show();
                    refreshLists();
                }
            });


        }
        if (getTipo().equals("WATCHED")) {

            holder.movie_notify.setVisibility(View.GONE);
            holder.notifyButton.setVisibility(View.GONE);
            holder.watchedButton.setVisibility(View.GONE);
            holder.removeButton.setVisibility(View.VISIBLE);
            holder.changeDateTimeButton.setVisibility(View.GONE);

            holder.removeButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    MovieDatabase md = new MovieDatabase(context);
                    md.deleteMovie(movies.get(position).getId());
                    refreshLists();
                }
            });
            Toast.makeText(context,"WATCHED", Toast.LENGTH_LONG).show();
        }
    }


    //nuovo codice riguardo l'alerDialog

    public final void alertFormElements(final int position, final boolean modify) {
        /*
         * Inflate the XML view. activity_main is in
         * res/layout/form_elements.xml
         */
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        final View formElementsView = inflater.inflate(R.layout.form_elements,
                null, false);



        // You have to list down your form elements
        /*final CheckBox myCheckBox = (CheckBox) formElementsView
                .findViewById(R.id.myCheckBox);*/

        final RadioGroup genderRadioGroup = (RadioGroup) formElementsView
                .findViewById(R.id.NotifyAlertRadioGroup);
        //nuovo codice
        genderRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener()
        {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId)
            {
                switch (checkedId)
                {
                    case R.id.OneDayRadioButton:
                        actv(false);
                        break;

                    case R.id.ReleaseDayRadioButton:
                        actv(false);
                        break;

                    case R.id.OnRadioButton:
                        actv(true);
                        break;
                }
            }

        });

        //questo sarà sostituito con un calendario.
        /*final EditText nameEditText = (EditText) formElementsView
                .findViewById(R.id.nameEditText);*/

        //parte data
        fromDateEtxt = (EditText) formElementsView.findViewById(R.id.nameEditText);
        fromDateEtxt.setEnabled(active);
        fromDateEtxt.setClickable(active);
        fromDateEtxt.setInputType(InputType.TYPE_NULL);
        fromDateEtxt.requestFocus();


        //metodo data
        //setDateTimeField();
        //fromDatePickerDialog.show();

        //Calendario ci servirà dopo per inserire i dati nel DB

        fromDateEtxt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final Calendar c = Calendar.getInstance();
                DatePickerDialog dpd = new DatePickerDialog( context ,
                        new DatePickerDialog.OnDateSetListener() {
                            @Override
                            public void onDateSet(DatePicker view, int year,
                                                  int monthOfYear, int dayOfMonth) {
                                fromDateEtxt.setText(dayOfMonth + "-"
                                        + (monthOfYear + 1) + "-" + year);
                                anno = year;
                                giorno = dayOfMonth;
                                mese = monthOfYear + 1;

                            }
                        },
                        c.get(Calendar.YEAR),
                        c.get(Calendar.MONTH),
                        c.get(Calendar.DAY_OF_MONTH));
                dpd.show();
            }
        });

        //parte orario
        ora = 9;
        minuti = 30;

        eReminderTime = (EditText) formElementsView.findViewById(R.id.timeEditText);
        eReminderTime.setText( ora + ":" + minuti);
        eReminderTime.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Calendar mcurrentTime = Calendar.getInstance();
                int hour = mcurrentTime.get(Calendar.HOUR_OF_DAY);
                int minute = mcurrentTime.get(Calendar.MINUTE);
                TimePickerDialog mTimePicker;
                mTimePicker = new TimePickerDialog(context, new TimePickerDialog.OnTimeSetListener() {


                    @Override
                    public void onTimeSet(TimePicker timePicker, int selectedHour, int selectedMinute)
                    {
                        eReminderTime.setText( selectedHour + ":" + selectedMinute);
                        ora = selectedHour;
                        minuti = selectedMinute;
                    }
                    //}
                }, hour, minute, true);//Yes 24 hour time
                mTimePicker.setTitle("Select Time");
                mTimePicker.show();

            }
        });

        // the alert dialog
        new AlertDialog.Builder(context).setView(formElementsView)
                .setTitle(movies.get(position).getTitle()+" Notify")
                .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    @TargetApi(11)
                    public void onClick(DialogInterface dialog, int id) {

                        //fromDateEtxt.setText(dateFormatter.format(newDate.getTime()));

                        String toastString = "";
                        String titleMovie = movies.get(position).getTitle();
                        String releaseDate = String.valueOf(movies.get(position).getReleaseDate());
                        String date = releaseDate.substring(0, 10);
                        String year = releaseDate.substring(releaseDate.length()-5,releaseDate.length());
                        releaseDate = date+year;
                        toastString = toastString + titleMovie + "\n" + releaseDate +"\n";
                        /*
                         * Detecting whether the checkbox is checked or not.
                         */
                        /*if (myCheckBox.isChecked()) {
                            toastString += "Happy is checked!\n";
                        } else {
                            toastString += "Happy IS NOT checked.\n";
                        }*/

                        /*
                         * Getting the value of selected RadioButton.
                         */
                        // get selected radio button from radioGroup
                        int selectedId = genderRadioGroup.getCheckedRadioButtonId();

                        // find the radiobutton by returned id
                        RadioButton selectedRadioButton = (RadioButton) formElementsView
                                .findViewById(selectedId);
                        Date datatime = null;
                        if(selectedRadioButton.getId() == R.id.ReleaseDayRadioButton) {
                            toastString += "Selected radio button is: " + selectedRadioButton.getText() +"!\n";
                            Date release = movies.get(position).getReleaseDate();
                            release.setHours(ora);
                            release.setMinutes(minuti);
                            release.setSeconds(secondi);
                            datatime = new Date (anno-1900,mese-1,giorno,ora, minuti, secondi);

                        }
                        else if(selectedRadioButton.getId() == R.id.OneDayRadioButton) {
                            toastString += "Selected radio button is: "
                                    + selectedRadioButton.getText() + "!\n";
                            Date release = movies.get(position).getReleaseDate();
                            release.setHours(ora);
                            release.setMinutes(minuti);
                            release.setSeconds(secondi);
                            datatime = new Date (anno-1900,mese-1,giorno-1,release.getHours(),release.getMinutes(), release.getSeconds());
                        }
                        else if(selectedRadioButton.getId() == R.id.OnRadioButton) {
                            toastString += "Selected radio button is: " + fromDateEtxt.getText() +"!\n";
                            datatime = new Date (anno-1900,mese-1,giorno,ora, minuti, secondi);
                        }

                        setDataTime(datatime);
                        toastString += eReminderTime.getText();
                        //Date(int year, int month, int date, int hrs, int min, int sec)
                        //Date datatime = new Date (anno-1900,mese-1,giorno,ora, minuti, secondi);


                        //ora scriviamo tutta questa roba sulla base di dati


                /*String testo = movies.get(position).getTitle()+ "\n" + "I WATCH IT";
                Toast tostato = Toast.makeText(context,testo,Toast.LENGTH_SHORT);
                tostato.show();*/
                        if(modify == false) {
                            // public MovieDBModel(int id, String title,  String overview, String posterUrl, String backdropUrl, String trailerUrl,
                            //                        Date releaseDate, float rating, boolean adult, date datatime){
                            //Log.i("DATATIME", datatime.toString());
                            MovieDBModel mdm2 = new MovieDBModel(movies.get(position).getId(), movies.get(position).getTitle(), movies.get(position).getOverview(),
                                    movies.get(position).getPosterUrl(), movies.get(position).getBackdropUrl(), movies.get(position).getTrailerUrl(),
                                    movies.get(position).getReleaseDate(), movies.get(position).getRating(), movies.get(position).isAdult(), datatime);
                            MovieDatabase.insertMovie(mdm2, 1, MainActivity.getMovieDatabase());
                            //notifyRequestID= scheduleNotify(datatime,position);
                            pendingIntent=scheduleNotification(getNotification(movies.get(position).getTitle()),datatime,movies.get(position).getId());
                            refreshLists();
                        }
                        else {
                            // provare la base di dati
                            MovieDatabase md = new MovieDatabase(context);
                            Log.i("DATATIME","ID"+ movies.get(position).getId() +"DATATIME: "+ datatime);
                            md.updateNotifyDate(movies.get(position).getId(),datatime);
                            //deleteNotify(notifyRequestID);
                            //inserire funzione deleteNotify
                            deleteNotify(pendingIntent);
                            pendingIntent=scheduleNotification(getNotification(movies.get(position).getTitle()),datatime, movies.get(position).getId());
                            refreshLists();
                        }
                        String testo = "Added " + movies.get(position).getTitle() + "\n" + "in tab watched";
                        Toast tostato = Toast.makeText(context, testo, Toast.LENGTH_SHORT);
                        tostato.show();
                        /*
                         * Getting the value of an EditText.
                         */
                        /*toastString += "Name is: " + nameEditText.getText()
                                + "!\n";*/

                        Toast toast =  Toast.makeText(context, toastString, Toast.LENGTH_LONG);
                        toast.show();

                        dialog.cancel();
                    }

                }).show();
    }

    //nuovo codice
    /*@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        LayoutInflater mInflater = (LayoutInflater) context
                .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.list_item_movie, null);
            holder = new ViewHolder();
            holder.title_movie = (TextView) convertView.findViewById(R.id.movie_title);
            holder.release_date = (TextView) convertView
                    .findViewById(R.id.movie_release_date);
            Movie row_pos = movies.get(position);
            //holder.profile_pic.setImageResource(row_pos.getProfile_pic_id());
            holder.title_movie.setText(row_pos.getTitle());
            holder.release_date.setText((CharSequence) row_pos.getReleaseDate());
            //holder.contactType.setText(row_pos.getContactType());
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        return convertView;
    }*/

    @Override
    public void onViewRecycled(ViewHolder holder) {
        super.onViewRecycled(holder);
        Glide.clear(holder.posterView);
    }

    @Override
    public int getItemCount() {
        return movies.size();
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.poster)
        public ImageView posterView;
        @BindView(R.id.movie_title)
        public TextView title_movie;
        @BindView(R.id.movie_release_date)
        public TextView release_date;
        @BindView(R.id.movie_time_notify)
        public TextView movie_notify;
        @BindView(R.id.editNotify)
        public Button notifyButton;
        @BindView(R.id.iWatchItMovie)
        public Button watchedButton;
        @BindView(R.id.remove)
        public Button removeButton;
        @BindView(R.id.change)
        public Button changeDateTimeButton;

        public ViewHolder(View v) {
            super(v);
            ButterKnife.bind(this, v);
        }
    }

    //parte per attivare/disattivare l'editText
    private void actv(final boolean active)
    {
        fromDateEtxt.setEnabled(active);
        if (active)
        {
            fromDateEtxt.requestFocus();
            fromDateEtxt.setText(giorno+"-"+mese+"-"+anno);
        }
    }

    public static void setTipo(String tipo) {
        MoviesAdapter.tipo = tipo;
    }

    public static void setFragment(MoviesFragment fragment) {
        MoviesAdapter.fragmentInstance = fragment;
    }

    public static String getTipo() {
        return tipo;
    }

    public Date getDatatime() {
        return datatime;
    }

    public void setDataTime(Date datatime) {
        this.datatime = datatime;
    }


    private Data createInputDataForUri(Movie movie) {
        Data.Builder builder = new Data.Builder();
        if (movie != null) {
            builder.putString(KEY_MOVIE,movie.getTitle());
        }
        return builder.build();
    }




    private PendingIntent scheduleNotification(Notification notification, /*int delay*/Date d, int id) {

        Intent notificationIntent = new Intent(context, NotificationPublisher.class);
        //
        notificationIntent.putExtra(NotificationPublisher.NOTIFICATION_ID, id);
        notificationIntent.putExtra(NotificationPublisher.NOTIFICATION, notification);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

        //long futureInMillis = SystemClock.elapsedRealtime() + delay;
        AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        //alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, futureInMillis, pendingIntent);
        alarmManager.set(AlarmManager.RTC_WAKEUP,d.getTime(), pendingIntent);
        return pendingIntent;

    }

    public void deleteNotify(PendingIntent p)
    {
        AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        manager.cancel(p);//cancel the alarm manager of the pending intent

    }

    private Notification getNotification(String content) {
        Notification.Builder builder = new Notification.Builder(context);
        builder.setContentTitle("WARNING!!! REMEMBER MOVIE: ");
        builder.setContentText(content);
        builder.setDefaults(DEFAULT_ALL);
        builder.setSmallIcon(R.drawable.ic_launcher_foreground);
        return builder.build();
    }




    public void refreshLists(){
        if(fragmentInstance!= null){
            fragmentInstance.onRefresh();
        }else{
            MoviesFragment mf1 = (MoviesFragment)spa.getItem(0);
            mf1.setArgFragType(MoviesFragment.Type.NOTIFY);
            mf1.onRefresh();
            MoviesFragment mf2 = (MoviesFragment)spa.getItem(1);
            mf2.setArgFragType(MoviesFragment.Type.SUGGESTED);
            mf2.onRefresh();
            MoviesFragment mf3 = (MoviesFragment)spa.getItem(2);
            mf3.setArgFragType(MoviesFragment.Type.WATCHED);
            mf3.onRefresh();
        }
    }
}

NotificationPublisher.java

package com.example.msnma.movienotifier.notify;

import android.app.Notification;
import android.app.NotificationManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class NotificationPublisher extends BroadcastReceiver
{

    public static String NOTIFICATION_ID = "notification-id";
    public static String NOTIFICATION = "notification";

    public void onReceive(Context context, Intent intent) {

        NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);

        Notification notification = intent.getParcelableExtra(NOTIFICATION);
        int id = intent.getIntExtra(NOTIFICATION_ID, 0);
        notificationManager.notify(id, notification);

    }
}

最佳答案

改变这一行

 PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

 PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, notificationIntent, PendingIntent.FLAG_ONE_SHOT); //Here 0 is the intent requestcode.

Make sure intent request code is unique in order to differentiate intents.

关于java - 该应用程序只能管理推送通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52138735/

相关文章:

java - 安卓 GCM : different way of handling push depending on whether the app is visible or not

push-notification - 我可以从 Web 控制台编辑未发送/计划的解析推送通知吗?

android - 所有包含的玩家都没有订阅信号

java - 打印名字和姓氏,从名字,姓氏到姓氏,名字

android - 如何在 ListView 中从 SQLiteDB 获取 RowID?

Android:如果我不能合法地安装多个将触发“打开方式”窗口的应用程序,我如何在模拟器上测试 "Open With"功能?

android - 抽屉导航标题未隐藏

java - 在 Android 中创建波形 UI

java - 不推荐在没有设置文件的情况下执行 Gradle : How to write a setting file and where to save

java - java程序退出时如何自动调用函数?