2012-03-02 309 views
0

我创建了一个倒计时器,它现在开始如果布尔值为true,如果我检测到定时器是否正在运行,会更好。有没有办法做到这一点?检测CountdownTimer是否正在运行

我创建了以下countdowntimer以下类:

public class GameActivity 
{ 
    int GameTime  = 120; 
    long GameTimeLeft = GameTime; 
    long GameMillis; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.gamemap); 

     myupdater = new Handler(); 
     GameMemory = new PreferenceHandler(this); 
     GameTimeLeft = GameMemory.getMinutesLeft(); 
     GameMillis = (GameTimeLeft * 60000); 

     if (GameMemory.getTimerSetting()) 
     { 
      Log.d("StartTimer", "Minutes Set " + (GameMillis/60000)); 
      GameTimeLeftCounter.start(); 
      GameMemory.setTimerSetting(false); 
     } 
    } 

    CountDownTimer GameTimeLeftCounter = new CountDownTimer(GameMillis, 60000) 
    { 
     public void onTick(long millisUntilFinished) 
     { 
      GameTimeLeft = millisUntilFinished/1000/60; 
      Log.d("GameTimeLeftCounter", "Time Left: " + GameTimeLeft); 
      GameMemory.setMinutesLeft(GameTimeLeft); 
     } 

     public void onFinish() 
     { 
      //GAME OVER TIMER FINISHED 
      Intent gameover = new Intent(BarcelonaTriviaGame.this, GameOver.class); 
      gameover.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 
      Log.d("TimerFinished", "Finished"); 
      startActivity(gameover); 
      finish(); 
     } 
    }; 

回答

0

通过你提什么活动应该不会再次出现,一种方法是调用完成()调用的意图之前。有了这个,活动不会被保存在android堆栈中。如果你想结束游戏,那就叫FLAG KEEP NO HISTORY。这将关闭排列在堆栈顶部以下的所有活动。

+0

嗨,活动应该出现再次,但现在它每次都用startActivity('intent')重新创建,这也意味着定时器重新开始,所以无限的游戏时间。我在该活动后面使用了更多活动,所以我宁愿直接调用该活动而不是使用finish(); – Diego 2012-03-02 12:46:50

+0

这意味着你的onCreate被再次调用。一种方法是设置布尔值和检查。如果(真)定时器运行,否则如果(假)启动定时器。 – 2012-03-02 13:02:32

+0

嗨Rashmi,但我如何检查计时器是否正在运行? – Diego 2012-03-02 13:36:37

1

尝试android:launchMode="singleInstance"在清单

+0

我仍然得到多个计时器,我想我需要为意图添加一些标志,所以它会调用暂停的活动,而不是在旧的旁边创建一个新的。 – Diego 2012-03-02 13:07:26

2

正如你所说,你要使用的计时器在你的游戏,你想要做的游戏结束所以最好的办法了一段时间后是Alarmmanager. 当您启动游戏设置等待服务使用警报管理器。所以在时间到期后,警报管理器将启动该服务,以便该服务将广播发送到游戏结束的播放活动。

而且,如果您想要处理恢复和暂停功能,当用户单击暂停按钮时,只需取消挂起的意图并将该持续时间保存在首选项文件中即可。 ,当用户点击恢复按钮时,只需从首选项中获取时间并计算剩余时间并使用警报管理器设置服务的待定意图。

您不用担心要完成或重新创建的活动。

+0

那么是否还有可能持续显示剩余的分钟? – Diego 2012-03-02 13:33:57

+0

是的,您可以通过启动服务或线程并根据它更新UI来显示剩余的分钟数。 – Dharmendra 2012-03-02 13:36:51

+0

当您开始游戏或恢复游戏时,请启动额外的服务或线程,并计算剩余分钟数并使用广播接收器更新UI或仅使用处理程序。 – Dharmendra 2012-03-02 13:38:15

1

如果你想要一个计时器,我认为一个好主意是创建一个自定义计时器对象的单例实例。每次您想调用使用您刚刚启动活动的时间的活动并将您的计时器对象应用于视图时。关于这一点的好处是,您可以在应用程序中的任何地方同时参考(即状态栏或暂停菜单)。

Bill Pugh @http://en.wikipedia.org/wiki/Singleton_pattern的解决方案是一个很好的单例设计模式。

+0

为了节省你应该实现一个私有方法来启动计时器,然后从私有构造函数中调用这个私有方法。这将保护定时器不被其他使用该类的开发人员重新启动,并保证在第一次使用该设备时启动定时器 - 即调用myTime.getInstance()。 – jjNford 2012-03-02 14:43:40

1

什么绢麻奎瓦斯说,但在清单采用Android的游戏活动节点类似:发射模式=“singleTask”

为此,你需要什么,而不是singleInstance ..

+0

我仍然得到多重效应,但它没有显示中间的黑屏。如果我设法检查计时器是否正在运行,那么我可以控制启动和暂停 – Diego 2012-03-02 15:10:13

相关问题