2016-04-04 47 views
0

在之前的問題中,我詢問了如何洗牌活動列表,選擇一個,將其添加到意圖並防止重複已訪問的活動,並且我很幸運得到了一個非常有用的活動紳士(@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,這樣每次更改都會持續通過應用程序關閉和重新啓動,但我承認我無法理解如何使用這些方法。

請大家,任何人都可以幫助我嗎?這是唯一站在我的方式來完成應用程序。

非常感謝。

回答

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)之前空。

+0

嗨,感謝您的快速回復。我按你的要求做了,但結果仍然是一樣的。我也不知道你的意思:在調用'activities.get(0)'或'activities.remove(0)'之前,確保列表不是空的。對不起,總Noob在這裏:) –