android notifications alarmmanager

android - Quiero mostrar notificación a las 8:00 am todos los días



notifications alarmmanager (2)

Estoy tratando de enviar una notificación a un usuario a una hora específica a las (8:00 am todos los días) usando un Administrador de alarmas. pero mi código no funciona correctamente, por favor ayúdame para mostrar la notificación

my MainActivity

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); AlarmController al=new AlarmController(this); al.StartAlarm(); }

My AlarmController

public class AlarmController { private Context m_Context; private AlarmManager mgr; private static final long PERIOD = 1000 * 30; public AlarmController(Context context){ m_Context = context; mgr = (AlarmManager)m_Context.getSystemService(Context.ALARM_SERVICE); } public void StartAlarm(){ Intent i = new Intent(m_Context, OnAlarmReceiver.class); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.set(Calendar.HOUR_OF_DAY,8); PendingIntent pi=PendingIntent.getBroadcast(m_Context, 0,i, PendingIntent.FLAG_UPDATE_CURRENT); mgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pi); Log.i("AlarmController", "StartAlarm"); } public void StopAlarm(){ Intent i = new Intent(m_Context, OnAlarmReceiver.class); PendingIntent pi=PendingIntent.getBroadcast(m_Context, 0,i, PendingIntent.FLAG_UPDATE_CURRENT); mgr.cancel(pi); Log.i("AlarmController", "StopAlarm"); } }

y OnAlarmReceiver

public class OnAlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { context.startService(new Intent(context, AppService.class));

}}

AppService public int onStartCommand(Intent intent, int flags, int startId) { Log.i(TAG, "start job"); NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle("My notification") .setContentText("از اپ سرویس!"); int mNotificationId = 001; NotificationManager mNotifyMgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); mNotifyMgr.notify(mNotificationId, mBuilder.build()); Log.i(TAG, "stop job"); return START_STICKY; }


Prueba este conjunto de códigos que tu servicio nunca va a detener, funciona para mí. "mgr.setInexactReapeating" no funciona en muchos de los dispositivos de piruletas y malvaviscos una vez que comenzó y luego pierde el control sobre el servicio, esto lo ayudará.

if (android.os.Build.VERSION.SDK_INT >= 23) { piLR = PendingIntent.getBroadcast(context, 0, intentLR, PendingIntent.FLAG_UPDATE_CURRENT); amLR.setAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP, interval, piLR); } else if (android.os.Build.VERSION.SDK_INT >= 19 && android.os.Build.VERSION.SDK_INT < 23) { piLR = PendingIntent.getBroadcast(context, 0, intentLR, PendingIntent.FLAG_UPDATE_CURRENT); amLR.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, piLR); } else { amLR.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, piLR); }


alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); alarmIntent = new Intent(context of current file, AlarmReceiver1.class); 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. Debe registrar su receptor de difusión en el manifiesto. Esto hará que reciba eventos de reloj. Anule el método onReceive de este receptor de transmisión y realice una notificación allí mismo o realice un servicio de creación de notificaciones separado y cree y muestre su notificación allí.

El fragmento de código manifiesto:

<receiver android:name="AlarmReceiver1" android:enabled="true">

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) { ontext 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."); } }