2016-07-02 17 views
2

私はボタンを押してから5秒後に通知をスケジュールする簡単なアプリを見ました。しかし、私が本当にやりたいことは、特定の時間に通知をスケジュールすることです(例えば、通知は00:00に表示されます)。しかし、私は本当にその瞬間をどのように設定するか分かりません(今は "ディレイ")。スケジュール通知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(); 
} 

} 

そして、私が通知00:00

答えて

2

は同じのためのコードです:

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
で日常表示されていることを順番に通知をスケジュールする方法を知っていた場合であっても良いだろう

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

} 
} 

NotificationPublisherクラス: は、ここでは、コードです

私は前にこの問題に直面しました。だから私はあなたを助けてくれることをうれしく思っています。私はできるだけシンプルで簡潔にしようと努力しますので、時間を無駄にすることはありません。

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. 

同じサンプルコード:

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

     } 

    } 

ヘルプ用のコードにについては、それはあなたが行くあり、ここで:-http://www.singhajit.com/schedule-local-notification-in-android/ 可能です。それでおしまい。 これが役立つことを願っています。

2

あなたが探しているものはRTC_WAKEUPです。

代わりに、あなたは次のことを行うことができ、遅延を使用する:

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

あなたはここでより多くの情報を見つけることができます:ここではhttps://developer.android.com/training/scheduling/alarms.html

関連する問題