Servizio di aggiornamento in esecuzione sullo background

Ho bisogno di attuare una tale procedura:

  1. Avviare un servizio di background
  2. Aggiorna il servizio con i parametri (dall'interface utente UI)
  3. Dopo l'attività ha terminato il servizio deve continuare a eseguire e preformare le richieste al server HTTP each minuto. in questa fase ho ancora bisogno dei parametri che ho aggiornato nella seconda fase – li invio al server.
  4. Il servizio dovrebbe memorizzare l'ultima risposta del server e comprare ciascuna con l'ultima. se c'è una modifica, informa l'utente.
  5. Infine, quando l'attività ricomincia, il servizio dovrebbe aggiornare l'interface utente con l'ultima risposta del server.

Quello che ho provato: BroadcastReciver – il problema è dopo che onRecive ha concluso tutti gli argomenti che non sono dichiarati come finale elimineranno, e non ho trovato un modo per aggiornare l'intento inviato automaticamente each minuto.

  • query getContentResolver causa l'avviso CursorWrapperInner
  • Rimuovi le etichette BottomNavigationView
  • tradurre l'animation
  • Come posso visualizzare la cache specifica dell'applicazione Android?
  • Come posso get il tempo "di networking" (dall'impostazione "Automatico" chiamata "Usa valori forniti dalla networking"), NON il tempo sul telefono?
  • Come avviare la transizione di elementi condivisi utilizzando i frammenti?
  • Servizio – Utilizzo di startService () – Il problema è quando l'attività ha terminato il servizio come arresti e inizia, sciacquando tutti gli argomenti. e ancora una volta non ho capito come aggiornare gli argomenti dopo che il servizio è già iniziato.

    Quindi come gestire una simile situazione?

    Grazie.

  • android java.io.IOException: Servizio non disponibile
  • Android - Google Play come tabs
  • Android: come gestire i tag HTML <img /> che sono incorporati in una string recuperata usando JSON
  • CheckBox e setOnItemClickListener non funzionano in android
  • Come impedire una visualizzazione di scorrimento da una scorrimento a una visualizzazione web dopo il caricamento dei dati?
  • non viene chiamato onUtteranceCompleted?
  • 2 Solutions collect form web for “Servizio di aggiornamento in esecuzione sullo background”

    Sembra che quello che devi fare è essere in grado di "bind" al tuo servizio. Quello che ho scritto qui sotto è un semplice model di come farlo. Per i tuoi scopi dovrai memorizzare le variables nella tua class di servizio e creare getters in modo che quando riavvii la tua attività puoi get le variables più aggiornate. Inoltre – tieni presente che iniziazione e interruzione dell'esempio di servizio riportto di seguito in onResume e onPause. Senza dubbio lo vuoi fare diversamente.

    //Activity //Bind to Service Example public class ExampleActivity extends Activity implements OnClickListener { // UI private Button binderButton; // service private MyService myService; private Intent serviceIntent; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_layout); // binder button binderButton = (Button) findViewById(R.id.button1); binderButton.setOnClickListener(this); binderButton.setText("start"); serviceIntent = new Intent(this, MyService.class); } private ServiceConnection serviceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { myService = ((MyService.MyBinder) service).getService(); } @Override public void onServiceDisconnected(ComponentName name) { myService = null; } }; @Override protected void onResume() { super.onResume(); // start the service startService(serviceIntent); // bind to the service bindService(serviceIntent, serviceConnection, Context.BIND_AUTO_CREATE); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.button1: // call method within the service myService.doServiceStuff(); break; } } @Override protected void onPause() { super.onPause(); stopService(serviceIntent); unbindService(serviceConnection); } } 

     //Service public class MyService extends Service { private final IBinder binder = new MyBinder(); @Override public IBinder onBind(Intent arg0) { return binder; } public void doServiceStuff() { task.execute(); } // create an inner Binder class public class MyBinder extends Binder { public MyService getService() { return MyService.this; } } AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... params) { Log.d("yourTag", "long running service task"); return null; } }; } 

    Grazie javaJoe, anche se la tua risposta non ha risolto il mio problema mi ha dato qualche buona idea.

    Cosa ho fatto:

    1. nell'attività suCreate, controllare se il mio servizio è in esecuzione, altrimenti crea uno nuovo e lo lega.

    2. Trasferimento di argomenti tra il servizio e l'attività utilizzando i settori e gli arbitri.

    3. nell'attività onDestroy (il problema era che il servizio denomina Self Destory) l'attività invia gli argomenti definitivi attraverso l'intento a un Broadcastreciver. Il Broadcastreciver che nuovamente inizia il Servizio, avvia l'argomento con gli argomenti corretti.

    Non so se questa architettura sia ideale, vorrei ricevere qualche riscontro.

    Ecco il codice:

    Attività:

      @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //Set Service Intent serviceIntent = new Intent(this, UpdateService.class); if (isMyServiceRunning()) { //Bind to the service bindService(serviceIntent, serviceConnection, Context.BIND_AUTO_CREATE); }else{ updateService=new UpdateService(); //Start the service startService(serviceIntent); //Bind to the service bindService(serviceIntent, serviceConnection, Context.BIND_AUTO_CREATE); } } private boolean isMyServiceRunning() { ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { if (UpdateService.class.getName().equals(service.service.getClassName())) { return true; } } return false; } private ServiceConnection serviceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { updateService = ((UpdateService.MyBinder) service).getService(); //Set Initial Args updateService.setParams(int arg0); } @Override public void onServiceDisconnected(ComponentName name) { updateService = null; } }; @Override protected void onDestroy() { //UnBind from service unbindService(serviceConnection); //Stop Service stopService(serviceIntent); //Prepare intent to broadcast reciver Intent intent = new Intent(MainActivity.this,ServiceRunnerBCR.class); intent.setAction(ServiceRunnerBCR.ACTION_SET_UpdateService); intent.putExtra(ServiceRunnerBCR.keyVal_arg0, arg0); intent.putExtra(ServiceRunnerBCR.keyVal_arg1, arg1); //Send broadcast to start UpdateService after the activity ended sendBroadcast(intent); super.onStop(); } 

    Broadcastreciver:

     public class ServiceRunnerBCR extends BroadcastReceiver { public static final String ACTION_SET_UpdateService = "ACTION_ALARM"; public static final String keyVal_arg0="ARG0"; public static final String keyVal_arg1="ARG1"; @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(ACTION_SET_UpdateService)){ updateIntent(context, intent.getDoubleExtra(keyVal_arg0, 0.02), intent.getStringExtra(keyVal_arg1)); } } private void updateIntent(Context context, double arg0, String arg1){ Intent intent = new Intent(context,UpdateService.class); intent.setAction(ACTION_SET_UpdateService); intent.putExtra(keyVal_arg0, arg0); intent.putExtra(keyVal_arg1, arg1); synchronized (this){ try { this.wait(6000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } context.startService(intent); Log.d("OREN","ServiceRunner"); } } 

    Servizio:

     public class UpdateService extends Service { private final IBinder binder = new MyBinder(); public static final String keyVal_arg0="ARG0"; public static final String keyVal_arg1="ARG1"; private Timer timer; private HTTPHandler http = new HTTPHandler(); private int test=0; double arg0=0; String arg1= ""; private TimerTask updateTask = new TimerTask() { @Override public void run() { test++; Log.d("OREN", "Timer task doing work " + test + " arg0: " + arg0); //Do some work here } }; @Override public int onStartCommand(Intent intent, int flags, int startId) { if (intent!=null){ arg0=intent.getDoubleExtra(keyVal_arg0, 0.002); arg1=intent.getStringExtra(keyVal_arg1); timer = new Timer("UpdateTimer"); timer.schedule(updateTask, 1000L, 10 * 1000L); Log.d("OREN", "ServiceStarted" + test); } return super.onStartCommand(intent, flags, startId); } @Override public IBinder onBind(Intent intent) { Log.d("OREN", "OnBind" + test); return binder; } public void setArg0(double d){ arg0=d; } // create an inner Binder class public class MyBinder extends Binder { public UpdateService getService() { return UpdateService.this; } } @Override public void onDestroy() { Log.d("OREN", "OnDestroy" + test); super.onDestroy(); } @Override public boolean onUnbind(Intent intent) { Log.d("OREN", "OnUnBind" + test); return super.onUnbind(intent); } } 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.