2013-11-02 15 views
13

Ich entwickle eine Android-Anwendung für eine College-Arbeit. In dieser Arbeit möchte ich einen Hintergrunddienst mit einem Timer erstellen und wenn ich die Anwendung schließe, wird der Timer weiterhin ausgeführt. Wenn ich die App öffne, kann ich die Zeit seit dem Beginn des Dienstes sehen. Nun, mein Problem ist, dass wenn ich die App schließe, der Hintergrundtimer stoppt und nicht mehr erhöht.Timer im Hintergrund

Können Sie mir bitte helfen? Vielen Dank

My Launcher Klasse

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


} 

und hier, die Serviceklasse

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

Ist es eine Voraussetzung, dass Sie dafür einen 'Service' verwenden? Sie können die Zeit jederzeit in Millisekunden speichern (in einer lokalen SQL-Datenbank sogar in 'SharedPreferences') und eine schnelle Delta-Arithmetik innerhalb von 'onResume()' ausführen, um festzustellen, wie lange es seit Ihrer Aktion vergangen ist versuchen zu messen aufgetreten. – Squagem

+0

Ich versuche einen Dienst zu verwenden, um eine Benachrichtigung mit der Uhrzeit zu erhalten. Aber Ihre Idee ist gar nicht schlecht – Luis

+0

Nun, wenn Sie mehr über die 'Service'-Klasse erfahren möchten (wie es normalerweise bei College-Klassen der Fall ist), dann schauen Sie sich die Antwort von @Mahfa an. Ansonsten glaube ich, dass mein Vorschlag viel einfacher wäre. – Squagem

Antwort

7

Sie müssen Ihren Dienst in der onStop() Methode in Ihrer Tätigkeit wie folgt starten:

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

Arbeit für mich

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 
} 

Ich denke, das für Sie arbeiten sollten.