2013-11-02 15 views
13

Sto sviluppando un'applicazione Android per un'opera universitaria. In questo lavoro voglio creare un servizio in background con un timer e quando chiudo l'applicazione, il timer è ancora in esecuzione. Quando apro l'app, posso vedere il tempo da quando ho iniziato il servizio. Bene, il mio problema è che quando chiudo l'app, il timer dello sfondo si ferma e non aumenta di più.Timer in background

Potete aiutarmi per favore? Grazie mille

La mia classe lanciatore

import android.app.Activity; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 

public class MainActivity extends Activity { 

    private Button startButton; 
    private Button pauseButton; 

    private TextView timerValue; 

    Intent intent; 
    long timeSwapBuff = 0L; 
    long updatedTime = 0L; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     timerValue = (TextView) findViewById(R.id.timerValue); 

     startButton = (Button) findViewById(R.id.startButton); 
     startButton.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View view) { 
       intent = new Intent(MainActivity.this, CounterService.class); 
       startService(intent); 
       registerReceiver(broadcastReceiver, new IntentFilter(CounterService.BROADCAST_ACTION)); 
      } 
     }); 

     pauseButton = (Button) findViewById(R.id.pauseButton); 

     pauseButton.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View view) { 
       unregisterReceiver(broadcastReceiver); 
       stopService(intent); 
      } 
     }); 

    } 

    private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 

      updateUI(intent);  
     } 
    };  

    private void updateUI(Intent intent) { 
     int time = intent.getIntExtra("time", 0); 

     Log.d("Hello", "Time " + time); 

     int mins = time/60; 
     int secs = time % 60; 
     timerValue.setText("" + mins + ":" 
       + String.format("%02d", secs)); 
    } 


} 

e qui, la classe di servizio

import android.app.Service; 
import android.content.Intent; 
import android.os.Handler; 
import android.os.IBinder; 
import android.os.SystemClock; 

public class CounterService extends Service { 

    private Intent intent; 
    public static final String BROADCAST_ACTION = "com.javacodegeeks.android.androidtimerexample.MainActivity"; 

    private Handler handler = new Handler(); 
    private long initial_time; 
    long timeInMilliseconds = 0L; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     initial_time = SystemClock.uptimeMillis(); 
     intent = new Intent(BROADCAST_ACTION); 
     handler.removeCallbacks(sendUpdatesToUI); 
     handler.postDelayed(sendUpdatesToUI, 1000); // 1 second 

    } 

    private Runnable sendUpdatesToUI = new Runnable() { 
     public void run() { 
      DisplayLoggingInfo();   
      handler.postDelayed(this, 1000); // 1 seconds 
     } 
    };  

    private void DisplayLoggingInfo() { 

     timeInMilliseconds = SystemClock.uptimeMillis() - initial_time; 

     int timer = (int) timeInMilliseconds/1000; 
     intent.putExtra("time", timer); 
     sendBroadcast(intent); 

    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     handler.removeCallbacks(sendUpdatesToUI); 

    } 



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


} 
+0

È necessario utilizzare un 'Servizio' per questo? È sempre possibile memorizzare il tempo in millisecondi in qualsiasi momento (in un database SQL locale anche in 'SharedPreferences'), ed eseguire qualche aritmetica delta rapida all'interno di' onResume() 'per determinare quanto tempo è passato dall'azione che si è cercando di misurare si è verificato. – Squagem

+0

Sto provando ad usare un servizio, per avere una notifica che mostra l'ora. Ma la tua idea non è affatto male – Luis

+0

Beh, se sei interessato a saperne di più sulla classe 'Service' (come di solito succede con le lezioni di College), dai un'occhiata alla risposta fornita da @Mahfa. Altrimenti, credo che il mio suggerimento sarebbe molto più semplice. – Squagem

risposta

7

è necessario avviare il servizio nel metodo onStop() nella vostra attività come questo:

@Override 
    protected void onStop() { 
     super.onStop(); 
     //write your code here to start your service 
    } 
0

lavoro per me

public void onResume() { 
    super.onResume(); 

    //write your code here to start your service 

    registerReceiver(broadcastReceiver, new IntentFilter(ServiceClass.BROADCAST_ACTION)); 
} 
0
@Override 
protected void onStop() { 
    super.onStop(); 
    //write your code here to start your service 
} 

credo che questo dovrebbe funzionare per voi.