Valor de restablecimiento de un entero a una hora específica del día

Actualmente tengo un fragmento que tiene varios botones y contiene un onClickListener. Cada vez que se hace clic en uno de esos botones, se incrementa una variable de contador en 1 y se establece como texto para un TextView en otro fragmento, utilizando SharedPreferences.

El contador permanecerá igual incluso después de que la aplicación esté completamente cerrada y aparecerá en las ejecuciones posteriores de la aplicación.

Mi nuevo objetivo es restablecer los contadores de nuevo a 0 al final de cada día (23:59:00 para el tiempo, para ser exactos).

Decidí evitar una búsqueda de Google para averiguar esto, y encontré TimerTask, calendario, temporizador y API de fecha en los documentos del desarrollador de Android; Intenté que esto funcionara con esas API. Desafortunadamente no está funcionando de la manera que planeé. Las variables se ponen de nuevo a 0, pero permanecen en cero y sólo incrementarán hasta 1 y volverán a 0 cada vez que salga de la aplicación.

¿Hay una mejor manera de abordar esto? ¿O es mi método suficiente, y sólo tengo que ajustar / cambiar algo del código?

Uno de los problemas podría ser donde estoy cambiando la variable de referencia de referencia también (y si es así, ¿dónde debo cambiarlo)?

Esto es lo que intenté:

Primer fragmento

@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflating the layout View v = inflater.inflate(R.layout.starting_fragment, container, false); //Instantiate new Timer Timer timer = new Timer(); // Creates a Calendar object that specifies a specific time of day Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(System.currentTimeMillis()); cal.set(Calendar.HOUR_OF_DAY, 20); cal.set(Calendar.MINUTE, 57); cal.set(Calendar.SECOND, 00); cal.set(Calendar.MILLISECOND, 00); // Instantiate a day object and use the time of day from cal object as its data Date date = cal.getTime(); TimerTask tt = new TimerTask() { // Sets the counter variables back to 0 @Override public void run() { COUNT_OOL = 0; COUNT_WTE = 0; COUNT_BLO = 0; COUNT_BLK = 0; COUNT_HBL = 0; COUNT_GRN = 0; COUNT_MTE = 0; } }; // Resets the counter variables (to 0) at the time specified by the date object timer.schedule(tt, date); // Stores count for each button back into their respective count variable // Initializes the value from previous runs of app to subsequent runs of app // This way, count variables will never get set back to 0 after onDestroy() COUNT_OOL = getActivity().getSharedPreferences("keyname", Context.MODE_PRIVATE).getInt("oolongCount", 0); COUNT_WTE = getActivity().getSharedPreferences("keyname", Context.MODE_PRIVATE).getInt("whiteCount", 0); COUNT_BLO = getActivity().getSharedPreferences("keyname", Context.MODE_PRIVATE).getInt("bloomingCount", 0); COUNT_BLK = getActivity().getSharedPreferences("keyname", Context.MODE_PRIVATE).getInt("blackCount", 0); COUNT_HBL = getActivity().getSharedPreferences("keyname", Context.MODE_PRIVATE).getInt("herbalCount", 0); COUNT_GRN = getActivity().getSharedPreferences("keyname", Context.MODE_PRIVATE).getInt("greenCount", 0); COUNT_MTE = getActivity().getSharedPreferences("keyname", Context.MODE_PRIVATE).getInt("mateCount", 0); 

El método onClick que incrementa las variables del contador:

  @Override public void onClick(View view) { int id = view.getId(); /* * Use the View interface with OnClickListener to get the Button ID's * Then you can run a switch on the Buttons (because normally switches * cannot be run on buttons */ if (id == R.id.tea_type1) { Builder oolongBuilder = new AlertDialog.Builder(StartingFragment.this.getActivity(), AlertDialog.THEME_HOLO_LIGHT); oolongBuilder.setPositiveButton("Hot", //Starts OolongTeaActivity for hot tea when clicked new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface arg0, int arg1) { Intent i = new Intent(StartingFragment.this.getActivity(), OolongTeaActivity.class); StartingFragment.this.getActivity().startActivity(i); } }); oolongBuilder.setNeutralButton("Iced", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Intent i = new Intent(StartingFragment.this.getActivity(), ColdOolongTeaActivity.class); StartingFragment.this.getActivity().startActivity(i); } }); oolongBuilder.setTitle("Oolong Tea"); oolongBuilder.setMessage("How Do You Like Your Tea?"); AlertDialog oolongDialog = oolongBuilder.create(); oolongDialog.show(); COUNT_OOL++; SharedPreferences pref1 = getActivity().getSharedPreferences("keyname", Context.MODE_PRIVATE); SharedPreferences.Editor editor1 = pref1.edit(); editor1.putInt("oolongCount", COUNT_OOL); editor1.commit(); } 

SecondFragment (establece los contadores como el texto para TextViews) :

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_tea_counter, container, false); oolongCounterText = (TextView) rootView.findViewById(R.id.oolong_counter_tv); SharedPreferences pref1 = getActivity().getSharedPreferences("keyname", Context.MODE_PRIVATE); Integer counter1 = pref1.getInt("oolongCount", 0); String s1 = String.valueOf(counter1); oolongCounterText.setText(s1); 

Yo personalmente vería el uso de AlarmManager con el calendario para ajustar la hora. A continuación, disparará un servicio para hacer todo lo que necesita hacer.

 Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, 23); calendar.set(Calendar.MINUTE, 59); calendar.set(Calendar.SECOND, 59); calendar.set(Calendar.MILLISECOND, 0); PendingIntent pi = PendingIntent.getService(context, 0, new Intent(context, MyService.class),PendingIntent.FLAG_UPDATE_CURRENT); AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pi); 

