2015-12-29 17 views

risposta

18

Per prima cosa è necessario utilizzare un broadcastreceiver. e perché un ricevitore di trasmissione solo per un breve periodo

dal blog degli sviluppatori Android. Quando si gestisce una trasmissione, all'applicazione viene assegnato un intervallo di tempo fisso (attualmente 10 secondi) in cui eseguire il proprio lavoro. Se non si completa in quel momento, l'applicazione è considerata malfatta e il suo processo immediatamente gettato nello stato di sfondo per essere ucciso per la memoria, se necessario.

è una pratica migliore per utilizzare anche il servizio di intenti qui avete un esempio come farlo.

questa è la classe del ricevitore di trasmissione.

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

e registrarlo nel manifest.

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

questa è la classe di servizio intent.

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

e registrarlo nel manifest.

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

e poi nella vostra attività impostare la mangiatoia di allarme per avviare il ricevitore di broadcast in un momento specifico e utilizzare il metodo AlarmManager setRepeating ripeterlo questo esempio Bellow si ripeterà ogni giorno.

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

spero che questo ti possa aiutare.

+0

Non funziona per me, provato con il tempo impostato manualmente ma non funzionerà ancora. –

+0

Qualche motivo per utilizzare le trasmissioni? Non vederlo come necessario/utile. È possibile parlare direttamente con IntentService con PendingIntent. – Zordid

6

È possibile utilizzare AlarmManager per impostare l'allarme a tempo specificato

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

ho usato SharedPreferences per verificare che non è la prima volta per eseguire l'applicazione e se lo è, è possibile impostare l'allarme altrimenti non fa nulla, invece di reset l'allarme ogni volta che avvii la tua app.
Utilizzare un BroadcastReceiver per ascoltare quando l'allarme accade

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

utilizzare un altro ricevitore per ascoltare avvio del dispositivo in modo da poter ripristinare l'allarme

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

aggiungere l'autorizzazione al manifesto

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

quindi registra i tuoi ricevitori

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

E se è necessario inviare una notifica quando si apre l'app? – Si8

+0

È possibile aggiungere il codice di notifica nel metodo 'onCreate()' della propria attività di avvio. – SaNtoRiaN

+0

Grazie per la risposta. Come funzionerebbe il 'SharedPReference' per il giorno successivo? Perché il booleano sarà falso – Si8

Problemi correlati