Notificações em horários determinados pelo usuário

  • Respostas:0
Aleander Rayson
  • Posts no fórum: 1

07/06/2018, 15:13:38 via Web

Com base em algumas respostas encontradas nesse site adaptei um código para que chegue notificações em um horári determidado se alguem poder finalizar este codigo e me ajudar a ativar as notificaçoes

Tela em que devo chamar a notificação:

public class EscolhaLuzCasa extends AppCompatActivity {
private EditText rep1, rep2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_escolha_luz_casa);

    rep1 = (EditText) findViewById(R.id.horarep1);
    rep2 = (EditText) findViewById(R.id.rep2);
}

public void onClick(View view ) {
    Context context = null;

    StartUpBootReceiver.setAlarm(context , 21, 30);
    int valor = (Integer.parseInt(rep1.getText().toString()));

        if(valor >= 300) {
            Intent intent = new Intent(this, luzcasaalto.class);
            startActivity(intent);
        }else if (valor <= 200  &&  (valor  >= 100)){
            Intent intent = new Intent(this, luzcasamedio.class);
            startActivity(intent);
        }else if (valor < 100 ){
        Intent intent = new Intent(this, luzcasabaixo.class);
        startActivity(intent);

    }
}

}
StartUpBootReceiver:

public class StartUpBootReceiver extends BroadcastReceiver {

private static int REPEATING_ID = 1001;
private static int ON_TIME_ID = 1002;
private static String HOUR = "hour";
private static String MINUTE = "minute";


public static void setAlarm(Context context, int hour, int minute){
    SharedPreferences preferences =  PreferenceManager.getDefaultSharedPreferences(context);
    preferences.edit()
            .putInt(HOUR, hour)
            .putInt(MINUTE, minute)
            .apply();
    setAlarm(context);
}


@Override
public void onReceive(Context context, Intent intent) {
    if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
        setAlarm(context);
        Toast.makeText(context, "Alarm set", Toast.LENGTH_LONG).show();
    }
}

private static void setAlarm(Context context) {
    int hour = getHour(context);
    int minute = getMinute(context);

    if(hour == -1 || minute == -1){
        //nenhum horário definido
        return;
    }
    //Cancela possiveis alarmes existentes
    cancelAlarm(context);

    Calendar calendar = getCalendar(hour, minute);

    //Se já passou
    if(isDateBeforeNow(calendar)){
        //adiciona um dia
        calendar.add(Calendar.DAY_OF_MONTH, 1);
    }else{
        //Alarme para o horário especificado
        setOneTimeAlarm(context, calendar);
        //adiciona um dia para repetir o alarme no dia seguinte
        calendar.add(Calendar.DAY_OF_MONTH, 1);
    }
    //Repete o alarme no dia seguinte
    setRepeatingAlarm(context, calendar);
}

private static void setRepeatingAlarm(Context context, Calendar calendar){
    PendingIntent pendingIntent = getPendingIntent(context, REPEATING_ID);

    AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);

    //Alarme que se repete todos os dias a uma determinada hora
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
            calendar.getTimeInMillis(),
            AlarmManager.INTERVAL_DAY,
            pendingIntent);
}

private static void setOneTimeAlarm(Context context, Calendar calendar){
    PendingIntent pendingIntent= getPendingIntent(context, ON_TIME_ID);

    AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);

    //Alarme para o horário especificado
    alarmManager.set(AlarmManager.RTC_WAKEUP,
            calendar.getTimeInMillis(),
            pendingIntent);
}

private static void cancelAlarm(Context context){
    AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    alarmManager.cancel(getPendingIntent(context, ON_TIME_ID));
    alarmManager.cancel(getPendingIntent(context, REPEATING_ID));
}

private static PendingIntent getPendingIntent(Context context, int id){
    //PendingIntent para lançar o serviço
    Intent serviceIntent = new Intent(context, BootService.class);
    return PendingIntent.getService(context, id, serviceIntent, 0);
}

private static Calendar getCalendar(int hour, int minute){
    // Cria um Calendar para o horário especificado
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.set(Calendar.HOUR_OF_DAY, hour);
    calendar.set(Calendar.MINUTE, minute);
    calendar.set(Calendar.SECOND, 0);
    return calendar;
}

private static int getHour(Context context){
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
    return preferences.getInt(HOUR, -1);
}
private static int getMinute(Context context){
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
    return preferences.getInt(MINUTE, -1);
}

private static boolean isDateBeforeNow(Calendar calendar){
    return calendar.getTimeInMillis() <= System.currentTimeMillis();
}

}
BootService:

public class BootService extends IntentService {

private PowerManager.WakeLock wakeLock;

public BootService() {
    super("name");
}

@Override
public void onCreate() {
    super.onCreate();

    PowerManager pm = (PowerManager) this.getSystemService(Context.POWER_SERVICE);
    wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK |
            PowerManager.ACQUIRE_CAUSES_WAKEUP |
            PowerManager.ON_AFTER_RELEASE, "BootService");
    wakeLock.acquire();
}

@Override
protected void onHandleIntent(@Nullable Intent intent) {
    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this, "S")
            .setSmallIcon(R.drawable.casa)
            .setContentTitle("leklek")
            .setContentText("PARABENSSSSS CARALHOOOOOOOOOOO")
            .setPriority(NotificationCompat.PRIORITY_DEFAULT);
}

@Override
public void onDestroy() {
    super.onDestroy();
    if(wakeLock.isHeld()){
        //Verificou-se que o iluminar do ecrã
        //não acontecia devido ao WakeLock ser
        //rapidamente libertado(apesar de PowerManager.ON_AFTER_RELEASE !?).
        try {
            //Atrasa a libertação do WakeLock
            //de forma a permitir a iluminação do ecrâ.
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        finally {
            wakeLock.release();
        }
    }
}

}

Seja o primeiro a responder