una tiempo studio real programacion notificationchannel notificaciones notificacion hacer crear como android android-notifications

studio - notificaciones en tiempo real android



¿Cómo dar notificaciones en Android en tiempo específico? (4)

Quiero dar notificación a mi aplicación en un momento específico. Digamos que todos los días tengo que enviar una notificación a las 7 am, incluso si la aplicación está cerrada.

¿Cómo puedo hacer esto? Cualquier tutorial? Por favor mencione el enlace.


Primero necesitas usar un transmisor. y debido a que un receptor de difusión sólo por un corto tiempo

del blog del desarrollador de Android. Cuando se maneja una transmisión, la aplicación recibe un tiempo fijo (actualmente 10 segundos) para realizar su trabajo. Si no se completa en ese tiempo, se considera que la aplicación se está comportando mal, y su proceso se lanza inmediatamente al estado de fondo para eliminarse por memoria si es necesario.

Es una mejor práctica usar también el servicio de intenciones. Aquí tiene un ejemplo de cómo hacerlo.

Esta es la clase de receptor de difusión.

public class MyReceiver extends BroadcastReceiver { public MyReceiver() { } @Override public void onReceive(Context context, Intent intent) { Intent intent1 = new Intent(context, MyNewIntentService.class); context.startService(intent1); } }

y registrarlo en el manifiesto.

<receiver android:name=".MyReceiver" android:enabled="true" android:exported="false" > </receiver>

Esta es la clase de servicio de intención.

public class MyNewIntentService extends IntentService { private static final int NOTIFICATION_ID = 3; public MyNewIntentService() { super("MyNewIntentService"); } @Override protected void onHandleIntent(Intent intent) { Notification.Builder builder = new Notification.Builder(this); builder.setContentTitle("My Title"); builder.setContentText("This is the Body"); builder.setSmallIcon(R.drawable.whatever); Intent notifyIntent = new Intent(this, MainActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity(this, 2, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT); //to be able to launch your activity from the notification builder.setContentIntent(pendingIntent); Notification notificationCompat = builder.build(); NotificationManagerCompat managerCompat = NotificationManagerCompat.from(this); managerCompat.notify(NOTIFICATION_ID, notificationCompat); } }

y registrarlo en el manifiesto.

<service android:name=".MyNewIntentService" android:exported="false" > </service>

y luego, en su actividad, configure el administrador de alarmas para que inicie el receptor de difusión a una hora específica y use el método AlarmManager setRepeating para repetirlo, este ejemplo se repetirá todos los días.

Intent notifyIntent = new Intent(this,MyReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast (context, NOTIFICATION_REMINDER_NIGHT, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT); AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 60 * 60 * 24, pendingIntent);

Espero que esto ayude.


Puede utilizar AlarmManager para configurar la alarma a la hora especificada

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); if (!prefs.getBoolean("firstTime", false)) { Intent alarmIntent = new Intent(this, AlarmReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, 0); AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.set(Calendar.HOUR_OF_DAY, 7); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 1); manager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent); SharedPreferences.Editor editor = prefs.edit(); editor.putBoolean("firstTime", true); editor.apply(); }

Utilicé SharedPreferences para comprobar que no es la primera vez que ejecuto la aplicación y, si lo está, configura esa alarma; de lo contrario, no haga nada en lugar de restablecer la alarma cada vez que inicie la aplicación.
Use un BroadcastReceiver para escuchar cuando ocurra la alarma

public class AlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // show toast Toast.makeText(context, "Alarm running", Toast.LENGTH_SHORT).show(); } }

Use otro receptor para escuchar los arranques del dispositivo para que pueda restablecer la alarma

