来自通知的随机活动而不重复

时间:2016-04-04 12:44:54

标签: java android random collections notifications

在之前的一个问题中,我询问了如何改变活动列表,选择一个,将其添加到意图中并防止重复已经访问过的活动,我很幸运能得到一位非常优秀的绅士(@PedroFernandes)的帮助并解决了我的问题,这是该问题的LINK

关于同样的问题,我尝试在Notification中实现完全相同的方法,我想要的是每天在我的应用程序中显示一个Notification,每次都将用户带到另一个Activity。虽然我设法实现了这个目标,但我之前的问题仍然存在,activities.remove(0);从未被触发,并且我一直在重复,而且列表永远不会出现空白。

这是我的扩展BroadcastReceiver的通知:

Notification01.java

public class Notification01 extends BroadcastReceiver{

    private static final int NOTIFICATION_ID = 1;
    PendingIntent pendingIntent;
    Notification notification;
    TaskStackBuilder taskStackBuilder;

    @Override
    public void onReceive(Context context, Intent intent) {

        ArrayList<Class> activities = new ArrayList<>();
            activities.add(Activity01.class);
            activities.add(Activity02.class);
            activities.add(Activity03.class);
            activities.add(Activity04.class);
            activities.add(Activity05.class);
            activities.add(Activity06.class);
            activities.add(Activity07.class);
            activities.add(Activity08.class);
            activities.add(Activity09.class);
            activities.add(Activity10.class);

        if (activities.size()==0){
            Toast.makeText(context, "ArrayList Empty", Toast.LENGTH_SHORT).show();
        }
        Collections.shuffle(activities);

        Class activityToShow = activities.get(0);

        intent = new Intent(context, activityToShow);
        activities.remove(0);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        taskStackBuilder = TaskStackBuilder.create(context);
        taskStackBuilder.addParentStack(Activity01.class);
        taskStackBuilder.addNextIntent(intent);

        pendingIntent = taskStackBuilder.getPendingIntent(1, PendingIntent.FLAG_CANCEL_CURRENT);

        notification = new NotificationCompat.Builder(context)
                .setSmallIcon(R.drawable.ic_stat_logo_white)
                .setColor(ContextCompat.getColor(context, R.color.colorPrimary))
                .setContentTitle("Notification Title")
                .setContentText("Notification content")
                .setStyle(new NotificationCompat.BigTextStyle().bigText("Notification Big Text"))
                .setAutoCancel(true)
                .setDefaults(Notification.DEFAULT_ALL)
                .setPriority(Notification.PRIORITY_HIGH)
                .setContentIntent(pendingIntent)
                .build();

        NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(NOTIFICATION_ID, notification);

    }
}

所有帮助都表示赞赏,我还应该提到我需要通过重新启动和应用关闭来坚持下去,我不确定我是否应该使用SharedPreferences或Receivers ?? !!我对此很陌生,没有任何Java经验。

非常感谢提前。

修改 感谢@Titus的回答,我从onReceive方法中获取了列表,但是当我运行调试时,我注意到调用了activities.remove(0);并且列表将大小更改为9而不是原来的10,但问题是,当我点击通知并让我进入随机选择的活动时,我会回到调试状态,列表的大小又回到了10。

阅读我发现我可以使用 GSON 之类的内容将 ArrayList 存储在 sharedPreferences 中,这样每个更改都会持续存在app关闭并重新启动,但我承认我无法理解如何使用这些方法。

请大家,有人可以帮我吗?这是阻止我最终确定应用程序的唯一方法。

再次感谢。

1 个答案:

答案 0 :(得分:0)

您可以通过创建activities变量(类变量)来解决此问题。就像现在一样,每次调用onReceive(...)方法时都会生成列表,这意味着您不会重复使用已删除之前启动的活动的列表。总是使用完整列表。

例如:

public class Notification01 extends BroadcastReceiver{

    ...
    ArrayList<Class> activities = new ArrayList<>(Arrays.asList(Activity01.class,Activity02.class, ..., Activity10.class));

    @Override
    public void onReceive(Context context, Intent intent) {
        ...
    }
}

此外,在致电activities.get(0)activities.remove(0)之前,您需要确保该列表不为空。