2016-07-02 12 views
2

Ich habe eine einfache App zum Planen einer Benachrichtigung 5 Sekunden nach dem Drücken einer Taste gesehen. Aber was ich wirklich tun möchte, ist eine Benachrichtigung zu einem bestimmten Zeitpunkt zu planen (zB die Benachrichtigung wird um 00:00 Uhr angezeigt), aber ich weiß nicht wirklich wie ich diesen Moment einstellen soll (weil ich jetzt einen " verzögern"). Hier ist der Code:Zeitplan Benachrichtigung android

public class MainActivity extends ActionBarActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
} 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.action_5: 
      scheduleNotification(getNotification("5 second delay"), 5000); 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
    } 
} 

private void scheduleNotification(Notification notification, int delay) { 

    Intent notificationIntent = new Intent(this, NotificationPublisher.class); 
    notificationIntent.putExtra(NotificationPublisher.NOTIFICATION_ID, 1); 
    notificationIntent.putExtra(NotificationPublisher.NOTIFICATION, notification); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

    long futureInMillis = SystemClock.elapsedRealtime() + delay; 
    AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 
    alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, futureInMillis, pendingIntent); 
} 

private Notification getNotification(String content) { 
    Notification.Builder builder = new Notification.Builder(this); 
    builder.setContentTitle("Scheduled Notification"); 
    builder.setContentText(content); 
    builder.setSmallIcon(R.mipmap.ic_launcher); 
    return builder.build(); 
} 

} 

Und die NotificationPublisher Klasse

public class NotificationPublisher extends BroadcastReceiver { 

public static String NOTIFICATION_ID = "notification-id"; 
public static String NOTIFICATION = "notification"; 

public void onReceive(Context context, Intent intent) { 

    NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE); 

    Notification notification = intent.getParcelableExtra(NOTIFICATION); 
    int id = intent.getIntExtra(NOTIFICATION_ID, 0); 
    notificationManager.notify(id, notification); 

} 
} 

es noch besser wäre, wenn ich wüsste, wie die Benachrichtigung, um zu planen, dass eine Benachrichtigung um 00:00 Uhr

jeden Tag erscheint

Antwort

2

Hier ist der Code für die gleiche:

public static void setNotificationScheduler(Context context) { 
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    Intent intent = new Intent(context, NotificationPublisher.class); 
    PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 999999, intent, PendingIntent.FLAG_CANCEL_CURRENT); 

    // Set the alarm to start at 00:00 
    Calendar calendar = Calendar.getInstance(); 
    calendar.setTimeInMillis(System.currentTimeMillis()); 
    calendar.set(Calendar.HOUR_OF_DAY, 0); 
    calendar.set(Calendar.MINUTE, 0); 

    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, alarmIntent); 
} 
1

Ich habe dieses Problem schon einmal gesehen. Ich würde mich freuen, Ihnen zu helfen, damit Sie nicht so viel Zeit verschwenden. Ich werde versuchen, so einfach und prägnant wie möglich zu sein.

Get the Alarm service from the system. 
Make a pending intent, passing in the broadcast receiver class's name. 
Make a calendar object and set the time of it too 8 am. 
Check if the current time is past 8. If yes then add another day to it. 
Call the set repeating method of AlarmManager class. 

Beispielcode für das gleiche:

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


    Coming to the broadcast receiver class. You need to register your broadcast receiver in the manifest. This will cause you to receive clock events. 
    Override the onReceive method of this broadcast receiver and make a notification there itself or make a seperate notification building service and build and display your notification there. 


The manifest code snippet: 

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


The broadcast receiver code snippet: 

    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); 
    } 


Notification building service code snippet: 

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

     } 

    } 

Für Hilfe Code in Bezug auf, dann ist es hier, :-http://www.singhajit.com/schedule-local-notification-in-android/ Dort gehen Sie. Das ist es. Hoffe, das hilft.

2

Was Sie suchen, ist RTC_WAKEUP.

Statt eine Verzögerung der Verwendung können Sie folgendes tun:

Calendar calendar = Calendar.getInstance(); 

calendar.setTimeInMillis(System.currentTimeMillis()); 
calendar.set(Calendar.HOUR_OF_DAY, 0); 
calendar.set(Calendar.MINUTE, 0); // For 00:00 

alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); 

Sie weitere Informationen finden Sie hier: https://developer.android.com/training/scheduling/alarms.html