public class DeviceBootReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) { // on device boot compelete, reset the alarm Intent alarmIntent = new Intent(context, AlarmReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, 0); AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.set(Calendar.HOUR_OF_DAY, 7); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 1); manager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent); } } }

añadir el permiso al manifiesto

<uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

luego registra tus receptores

<receiver android:name=".DeviceBootReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> <receiver android:name=".AlarmReceiver" />


Una solución de la respuesta aceptada no funcionará correctamente en Android 8 Oreo (api nivel 26) y superior debido a los límites del servicio en segundo plano ( https://developer.android.com/about/versions/oreo/background.html#services ) y causará una excepción como esta cuando la aplicación esté en segundo plano:

java.lang.IllegalStateException: Not allowed to start service Intent xxx: app is in background

Una de las soluciones posibles es usar JobIntentService :

  1. extienda su Service de JobIntentService lugar de IntentService y use el método onHandleWork lugar de onHandleIntent .

  2. agregue android:permission="android.permission.BIND_JOB_SERVICE" a su Service en AndroidManifest.xml .


  • Obtener el servicio de alarma del sistema.
  • Hacer un intento pendiente, pasando el nombre de la clase del receptor de difusión.
  • Haz un objeto de calendario y establece su hora también a las 8 am.
  • Compruebe si la hora actual es más allá de 8. Si es así, agregue otro día.
  • Llame al método de repetición del conjunto de la clase AlarmManager.

Código de muestra para el mismo:

alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); alarmIntent = new Intent(context of current file, AlarmReceiver1.class); AlarmReceiver1 = broadcast receiver pendingIntent = PendingIntent.getBroadcast( Menu.this, 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT); alarmIntent.setData((Uri.parse("custom://"+System.currentTimeMillis()))); alarmManager.cancel(pendingIntent); Calendar alarmStartTime = Calendar.getInstance(); Calendar now = Calendar.getInstance(); alarmStartTime.set(Calendar.HOUR_OF_DAY, 8); alarmStartTime.set(Calendar.MINUTE, 00); alarmStartTime.set(Calendar.SECOND, 0); if (now.after(alarmStartTime)) { Log.d("Hey","Added a day"); alarmStartTime.add(Calendar.DATE, 1); } alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, alarmStartTime.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent); Log.d("Alarm","Alarms set for everyday 8 am.");

Llegando a la clase de receptor de difusión. Es necesario registrar su receptor de difusión en el manifiesto. Esto hará que recibas eventos de reloj. Reemplace el método onReceive de este receptor de difusión y realice una notificación allí mismo o realice un servicio de creación de notificaciones por separado y cree y muestre su notificación allí.

El fragmento de código de manifiesto:

El fragmento de código del receptor de difusión:

public class AlarmReceiver1 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Intent service1 = new Intent(context, NotificationService1.class); service1.setData((Uri.parse("custom://"+System.currentTimeMillis()))); context.startService(service1); }

Fragmento de código de servicio de creación de notificaciones:

public class NotificationService1 extends IntentService{ private NotificationManager notificationManager; private PendingIntent pendingIntent; private static int NOTIFICATION_ID = 1; Notification notification; @Override protected void onHandleIntent(Intent intent) { Context context = this.getApplicationContext(); notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE); Intent mIntent = new Intent(this, Activity to be opened after clicking on the notif); Bundle bundle = new Bundle(); bundle.putString("test", "test"); mIntent.putExtras(bundle); pendingIntent = PendingIntent.getActivity(context, 0, mIntent, PendingIntent.FLAG_UPDATE_CURRENT); Resources res = this.getResources(); NotificationCompat.Builder builder = new NotificationCompat.Builder(this); Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); notification = new NotificationCompat.Builder(this) .setContentIntent(pendingIntent) .setSmallIcon(R.drawable.ic_launcher) .setLargeIcon(BitmapFactory.decodeResource(res, R.drawable.ic_launcher)) .setTicker("ticker value") .setAutoCancel(true) .setPriority(8) .setSound(soundUri) .setContentTitle("Notif title") .setContentText("Text").build(); notification.flags |= Notification.FLAG_AUTO_CANCEL | Notification.FLAG_SHOW_LIGHTS; notification.defaults |= Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE; notification.ledARGB = 0xFFFFA500; notification.ledOnMS = 800; notification.ledOffMS = 1000; notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); notificationManager.notify(NOTIFICATION_ID, notification); Log.i("notif","Notifications sent."); } }