【问题标题】:What are the ways to check 24 hours are completed?24小时检查完成的方法有哪些?
【发布时间】:2014-09-02 10:10:48
【问题描述】:

在我的应用程序中,我必须检查 24 小时是否已完成。 我如何使用 Thread、TimerTask 和 Alaram Manager 来检查这些事情。

让我知道如何使用 TIMERTASK 和 THREAD 实现这一目标?

【问题讨论】:

  • current time + 24 hours 怎么样? :)
  • Alarm manager 待定意图在 24 小时后触发。
  • 是的,无论 24 小时是否完成。
  • 我该怎么做 Dhruti 你能告诉我吗?我可以在 24 小时完成后发送广播吗?如何实现?
  • 我已添加参考链接。请参考。

标签: java android multithreading alarmmanager timertask


【解决方案1】:

使用警报管理器:

一个小例子:

这是工作代码。它每 10 分钟唤醒一次 CPU,直到手机关机。

添加到 Manifest.xml:

...
<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>
...
<receiver  android:process=":remote" android:name="Alarm"></receiver>
...

代码:

    package YourPackage;
    import android.app.AlarmManager;
    import android.app.PendingIntent;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.os.PowerManager;
    import android.widget.Toast;

    public class Alarm extends BroadcastReceiver 
    {    
         @Override
         public void onReceive(Context context, Intent intent) 
         {   
             PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
             PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
             wl.acquire();

             // Put here YOUR code.
             Toast.makeText(context, "Alarm !!!!!!!!!!", Toast.LENGTH_LONG).show(); // For example

             wl.release();
         }

     public void SetAlarm(Context context)
     {
         AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
         Intent i = new Intent(context, Alarm.class);
         PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
         am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 60 * 10, pi); // Millisec * Second * Minute
     }

     public void CancelAlarm(Context context)
     {
         Intent intent = new Intent(context, Alarm.class);
         PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
         AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
         alarmManager.cancel(sender);
     }
 }

从服务中设置警报:

package YourPackage;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;

public class YourService extends Service
{
    Alarm alarm = new Alarm();
    public void onCreate()
    {
        super.onCreate();       
    }

    public void onStart(Context context,Intent intent, int startId)
    {
        alarm.SetAlarm(context);
    }

    @Override
    public IBinder onBind(Intent intent) 
    {
        return null;
    }
}

如果您想在手机开机时设置重复闹钟:

向 Manifest.xml 添加权限:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>
...
<receiver android:name=".AutoStart">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"></action>
    </intent-filter>
</receiver>
...

并创建新类:

package YourPackage;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class AutoStart extends BroadcastReceiver
{   
    Alarm alarm = new Alarm();
    @Override
    public void onReceive(Context context, Intent intent)
    {   
        if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED"))
        {
            alarm.SetAlarm(context);
        }
    }
}

在 API 19 和之后警报以不同的方式工作,如果您希望它工作,请确保您使用的是 API 18 及更低版本。否则,您可以从官方文档中包含 API 19 的方法。

【讨论】:

  • 谢谢,我会检查.. 以上代码检查 24 小时的拜占庭故障是否完成。对吧?
  • 以上每10分钟做一次,可以修改。如果您使用任何唤醒锁,请确保您处理好唤醒锁。及时释放。
  • 另外让我知道如何使用 TimerTask 检查 24 小时是否完成。
  • 我不建议使用定时器任务,它会让你的 CPU 一直处于忙碌状态。这意味着对电池的压力。
  • 是的,我正在 Android Application SPECIFY 中实现这个东西。所以让我知道如果我必须检查 24 小时是否已完成,那么你能告诉我在哪里更改上面的代码吗?谢谢你的建议,也理解我的问题..
【解决方案2】:

如果你想知道自上次以来是否已经过去了 24 小时,从应用程序内部,我使用 sharedpreference 通过存储上次通过此检查的时间,

    long hourSince1970 = System.currentTimeMillis()/3600000;
    long lastUpdatedHour = MySharedPreference.getTimeLastUpdated(); // defaults to 0

    if(lastUpdatedHour == 0 || hourSince1970-lastUpdatedHour >= 24){
        MySharedPreference.setTimeLastUpdated(hourSince1970);
        // 24 hours passed
        // do your thing
    }

【讨论】:

  • 嗨,任何人都可以告诉我如何使用 TIMER TASK 和 THREAD 来实现这件事,因为根据我的要求。
猜你喜欢
  • 2021-12-18
  • 2011-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 2018-10-28
  • 2012-11-30
相关资源
最近更新 更多