2015-12-29 4 views
12

Ich möchte zu einer bestimmten Zeit eine Benachrichtigung an meine App senden. Sag jeden Tag, dass ich um 7 Uhr morgens eine Benachrichtigung geben muss, auch wenn die App geschlossen ist.Wie Benachrichtigungen auf bestimmte Zeit zu geben?

Wie kann ich das tun? Irgendein Tutorial? Bitte erwähnen Sie den Link.

Antwort

18

Zuerst müssen Sie einen Broadctreceiver verwenden. und weil ein Rundfunkempfänger nach oben nur für eine kurze Zeit

aus dem Android Entwickler blog.When Umgang mit einer Sendung, wird die Anwendung einen festen Satz von Zeit gegeben (zur Zeit 10 Sekunden), in der seine Arbeit zu tun. Wenn sie in dieser Zeit nicht abgeschlossen wird, wird die Anwendung als fehlerhaft angesehen und ihr Prozess wird sofort in den Hintergrundzustand versetzt, um bei Bedarf für den Speicher gelöscht zu werden.

es ist eine bessere Praxis zu verwenden, auch Intent-Service hier haben Sie ein Beispiel, wie es geht.

Dies ist die Broadcast-Receiver-Klasse.

public class MyReceiver extends BroadcastReceiver { 
    public MyReceiver() { 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     Intent intent1 = new Intent(context, MyNewIntentService.class); 
     context.startService(intent1); 
    } 
} 

und im Manifest registrieren.

<receiver 
    android:name=".MyReceiver" 
    android:enabled="true" 
    android:exported="false" > 
</receiver> 

Dies ist die Absicht Serviceklasse.

public class MyNewIntentService extends IntentService { 
    private static final int NOTIFICATION_ID = 3; 

    public MyNewIntentService() { 
     super("MyNewIntentService"); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     Notification.Builder builder = new Notification.Builder(this); 
      builder.setContentTitle("My Title"); 
      builder.setContentText("This is the Body"); 
      builder.setSmallIcon(R.drawable.whatever); 
     Intent notifyIntent = new Intent(this, MainActivity.class); 
     PendingIntent pendingIntent = PendingIntent.getActivity(this, 2, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
     //to be able to launch your activity from the notification 
     builder.setContentIntent(pendingIntent); 
     Notification notificationCompat = builder.build(); 
     NotificationManagerCompat managerCompat = NotificationManagerCompat.from(this); 
     managerCompat.notify(NOTIFICATION_ID, notificationCompat); 
    } 
} 

und registrieren Sie es im Manifest.

<service 
    android:name=".MyNewIntentService" 
    android:exported="false" > 
</service> 

und dann in Ihrer Tätigkeit stellen Sie den Alarm Krippe der Rundfunkempfänger zu einem bestimmten Zeitpunkt und verwenden Alarmmanager setRepeating Methode starten es dieses Beispiel zu wiederholen, unten wird es jeden Tag wiederholen.

Intent notifyIntent = new Intent(this,MyReceiver.class); 
PendingIntent pendingIntent = PendingIntent.getBroadcast 
      (context, NOTIFICATION_REMINDER_NIGHT, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 
      1000 * 60 * 60 * 24, pendingIntent); 

Ich hoffe, das wird Ihnen helfen.

+0

Nicht für mich funktioniert, mit manuell eingestellten Zeit versucht, aber immer noch nicht arbeiten. –

+0

Gründe für die Verwendung von Broadcasts? Sieh das nicht als notwendig/nützlich an. Sie können mit einem PendingIntent direkt mit Ihrem IntentService sprechen. – Zordid

6

können Sie AlarmManager verwenden Alarm einstellen zu bestimmten Zeit

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
if (!prefs.getBoolean("firstTime", false)) { 

    Intent alarmIntent = new Intent(this, AlarmReceiver.class); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, 0); 

    AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 

    Calendar calendar = Calendar.getInstance(); 
    calendar.setTimeInMillis(System.currentTimeMillis()); 
    calendar.set(Calendar.HOUR_OF_DAY, 7); 
    calendar.set(Calendar.MINUTE, 0); 
    calendar.set(Calendar.SECOND, 1); 

    manager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 
      AlarmManager.INTERVAL_DAY, pendingIntent); 

    SharedPreferences.Editor editor = prefs.edit(); 
    editor.putBoolean("firstTime", true); 
    editor.apply(); 
} 

I SharedPreferences überprüft, das ist nicht das erste Mal, um die App zu laufen und wenn es ist, setzen Sie das Alarm sonst nichts tun, anstatt das Zurücksetzen der Alarm jedes Mal, wenn Sie Ihre App starten.
Verwenden Sie ein BroadcastReceiver zu hören, wenn der Alarm passiert

public class AlarmReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     // show toast 
     Toast.makeText(context, "Alarm running", Toast.LENGTH_SHORT).show(); 
    } 
} 

einen anderen Empfänger verwenden, um Gerät bootet zu hören, so dass Sie den Alarm zurücksetzen

public class DeviceBootReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) { 
      // on device boot compelete, reset the alarm 
      Intent alarmIntent = new Intent(context, AlarmReceiver.class); 
      PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, 0); 

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

      Calendar calendar = Calendar.getInstance(); 
      calendar.setTimeInMillis(System.currentTimeMillis()); 
      calendar.set(Calendar.HOUR_OF_DAY, 7); 
      calendar.set(Calendar.MINUTE, 0); 
      calendar.set(Calendar.SECOND, 1); 

      manager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 
        AlarmManager.INTERVAL_DAY, pendingIntent); 
     } 
    } 
} 

fügen Sie die Erlaubnis zum Manifest

<uses-permission android:name="android.permission.WAKE_LOCK" /> 
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 

dann registrieren Sie Ihre Empfänger

<receiver android:name=".DeviceBootReceiver"> 
    <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED" /> 
    </intent-filter> 
</receiver> 
<receiver android:name=".AlarmReceiver" /> 
+0

Was ist, wenn es eine Benachrichtigung beim Öffnen der App auch senden soll? – Si8

+0

Sie können den Benachrichtigungscode in der 'onCreate()' Methode Ihrer Launcher-Aktivität hinzufügen. – SaNtoRiaN

+0

Danke für Ihre Antwort. Wie würde die 'SharedPReference' für den nächsten Tag funktionieren? Weil der Boolesche Wert falsch ist – Si8

Verwandte Themen