2013-05-05 15 views
7

Cosa voglio fare nella mia app: 1. Quando l'utente apre l'app, sarà in grado di vedere un conto alla rovescia già in esecuzione. In tal caso, voglio mostrare i numeri del conto alla rovescia in una visualizzazione testuale che verrà aggiornata ogni secondo. 2. L'utente sarà in grado di fermarlo. 3. L'utente può lasciare l'applicazione, ma il conto alla rovescia dovrebbe continuare e mostrare l'ora aggiornata quando ritorna all'interfaccia utente dell'applicazione.Implementazione di un conto alla rovescia con Servizio in background

Quindi, in base ai punti precedenti, capisco che è necessario implementare il servizio che funziona in background. Ho letto il link this ma il mio problema riguarda l'implementazione. Sono abbastanza perso su come implementare in quel modo. Detto questo, non riesco nemmeno a pensare a un modo per mostrare il tempo nell'interfaccia utente una volta che l'utente torna all'applicazione. Ho anche visto this link, ma non sono sicuro che l'implementazione di CountDownTimer lo renda un servizio in esecuzione. Quindi, come devo procedere e implementarlo? Qualsiasi link a tutorial/codici specifici è apprezzato. Grazie.

AGGIORNAMENTI: io sono stati finora in grado di effettuare le seguenti operazioni: MainActivity.java

public class MainActivity extends Activity { 

Button btnStart,btnStop; 
Intent serviceIntent; 
TextView tv; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    btnStart = (Button) findViewById(R.id.btnStart); 
    btnStop = (Button) findViewById(R.id.btnStop); 
    tv = (TextView) findViewById(R.id.timeView); 

    //final MyCounter timer = new MyCounter(100000,1000); 
    //tv.setText("100"); 
    //timer.start(); 
    serviceIntent = new Intent(MainActivity.this,MyService.class); 

    btnStart.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      startService(serviceIntent); 
     } 
    }); 

    btnStop.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      stopService(serviceIntent); 
     } 
    }); 
} 
@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; 
} 

MyService.java:

public class MyService extends Service { 

MyCounter timer; 
@Override 
public void onCreate() { 
    // TODO Auto-generated method stub 
    timer = new MyCounter(100000,1000); 
    super.onCreate(); 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    // TODO Auto-generated method stub 
    timer.start(); 
    return super.onStartCommand(intent, flags, startId); 
} 
private class MyCounter extends CountDownTimer{ 

    public MyCounter(long millisInFuture, long countDownInterval) { 
     super(millisInFuture, countDownInterval); 
    } 

    @Override 
    public void onFinish() { 
     Toast.makeText(getApplicationContext(), "death", Toast.LENGTH_LONG).show(); 
     stopSelf(); 
    } 

    @Override 
    public void onTick(long millisUntilFinished) { 

     Toast.makeText(getApplicationContext(), (millisUntilFinished/1000)+"", Toast.LENGTH_SHORT).show(); 
    } 
} 

@Override 
public void onDestroy() { 
    // TODO Auto-generated method stub 
    timer.cancel(); 
    //stopSelf(); 
    super.onDestroy(); 

} 

@Override 
public IBinder onBind(Intent arg0) { 
    // TODO Auto-generated method stub 
    return null; 
} 

    } 

Il problema è: 1. non lo faccio sapere come mostrare il conto alla rovescia sull'interfaccia utente MainActivity a parte questo Toast. 2. Non smette di contare quando premo il pulsante Stop.

+0

Penso che si possa utilizzare trasmissioni come una comunicazione, questo vi aiuterà. –

+0

@GhalebKhaled potresti spiegare l'implementazione? Ho visto un tutorial di vogella http://www.vogella.com/articles/AndroidServices/article.html e non ho potuto aiutarmi a capire come vengono chiamati i ricevitori di broadcast. – Arefin

+0

controllo http://www.vogella.com/articles/AndroidBroadcastReceiver/article.html e http://www.edureka.in/blog/android-tutorials-broadcast-receivers/ sperando che questo vi aiuterà a –

