tareas - servicios en segundo plano android studio
Iniciar el servicio de Android después de cada 5 minutos (3)
A continuación, proporcioné tres archivos, MainActivity.java para el servicio de inicio, el segundo archivo MyService.java que brinda el servicio de 5 minutos y el tercero es el archivo de manifiesto.
MainActivity.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startService(new Intent(this, MyService.class)); //start service which is MyService.java
}
}
MyService.java
public class MyService extends Service {
public static final int notify = 300000; //interval between two services(Here Service run every 5 Minute)
private Handler mHandler = new Handler(); //run on another Thread to avoid crash
private Timer mTimer = null; //timer handling
@Override
public IBinder onBind(Intent intent) {
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public void onCreate() {
if (mTimer != null) // Cancel if already existed
mTimer.cancel();
else
mTimer = new Timer(); //recreate new
mTimer.scheduleAtFixedRate(new TimeDisplay(), 0, notify); //Schedule task
}
@Override
public void onDestroy() {
super.onDestroy();
mTimer.cancel(); //For Cancel Timer
Toast.makeText(this, "Service is Destroyed", Toast.LENGTH_SHORT).show();
}
//class TimeDisplay for handling task
class TimeDisplay extends TimerTask {
@Override
public void run() {
// run on another thread
mHandler.post(new Runnable() {
@Override
public void run() {
// display toast
Toast.makeText(MyService.this, "Service is running", Toast.LENGTH_SHORT).show();
}
});
}
}
}
AndroidManifest.xml
<service android:name=".MyService" android:enabled="true" android:exported="true"></service>
Estuve buscando en Internet los últimos 2 días, pero no encontré ningún tutorial útil. He creado un servicio y estoy enviando una notificación en la barra de estado cuando se inicia el servicio. Quiero que el servicio se detenga después de mostrar la notificación y volver a iniciarlo después de 5 minutos. Por favor, avíseme si es posible y bríndeme algunos tutoriales útiles si tiene alguno. Escuché sobre TimerTask
y AlarmManager
y traté de usarlos también, pero no pude obtener el resultado deseado.
EDITAR: Necesito que el servicio se inicie cada 5 minutos, incluso si mi aplicación no se está ejecutando.
Crea un objeto Timer
y dale una TimerTask
que realice el código que te gustaría realizar.
Timer timer = new Timer ();
TimerTask hourlyTask = new TimerTask () {
@Override
public void run () {
// your code here...
}
};
// schedule the task to run starting now and then every hour...
timer.schedule (hourlyTask, 0l, 1000*60*60); // 1000*10*60 every 10 minut
La ventaja de usar un objeto Timer es que puede manejar múltiples objetos TimerTask, cada uno con su propio tiempo, demora, etc. También puede iniciar y detener los temporizadores siempre que mantenga presionado el objeto Timer al declararlo como una clase Variable o algo así.
No desea utilizar una TimerTask
ya que esto depende de que su aplicación se ejecute continuamente. Una implementación de AlarmManager
hace que sea seguro que su aplicación sea eliminada entre ejecuciones.
Afirmar que intentó usar AlarmManager
pero no obtuvo el resultado deseado no es una declaración útil, ya que no le dice a nadie cómo ayudarlo a hacerlo bien. Sería mucho más útil expresar lo que sucedió.
http://code4reference.com/2012/07/tutorial-on-android-alarmmanager/ contiene lo que parece ser un tutorial útil sobre AlarmManager
. Aquí están los puntos más destacados:
1) Su alarma provocará que se dispare una Intent
cuando caduque. Depende de usted decidir qué tipo de Intent
y cómo debe implementarse. El enlace que proporcioné tiene un ejemplo completo basado en un BroadcastReceiver.
2) Puedes instalar tu alarma con un ejemplo como:
public void setOnetimeTimer(Context context) {
AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
intent.putExtra(ONE_TIME, Boolean.TRUE);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (1000 * 60 * 5), pi);
}