【问题标题】:Random Activity from Notification without repetition通知中的随机活动,无需重复
【发布时间】:2016-04-04 12:44:53
【问题描述】:

在上一个问题中,我询问了如何打乱活动列表,选择一个,将其添加到意图并防止重复已访问的活动,我很幸运得到了一位非常友善的绅士的帮助(@PedroFernandes)并解决我的问题,这是该问题的LINK

在同一件事上,我尝试在通知中实现完全相同的方法,我想要的是在我的应用程序中每天显示一个通知,每次都将用户带到不同的活动。虽然我设法做到了这一点,但我之前的问题仍然存在,activities.remove(0); 从未被触发,并且我不断收到重复,并且列表永远不会为空。

这是我扩展广播接收器的通知:

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 中,这样每次更改都会持续存在应用程序关闭并重新启动,但我承认我无法理解如何使用这些方法。

请大家帮忙,谁能帮帮我?这是我完成应用程序的唯一障碍。

再次感谢。

【问题讨论】:

    标签: java android random collections notifications


    【解决方案1】:

    您可以通过将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) 之前,您需要确保列表不为空。

    【讨论】:

    • 嘿伙计,感谢您的快速回复。我按照你的要求做了,但结果还是一样。我也不明白你的意思:在调用activities.get(0)activities.remove(0) 之前确保列表不为空。对不起,这里的总菜鸟:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多