2017-01-03 4 views
0

Я хочу сделать приложение для Android, в котором есть возможность пробивать и удалять. Сценарий - это когда пользователь вводит приложение, которое входит в его задачу, и нажимает кнопку punch in. Когда кнопка punch in нажата, текущая дата и время сохраняются в локальной базе данных, а таймер работает на фоновом режиме, даже я закрываю приложение, но проблема заключается в том, не может работать в фоновом режиме, когда я закрываю приложение и запускается снова. Таймер начинается с начала.Android: Секундомер (Таймер) в фоновом режиме Сервис

Как выяснить, работает ли моя служба и получить эти данные?

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

Я думаю, что poblem с вашим приемником вещания, он выходит из памяти сразу после уничтожения активности, определяет его глобально и предоставляет описание в манифесте – pkgrover

ответ

1

Почему вы хотите запустить таймер? Вместо этого просто сохраните время регистрации в общих настройках. При выезде два можно сравнить и рассчитать соответствующее время.

Если вы обеспокоены тем, что пользователь может попытаться манипулировать часами локального устройства, вместо того, чтобы получать локальное время, вы можете использовать сетевое время.

Смежные вопросы