2013-11-02 19 views
13

Zajmuję się tworzeniem aplikacji na Androida do pracy na uczelni. W tej pracy chcę utworzyć usługę w tle z licznikiem czasu i po zamknięciu aplikacji, zegar nadal działa. Gdy otwieram aplikację, widzę czas od rozpoczęcia usługi. Cóż, moim problemem jest to, że po zamknięciu aplikacji licznik czasu zatrzymuje się, a nie zwiększa się więcej.Licznik czasu w tle

Czy możesz mi pomóc? Thanks a lot

Moja klasa wyrzutnia

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


} 

i tutaj, klasa usług

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

Czy jest to wymagane, aby użyć do tego 'usługi'? Zawsze możesz przechowywać czas w milisekundach w dowolnym punkcie (w lokalnej bazie danych SQL nawet w 'SharedPreferences'), i wykonać szybką arytmetykę delta w' onResume() ', aby określić, jak długo było od akcji, którą jesteś próbowano zmierzyć. – Squagem

+0

Próbuję użyć usługi, aby otrzymać powiadomienie pokazujące godzinę. Ale twój pomysł wcale nie jest zły. – Luis

+0

Cóż, jeśli chcesz dowiedzieć się więcej o klasie "Service" (jak to zwykle bywa z klasami College), to spójrz na odpowiedź udzieloną przez @Mahfa. W przeciwnym razie uważam, że moja sugestia byłaby znacznie prostsza. – Squagem

Odpowiedz

7

trzeba uruchomić usługę w metodzie onStop() w swojej działalności tak:

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

praca dla mnie

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 
} 

myślę, że to powinno działać dla ciebie.