【发布时间】:2020-01-02 10:37:49
【问题描述】:
我想构建一个具有值增量的全局计时器,并使用 Chronometer 出现在所有应用程序活动中,如何使 Chronometer 值对所有应用程序都是全局的?
【问题讨论】:
标签: android global-variables chronometer
我想构建一个具有值增量的全局计时器,并使用 Chronometer 出现在所有应用程序活动中,如何使 Chronometer 值对所有应用程序都是全局的?
【问题讨论】:
标签: android global-variables chronometer
使用静态方法初始化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 没有默认构造函数,这是我们可以满足您的要求的方式
【讨论】:
你可以试试这个很简单
将此添加到 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();
}
}
【讨论】:
完整的代码解决方案,但我可以给你基本的想法,这就是我实现的方式。
在 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 类。此外,这只是如何实现整个任务无法发布的基本想法。
【讨论】: