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.
- Actualizar datos en ListFragment como parte de ViewPager
- RunTimeException en PreferenceFragment
- Barra de acciones hasta navegación con fragmentos
- ListFragment no vuelve a mostrar datos al llamar desde FragmentStatePagerAdapter
- Agregue fragmento dinámicamente con LayoutParams
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);
- Android Fragments Content View aún no creado
- PutFragment () - Fragment x no está actualmente en el FragmentManager
- ¿Cómo puedo mantener el estado de fragmento cuando se agrega a la pila trasera?
- Las variables de miembro de fragmento que obtienen null cuando se accede en onPageSelected ()
- Fragmento de la pestaña específica de apertura de Android en la notificación
- ActionBarActivity requestFeature se debe llamar antes de agregar contenido
- Ventaja de ListFragment sobre un ListView o Fragmento normal
- Cómo agregar un fragmento a una actividad con una vista de contenido creada mediante programación
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
-
Nombrado de acuerdo con las necesidades de especificación
-
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.
- Ellipsize de TextView no funciona en maxLines = 1
- No recibe la notificación push de GCM en MI teléfono si se cancela la aplicación