安卓:检测时钟微小变化的监听器

7

我正在考虑如何实现一个监听器,以便在我的手机上每分钟经过时检测到它。

1)处理程序 2)AlarmManager 3)自己的线程

我希望我的应用程序在时钟更改每分钟时运行特定代码,重要的是在我的手机上分钟更改时触发,否则我只会使用一个等待60000的线程。

4个回答

11

得益于Manpreet Singh的提示,我能够想出以下解决方案:

BroadcastReceiver tickReceiver = new BroadcastReceiver(){
    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent.getAction().compareTo(Intent.ACTION_TIME_TICK) == 0) {
            Log.v("Karl", "tick tock tick tock...");
        }
    }
};
registerReceiver(tickReceiver, new IntentFilter(Intent.ACTION_TIME_TICK)); // register the broadcast receiver to receive TIME_TICK

然后调用以下onStop()方法:

// unregister broadcast receiver, will get an error otherwise
if(tickReceiver!=null) 
   unregisterReceiver(tickReceiver);

3
错别字:BoradcastReceiver 应为 BroadcastReceiver另外,if语句的作用是什么?这个广播只有在分钟改变时才会接收到... - k2col

4
假设方法initClock()更新了用户界面,那么我建议如下操作:
private BroadcastReceiver mTimeTickReceiver;

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

    mTimeTickReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            initClock();
        }
    };
    registerReceiver(mTimeTickReceiver, new IntentFilter(Intent.ACTION_TIME_TICK));
}

@Override
protected void onPause() {
    super.onPause();
    unregisterReceiver(mTimeTickReceiver);
}

-1
创建一个像下面这样的接收器。
public class AlarmReceiver extends BroadcastReceiver  
{
    @Override
    public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub
    Log.e("alarmreceiver","called");

   }
}

在你的清单文件中注册它

    <receiver android:name="AlarmReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>

最后,在活动中编写以下代码

        Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class);
        intent.setAction("packagename.ACTION");
        PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(),
                    0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
                AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        alarm.cancel(pendingIntent);
        alarm.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 1000*60, pendingIntent);

就是这样,运行你的应用程序,每分钟在 logcat 中打印日志


这个功能就像设置Thread.sleep(60*1000)一样,我需要一个能够检测智能手机时钟从13:15变到13:16的东西! - basickarl
这并没有回答问题,他/她想知道系统时钟何时从10:59:59变为11:00:00。 - k2col

-2

你可以在自己的线程中完成它。这很好用。我有和你完全相同的需求,我就是这样做的。

Thread t = new Thread() {

  @Override
  public void run() {
    try {
      while (!isInterrupted()) {
        Thread.sleep(60000);
        runOnUiThread(new Runnable() {
          @Override
          public void run() {
            // updated my UI here 
          }
        });
      }
    } catch (InterruptedException e) {
    }
  }
};

t.start();

如果不是这样,您也可以使用Timertask对象。两者都可以正常工作

对于timertask,我想这个链接会有所帮助

{{link1:Android - 想要应用程序每秒执行任务}}


抱歉,"!isInterrupted()"是什么意思! - kemdo
1
isInterrupted() 方法每次都会返回 false,因为我们没有中断这个线程,而且每次它返回 false,循环就会每分钟运行一次。该方法实际上检查我们的线程是否被其他线程中断。 - Hulk
我需要它在安卓智能手机时钟从例如12:59变为13:00时触发。 - basickarl
1
这个解决方案是我见过的最糟糕的。如果你在一分钟的中间开始线程会发生什么?你将延迟30秒接收更改。 - Ofek Regev
这太糟糕了,你基本上是创建了一个新的线程并将其推到主线程。 - Chisko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接