如何在Android中检测每秒的时间变化?
我正在通过以下方式为android创建一个定制的手表面板。我已实现广播接收器,以检测时间变化,如下所示: 在我的活动中,我有静态块来过滤以下意图:如何在Android中检测每秒的时间变化?,android,android-intent,wear-os,android-broadcast,watch-face-api,Android,Android Intent,Wear Os,Android Broadcast,Watch Face Api,我正在通过以下方式为android创建一个定制的手表面板。我已实现广播接收器,以检测时间变化,如下所示: 在我的活动中,我有静态块来过滤以下意图: static { intentFilter = new IntentFilter(); intentFilter.addAction(Intent.ACTION_TIME_CHANGED); intentFilter.addAction(Intent.ACTION_TIME_TICK); intentFilter.ad
static {
intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_TIME_CHANGED);
intentFilter.addAction(Intent.ACTION_TIME_TICK);
intentFilter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
}
我的接受者类别:
public class MyReciever extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
c = Calendar.getInstance();
Log.d("myapp", "time changed");
hrs = c.get(Calendar.HOUR_OF_DAY);
min = c.get(Calendar.MINUTE);
sec = c.get(Calendar.SECOND);
txt_hrs.setText(String.valueOf(hrs));
txt_mins.setText(String.valueOf(min));
txt_sec.setText(String.valueOf(sec));
}
}
我已经在oncreate()中注册了receiver:
上面的代码可以在数小时和数分钟内正常工作,但在数秒钟内无法正常工作
Intent.ACTION\u TIME\u TICK的问题在于它是每分钟而不是每秒钟广播的
我需要检测手表表面时钟每秒的时间变化。有人有“每秒检测时间变化”的解决方案吗?你可以看看。所以最好是创建一个单独的线程或使用asynctask,在这里您需要每秒钟更新一次textview
或者您可以使用和用于此目的,如下所示
public void updateTimeOnEachSecond() {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
c = Calendar.getInstance();
Log.d("myapp", "time changed");
hrs = c.get(Calendar.HOUR_OF_DAY);
min = c.get(Calendar.MINUTE);
sec = c.get(Calendar.SECOND);
runOnUiThread(new Runnable() {
@Override
public void run() {
txt_hrs.setText(String.valueOf(hrs));
txt_mins.setText(String.valueOf(min));
txt_sec.setText(String.valueOf(sec));
}
});
}
}, 0, 1000);
}
并在初始化“活动”中的每个视图后调用此方法。它可以工作,但代码中有一个小改动。您应该将setText方法放在runOnUiThread中,否则它将抛出CalledFromErrorThreadException:只有创建视图层次结构的原始线程才能接触其视图。我已经编辑了代码。请批准该编辑。@Krupal嘿,谢谢。是的,我错过了坚持下去。。。做更新
public void updateTimeOnEachSecond() {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
c = Calendar.getInstance();
Log.d("myapp", "time changed");
hrs = c.get(Calendar.HOUR_OF_DAY);
min = c.get(Calendar.MINUTE);
sec = c.get(Calendar.SECOND);
runOnUiThread(new Runnable() {
@Override
public void run() {
txt_hrs.setText(String.valueOf(hrs));
txt_mins.setText(String.valueOf(min));
txt_sec.setText(String.valueOf(sec));
}
});
}
}, 0, 1000);