risposta

1

utilizzare bindService (servizio Intent, connessione ServiceConnection, flag int) per collegare il servizio conto alla rovescia, quindi nel servizio, restituire il raccoglitore che contiene il conteggio e nella propria attività un oggetto ServiceConnection istanziato può gestire il raccoglitore. AIDL può fare anche questo, suggerire di dare un'occhiata a come legare prima il servizio, il desiderio può aiutarti.

demo

public class BindService extends Service{ 
private int count; 
private boolean quit; 
private MyBinder binder = new MyBinder(); 
// My Binder 
public class MyBinder extends Binder 
{ 
    public int getCount() 
    { 
     // get the counting status:count 
     return count; 
    } 
} 

@Override 
public IBinder onBind(Intent intent) 
{ 
    System.out.println("Service is Binded"); 
    // return the binder instance 
    return binder; 
} 

@Override 
public void onCreate() 
{ 
    super.onCreate(); 
    System.out.println("Service is Created"); 
    // counting work 
    new Thread() 
    { 
     @Override 
     public void run() 
     { 
      while (!quit) 
      { 
       try 
       { 
        Thread.sleep(1000); 
       } 
       catch (InterruptedException e) 
       { 
       } 
       count++; 
      } 
     } 
    }.start();  
} 
// invoke when the service unbind 
@Override 
public boolean onUnbind(Intent intent) 
{ 
    System.out.println("Service is Unbinded"); 
    return true; 
} 

@Override 
public void onDestroy() 
{ 
    super.onDestroy(); 
    this.quit = true; 
    System.out.println("Service is Destroyed"); 
} 

@Override 
public void onRebind(Intent intent) 
{ 
    super.onRebind(intent); 
    this.quit = true; 
    System.out.println("Service is ReBinded"); 
} 

}

e quindi l'attività

public class MainActivity extends Activity{ 
Button bind , unbind , getServiceStatus; 
BindService.MyBinder binder; 
// define a ServiceConnection object 
private ServiceConnection conn = new ServiceConnection() 
{ 
    // then the Activity connected with the Service, this will be called 
    @Override 
    public void onServiceConnected(ComponentName name 
     , IBinder service) 
    { 
     System.out.println("--Service Connected--"); 
     // achieve MyBinder instance 
     binder = (BindService.MyBinder) service; 
    } 
    // then the connection break off 
    @Override 
    public void onServiceDisconnected(ComponentName name) 
    { 
     System.out.println("--Service Disconnected--");   
    } 
}; 
@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    bind = (Button) findViewById(R.id.bind); 
    unbind = (Button) findViewById(R.id.unbind); 
    getServiceStatus = (Button) findViewById(R.id.getServiceStatus); 

    final Intent intent = new Intent(); 

    intent.setAction("org.crazyit.service.BIND_SERVICE");  
    bind.setOnClickListener(new OnClickListener() 
    { 
     @Override 
     public void onClick(View source) 
     { 
      //bind Serivce 
      bindService(intent , conn , Service.BIND_AUTO_CREATE); 
     } 
    }); 
    unbind.setOnClickListener(new OnClickListener() 
    { 
     @Override 
     public void onClick(View source) 
     { 
      //unbind Serivce 
      unbindService(conn); 
     } 
    }); 
    getServiceStatus.setOnClickListener(new OnClickListener() 
    { 
     @Override 
     public void onClick(View source) 
     { 
      // Toast to show the conut value 
      Toast.makeText(MainActivity.this 
       , "Serivce's count value is:" + binder.getCount() 
       , 4000) 
       .show(); 
     } 
    }); 
}} 
+0

provato con bindService. il fatto è che io sono nuovo in Android e cose non è sempre abbastanza chiaro quando si tratta dell'implementazione potresti chiarire un po 'di più mostrandolo nel codice? – Arefin

+0

OK, ecco la mia demo, modificherò la mia risposta per mostrarti. – 3h3

+0

quando faccio clic sul pulsante di stato del servizio, l'app si blocca :( – Arefin

Problemi correlati