【问题标题】:How to build a global timer that appears in all app screens如何构建一个出现在所有应用程序屏幕中的全局计时器
【发布时间】:2020-01-02 10:37:49
【问题描述】:

我想构建一个具有值增量的全局计时器,并使用 Chronometer 出现在所有应用程序活动中,如何使 Chronometer 值对所有应用程序都是全局的?

【问题讨论】:

    标签: android global-variables chronometer


    【解决方案1】:

    使用静态方法初始化getInstance并检索值getFormatedTime()。

    public class CounterClass  extends CountDownTimer{
    
    private static String hms;
    private static CounterClass instance;
    
    private CounterClass(long millisInFuture, long countDownInterval){
        super(millisInFuture,countDownInterval);
    }
    
    public static CounterClass  initInstance(long millisInFuture, long countDownInterval){
        if(instance==null){
            instance =  new CounterClass(millisInFuture,countDownInterval);
        }
        return instance;
    }
    
    public static CounterClass  getInstance() throws Exception{
        if(instance==null){
            throw new Exception("Parameters not initialized. Initiate with initInstance");
        }else{
            return instance;
        }
    }
    
    public static String getFormatedTime(){
        return hms;
    }
    @Override
    public void onTick(long l) {
    
        long millis= l;
        hms= String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millis),
                TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
                TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))
        );
    }
    @Override
    public void onFinish() {
    
    }
    }
    

    我已经修改了代码。

    为了启动 CounterClass,请执行以下操作。

    CounterClass counterClass = CounterClass.initInstance(180000, 1000);
    counterClass.start();
    

    用于访问前一个值

    try {
          CounterClass counterClass = CounterClass.getInstance();
          Log.i("TAG 222", counterClass.getFormatedTime());
         } catch (Exception e) {
           e.printStackTrace();
           // counter class is not initiated , access initInstance
         }
    

    由于 android.os.CountDownTimer 没有默认构造函数,这是我们可以满足您的要求的方式

    【讨论】:

      【解决方案2】:

      你可以试试这个很简单

      将此添加到 xml

         <android.support.design.widget.CoordinatorLayout
      
                              xmlns:android="http://schemas.android.com/apk/res/android"
                              xmlns:app="http://schemas.android.com/apk/res-auto"
                              android:id="@+id/coordinatorLayout"
                              android:layout_width="match_parent"
                              android:layout_height="match_parent">
      
                              <Chronometer
                                  android:id="@+id/simpleChronometer"
                                  android:layout_width="125dp"
                                  android:layout_height="40dp"
                                  android:layout_gravity="end"
                                  android:layout_marginStart="8dp"
                                  android:layout_marginTop="20dp"
                                  android:layout_marginEnd="20dp"
                                  android:gravity="center"
                                  android:textColor="@color/white" />
      
                                          <Button
                                              android:id="@+id/next"
                                              android:layout_width="0dp"
                                              android:layout_height="match_parent"
                                              android:layout_weight="1"
                                              android:background="@color/green"
                                              android:gravity="center"
                                              android:text="@string/next"
                                              android:textColor="@color/white" />
                          </android.support.design.widget.CoordinatorLayout>
      

      将此添加到您的 firstActivity

      public class firstActivity extends AppCompatActivity  {
      
          private Button Next;
          private Chronometer simpleChronometer;
          Long base, timeDeviceImages;
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setTheme(R.style.full_screen);
              setContentView(R.layout.activity_first);
      
              Next = (Button) findViewById(R.id.next);
      
              simpleChronometer = (Chronometer) findViewById(R.id.simpleChronometer);
              simpleChronometer.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {
                  @Override
                  public void onChronometerTick(Chronometer cArg) {
                      long time = SystemClock.elapsedRealtime() - cArg.getBase();
                      int h = (int) (time / 3600000);
                      int m = (int) (time - h * 3600000) / 60000;
                      int s = (int) (time - h * 3600000 - m * 60000) / 1000;
                      String hh = h < 10 ? "0" + h : h + "";
                      String mm = m < 10 ? "0" + m : m + "";
                      String ss = s < 10 ? "0" + s : s + "";
                      cArg.setText(hh + ":" + mm + ":" + ss);
                  }
              });
              simpleChronometer.start();
              timeDeviceImages = simpleChronometer.getBase();
      
       Next.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      Intent intent = new Intent(firstActivity.this, UnitCondition.class);
                      Bundle bundle = new Bundle();
                      bundle.putString("timerJob", String.valueOf(timeDeviceImages));
                      intent.putExtras(bundle);
                      startActivity(intent);
                  }
              });
      
        }
      }
      

      在另一个活动中添加这个

      public class secondActivity  extends AppCompatActivity  {
          private Chronometer simpleChronometer;
          Long base, timeDeviceImages;
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setTheme(R.style.full_screen);
              setContentView(R.layout.activity_second);
      
      
              base = Long.valueOf(getIntent().getExtras().getString("timeUnit"));
              simpleChronometer = (Chronometer) findViewById(R.id.simpleChronometer);
              simpleChronometer.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {
                  @Override
                  public void onChronometerTick(Chronometer cArg) {
                      long time = SystemClock.elapsedRealtime() - cArg.getBase();
                      int h = (int) (time / 3600000);
                      int m = (int) (time - h * 3600000) / 60000;
                      int s = (int) (time - h * 3600000 - m * 60000) / 1000;
                      String hh = h < 10 ? "0" + h : h + "";
                      String mm = m < 10 ? "0" + m : m + "";
                      String ss = s < 10 ? "0" + s : s + "";
                      cArg.setText(hh + ":" + mm + ":" + ss);
                  }
              });
              simpleChronometer.setBase((base));
              simpleChronometer.start();
              timeDeviceImages = simpleChronometer.getBase();
       }
      }
      

      【讨论】:

        【解决方案3】:

        完整的代码解决方案,但我可以给你基本的想法,这就是我实现的方式。

        在 BaseActivity 或 Application 类中,您可以使用静态计时器,在我使用 BasActivity 的情况下。

        public static CountDownTimer timerBase;
        private long startTimer;
        

        现在,在特定操作中,您可以通过以下方式启动计时器。

            public void sessionStart() {
        
                if (timerBase != null)
                    timerBase.cancel();
                  start = SystemClock.elapsedRealtime();
                timerBase = new CountDownTimer("Pass Total time the task should be excute", 1000) {
                    @Override
                    public void onTick(long millisUntilFinished) {
        
                        long time = ("Pass Total time the task should be excute"/ 1000 - Math.round((float) millisUntilFinished / 1000.0f));
                        String timeTakenForeachQue = String.valueOf(time);
                        Log.e("counterValue", timeTakenForeachQue + " start = " + (SystemClock.elapsedRealtime() - start) / 1000 + " time " + millisUntilFinished / 1000);
        
                    }
        
                    @Override
                    public void onFinish() {
                       // Do stuff when time finish
        
                        Toast.makeText(BaseActivity.this,"time finished" Toast.LENGTH_LONG).show();
        
                    }
                }.start();
            }
        
        }
        

        现在您可以在任何类中访问此方法,因为它是 BaseActivity 或 Application 类。此外,这只是如何实现整个任务无法发布的基本想法。

        【讨论】:

        • 让我知道是否仍需要任何帮助或卡住,如果对您有帮助,请点赞。
        猜你喜欢
        • 1970-01-01
        • 2018-10-21
        • 2020-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-30
        • 1970-01-01
        相关资源
        最近更新 更多