我正在考虑如何实现一个监听器,以便在我的手机上每分钟经过时检测到它。
1)处理程序 2)AlarmManager 3)自己的线程
我希望我的应用程序在时钟更改每分钟时运行特定代码,重要的是在我的手机上分钟更改时触发,否则我只会使用一个等待60000的线程。
我正在考虑如何实现一个监听器,以便在我的手机上每分钟经过时检测到它。
1)处理程序 2)AlarmManager 3)自己的线程
我希望我的应用程序在时钟更改每分钟时运行特定代码,重要的是在我的手机上分钟更改时触发,否则我只会使用一个等待60000的线程。
得益于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);
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);
}
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 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 - 想要应用程序每秒执行任务}}