Como definir a notificação localmente usando Service e Broadcastreceiver?
Pergunta
Sou novo no Android.Quero definir a notificação localmente, que a dispara diariamente em um horário específico.Quando eu inicio o serviço...A notificação é disparada imediatamente...
quero saber como disparar a notificação em um determinado momento sem disparar imediatamente
Passo 1:
public class startservice extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button=(Button) findViewById(R.id.button1);
button.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent intent = new Intent(startservice.this,MainActivity.class);
startservice.this.startService(intent);
}
});
}
}
Passo 2:Começar serviço
public class MainActivity extends Service {
AlarmManager am;
Calendar calendar;
int count=0;
@Override
public void onCreate() {
super.onCreate();
am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
calendar=Calendar.getInstance();
setNotification();
}
public void setNotification() {
Intent intent = new Intent(this, Startnotification.class);
calendar.set(Calendar.HOUR, 9); // At the hour you wanna fire
calendar.set(Calendar.MINUTE,12); // Particular minute
calendar.set(Calendar.SECOND, 0);
double x = Math.random();
String value=String.valueOf(x);
intent.putExtra("name", value);
sendBroadcast(intent);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, count,intent, PendingIntent.FLAG_UPDATE_CURRENT);
am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),3600000,pendingIntent);
count++;
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
}
Etapa 3:Receptor de radiodifusão
public class Startnotification extends BroadcastReceiver {
NotificationManager nm;
@SuppressWarnings("deprecation")
@Override
public void onReceive(Context context, Intent intent) {
nm = (NotificationManager) context
.getSystemService(Context.NOTIFICATION_SERVICE);
String getvalue= intent.getStringExtra("name");
CharSequence from = getvalue;
CharSequence message = "Android calendar...";
PendingIntent contentIntent = PendingIntent.getService(context, 0, new Intent(),0);
Notification notif = new Notification(R.drawable.ic_launcher,"Android calendar...", System.currentTimeMillis());
notif.setLatestEventInfo(context, from, message, contentIntent);
nm.notify(1, notif);
System.out.println("BroadcastReceiver");
}
}
Como conseguir isso
Desde já, obrigado...
Solução
Em setNotification()
você está ligando
sendBroadcast(intent);
Isso chama seu Startnotification.onReceive()
imediatamente.
Além disso, você define a HORA na instância do Calendário assim:
calendar.set(Calendar.HOUR, 9); // At the hour you wanna fire
Mas você não definiu explicitamente o indicador AM/PM para o formato de 12 horas (HOUR é usado para definir o horário de 12 horas).Isso significa que o indicador AM/PM ainda estará definido como estava quando você ligou. Calendar.getInstance()
.Se você executar este código, por exemplo, às 10h, e definir a HORA como 9, o alarme disparará imediatamente porque a hora está no passado.