Reemplace MyService con un servicio real, cuando el servicio se inicia puede: 1) Restablecer el número de nuevo a 0 2) Compruebe si la aplicación está en ejecución para ver si necesita actualizar los cuadros de texto de inmediato o si está bien esperar al usuario a Lanzar la aplicación 3) detener el servicio

Cosas a investigar antes de seguir este código:

Asegúrese de que el AlarmManager es adecuado para usted, una alarma de repetición no se ejecutará después de un reinicio (Gracias a Jawnnypoo para aclarar esto) Por favor, ver su comentario a continuación en el que se vincula a un BroadcastReceiver para que el AlarmManager se ejecutará después de un reinicio.

Tal vez sólo almacenar el día del año y comparar con el día actual del año.

 dayOfYear = DateFormat.format("D", new Date()) if (dayOfYear != lastResetDay) { resetCounters(); } 
  • Sólo tiene que guardar la última vez que el contador se restableció en un pref.
  • Cuando el fragmento comienza por primera vez:
    • Comprueba la última vez que los contadores se restablecieron y tal vez los restablece
    • Registra una alarma a través de AlarmManager para la siguiente medianoche, lo que lanza la intención de difusión
    • Registra un receptor de difusión.
  • Cuando el receptor de difusión recibe la intención, restablece los contadores, notifica el fragmento y registra la alarma para la siguiente medianoche.
  • Si se detiene la actividad, elimine su receptor de difusión y cancele su alarma para que la aplicación no realice trabajos que de todos modos no estarían visibles.

El uso de AlarmManager para esta tarea parece un trabajo tedioso. Simplemente agregue otra variable a SharedPreferences. Almacene la última vez que se actualizó el contador. (Probablemente – Calendar.getInstance (). GetTimeInMillis ())

Así que cuando se abre el fragmento al obtener el valor del contador, hay que obtener la última vez que se actualizó. Compruebe el tiempo almacenado en función del día actual. Si no coincide, reinicie el valor del contador.

Si me pierdo nada, házmelo saber .. 🙂

Algunos aconsejan:

1.

 COUNT_OOL = getActivity().getSharedPreferences("keyname", Context.MODE_PRIVATE).getInt("oolongCount", 0); COUNT_WTE = getActivity().getSharedPreferences("keyname", Context.MODE_PRIVATE).getInt("whiteCount", 0); COUNT_BLO = getActivity().getSharedPreferences("keyname", Context.MODE_PRIVATE).getInt("bloomingCount", 0); COUNT_BLK = getActivity().getSharedPreferences("keyname", Context.MODE_PRIVATE).getInt("blackCount", 0); COUNT_HBL = getActivity().getSharedPreferences("keyname", Context.MODE_PRIVATE).getInt("herbalCount", 0); COUNT_GRN = getActivity().getSharedPreferences("keyname", Context.MODE_PRIVATE).getInt("greenCount", 0); COUNT_MTE = getActivity().getSharedPreferences("keyname", Context.MODE_PRIVATE).getInt("mateCount", 0); 

Debe ser editado como este

 private SharedPreferences sharedPreferences; sharedPreferences = getActivity().getSharedPreferences("keyname", Context.MODE_PRIVATE); COUNT_OOL = sharedPreferences.getInt("oolongCount", 0); 

Etc

  1. Nombrado de acuerdo con las necesidades de especificación

  2. Creo que su problema de código es escribir más desordenado, terminando la primera mirada a ella, primero tienes un vistazo, ahora escribo sobre, por cierto. Tal vez deberías usar el reloj del sistema android.

  • Actualizar fragmento actual (datos ListView) que permanece en la misma actividad
  • EXCEPCIÓN FATAL: principal java.lang.NoClassDefFoundError: android.support.v7.internal.widget.TintManager
  • GLSurfaceView dentro del fragmento que no se representa cuando se reinicia
  • Barra de herramientas y Fragmento
  • Llamada de findViewById en Fragment para encontrar un botón devuelve null
  • Reemplazar Fragmentos no funciona / ¿Estoy ejecutando esto de la manera correcta?
  • Aplicación Android basada en Java -> cambiar a Scala
  • Pasar lista de objetos complejos de actividad a fragmento
  • Apertura suave del teclado de Android
  • Disposición del coordinador con la barra de herramientas en fragmentos o actividad
  • Mapapi v2 en android causando error en el fragmento
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.