2017-01-03 2 views
0

Ich möchte eine Android-Anwendung, die Punch-in und Punch-Out-Funktionalität haben. Szenario ist, wenn der Benutzer in einer Anwendung eingegeben wird, gibt es seine Aufgabe und drücken Sie die Einstempeltaste, wenn Punch-in-Taste drücken aktuelle Datum und Uhrzeit in einer lokalen Datenbank gespeichert ist und Timer im Hintergrund läuft, auch wenn ich eine Anwendung schließe, ist es ein Problem kann nicht im Hintergrund ausgeführt werden, wenn ich eine Anwendung schließe und neu startet, startet der Timer von Anfang an.Android: Stoppuhr (Timer) im Hintergrund Service

Wie finde ich heraus, dass mein Dienst läuft und diese Daten bekommen?

MainActivity.java

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.activity_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, MyService.class); 
      startService(intent); 
      registerReceiver(broadcastReceiver, new IntentFilter(MyService.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)); 
} 

@Override 
protected void onStop() { 
    super.onStop(); 
    intent = new Intent(MainActivity.this, MyService.class); 
    startService(intent); 
    registerReceiver(broadcastReceiver, new IntentFilter(MyService.BROADCAST_ACTION)); 
} 


} 

MyService.java

import android.app.Service; 
import android.content.Intent; 
import android.os.Handler; 
import android.os.IBinder; 
import android.os.SystemClock; 
import android.support.annotation.Nullable; 
import android.widget.Toast; 


public class MyService extends Service 
{ 
private Intent intent; 
public static final String BROADCAST_ACTION = "com.example.wajid.service"; 

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

Ich denke, Poblem ist mit Ihrem Broadcast-Empfänger es geht aus dem Speicher direkt nach der Aktivität zerstört, definieren Sie es global und liefern Beschreibung in Manifest – pkgrover

Antwort

1

Warum Sie einen Timer laufen wollen? Speichern Sie stattdessen einfach die Check-in-Zeit in den gemeinsamen Einstellungen. Beim Check-out können die beiden verglichen und die relevante Zeit berechnet werden.

Wenn Sie befürchten, dass der Benutzer versuchen könnte, die lokale Geräteuhr zu manipulieren, können Sie statt der lokalen Zeit die Netzwerkzeit verwenden.