2016-07-10 105 views
0

我正在嘗試爲Android創建一個簡單的秒錶。它應該在最小化應用程序後繼續計算時間。我已將秒錶邏輯放入服務中,並將此服務綁定到MainActivity以控制它。計算時間在單獨的線程中運行,我使用Messenger將時間發送回MainActivity。只要我不會最小化應用程序並在秒錶運行時返回,一切都可以正常工作。之後,按下開始/停止按鈕運行第二個線程計數時間,而不是停止第一個。可以檢查什麼是錯的?將不勝感激:)秒錶與服務在後臺運行

這裏是Java類:

public class MainActivity extends Activity { 

    public static Handler sHandler; 
    private final int playPause = 0; 
    private final int reset = 1; 
    private int secs = 0; 
    private int mins = 0; 
    private int millis = 0; 
    private long currentTime = 0L; 
    private boolean isBound = false; 
    private MyService myService; 
    private Intent intent; 
    @BindView(R.id.timer) 
    TextView time; 



    @OnClick(R.id.fab_playPause) 
    public void playPause() { 

     myService.startStop(); 

    } 

    @OnClick(R.id.fab_reset) 
    public void reset() { 

     myService.reset(); 
     mins = 0; 
     secs = 0; 
     millis = 0; 
     setTime(); 

    } 

    @OnClick(R.id.fab_exit) 
    public void exit() { 
     onDestroy(); 
    } 

    @OnClick(R.id.fab_save) 
    public void save() { 


    } 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     ButterKnife.bind(this); 

     intent = new Intent(this, MyService.class); 

     MainActivity.sHandler = new Handler() { 

      @Override 
      public void handleMessage(Message timeMsg) { 
       super.handleMessage(timeMsg); 

       currentTime = Long.valueOf(timeMsg.obj.toString()); 

       secs = (int) (currentTime/1000); 
       mins = secs/60; 
       secs = secs % 60; 
       millis = (int) (currentTime % 1000); 
       setTime(); 
      } 
     }; 


    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 

     bindService(intent, myConnection, Context.BIND_AUTO_CREATE); 

    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     stopService(intent); 
     finishAffinity(); 

    } 

    private ServiceConnection myConnection = new ServiceConnection() { 
     @Override 
     public void onServiceConnected(ComponentName name, IBinder service) { 

      MyService.LocalBinder binder = (MyService.LocalBinder) service; 
      myService = binder.getService(); 
      isBound = true; 
     } 

     @Override 
     public void onServiceDisconnected(ComponentName name) { 
      isBound = false; 
     } 
    }; 

    public void setTime() { 
     time.setText("" + mins + ":" + String.format("%02d", secs) + ":" 
       + String.format("%03d", millis)); 
    } 

} 

和:

public class MyService extends Service { 

    private boolean isRunning = false; 
    private long startTime = 0; 
    private long timeInMilliseconds = 0; 
    private long timeSwapBuff = 0; 
    private long updatedTime = 0; 
    private final IBinder mBinder = new LocalBinder(); 
    private Message timeMsg; 

    public MyService() { } 

    public Runnable updateTimer = new Runnable() { 
     public void run() { 
      timeInMilliseconds = SystemClock.uptimeMillis() - startTime; 
      updatedTime = timeSwapBuff + timeInMilliseconds; 
      Log.d("Czas:", String.valueOf(updatedTime)); 

      timeMsg = new Message(); 
      timeMsg.obj = updatedTime; 
      MainActivity.sHandler.sendMessage(timeMsg); 

      MainActivity.sHandler.postDelayed(this, 0); 
     } 
    }; 

    @Override 
    public void onCreate(){ 
     super.onCreate(); 

    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return mBinder; 
    } 


    public void startStop(){ 

     if (isRunning) { 
      timeSwapBuff += timeInMilliseconds; 
      MainActivity.sHandler.removeCallbacks(updateTimer); 
      isRunning = false; 
     } else { 
      startTime = SystemClock.uptimeMillis(); 
      MainActivity.sHandler.postDelayed(updateTimer, 0); 
      isRunning = true; 
     } 
    } 


    public void reset(){ 

     MainActivity.sHandler.removeCallbacks(updateTimer); 
     isRunning=false; 
     startTime = 0L; 
     timeInMilliseconds = 0L; 
     timeSwapBuff = 0L; 
     updatedTime = 0L; 

     timeMsg = new Message(); 
     timeMsg.obj = updatedTime; 
     MainActivity.sHandler.sendMessage(timeMsg); 

    } 

    public class LocalBinder extends Binder { 
     public MyService getService(){ 
      return MyService.this; 
     } 
    } 


} 

和GitHub的鏈接:https://github.com/zelaznymarek/stoper

+1

好吧。在onCreate中綁定服務,而不是在onResume中,並在bindService之前添加startService。我認爲綁定就足夠了:) – ajron

回答

0

1)從延伸服務類服務就像

public class AlarmService extends Service {... 

2)回報您的服務STICKY像

 return Service.START_STICKY; 

3)使用CountDownTimer或定時器或簡單的花紋類;