2016-04-04 10 views
0

以前の質問では、アクティビティのリストをシャッフルし、1つを選択し、意図に追加し、既に訪問されたアクティビティの繰り返しを防ぐ方法について質問しました。素敵な紳士(@ PedroFernandes)と私の問題を解決するには、ここにLINKその質問。繰り返しのない通知からのランダムなアクティビティ

次のように続けて、同じ正確な同じメソッドをNotification内に実装しようとしましたが、毎回異なるアクティビティにユーザを連れて行く通知を毎日アプリに表示したいとします。私はこれを達成することができましたが、私の以前の問題は解決されず、activities.remove(0);は決して誘発されず、重複を続けています。

はここにBroadcastReceiverを拡張して、私の通知です:

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

 
    } 
 
}

Notification01.java

すべてのヘルプは高く評価され、そして私は辛抱するために、これを必要があることにも言及する必要があります再起動やアプリの終了によって、SharedPreferencesやReceiversを使うべきかどうかわかりません。私はこれには非常に新しく、Javaの経験はまったくありません。

事前に感謝します。

EDIT:@Titusの答えに おかげで、私はonReceive方法のうちのリストを得たが、私はデバッグを実行したとき、私はactivities.remove(0);は呼び出さないことに気づいて、リストではなく9にサイズを変更元の10の問題ですが、通知をクリックするとランダムに選択されたアクティビティが表示され、デバッグに戻り、リストのサイズは10に戻ります。

私は知りました私はGSONのようなものを使用してArrayListsharedPreferencesは、すべての変更がアプリケーションの終了と再起動によって持続するようにしていますが、私はこれらのメソッドの使い方を理解できないと認めます。

誰もが、私にこれを手伝ってもらえますか?アプリを完成させるために私の方法で立っているのは唯一のものだ。

もう一度ありがとうございます。

答えて

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は:) –