public class AlarmManagerClass extends BroadcastReceiver
{
public static boolean haveInternet(Context ctx) {
NetworkInfo info = (NetworkInfo) ((ConnectivityManager) ctx
.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
if (info == null || !info.isConnected()) {
return false;
}
if (info.isRoaming()) {
// here is the roaming option you can change it if you want to
// disable internet while roaming, just return false
return false;
}
return true;
}
@Override
public void onReceive(final 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.
Log.d(null,"Alarm !");
Toast.makeText(context, "Alarm !!!!!!!!!!", Toast.LENGTH_LONG).show(); // For example
Thread falador = new Thread() {
@Override
public void run() {
while (haveInternet(context)==false){
try {
sleep(60000);
if (haveInternet(context)==true){
PostSync(context);
return;
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
};
falador.start
Log.d(null,"Alarm Exit !");
wl.release();
}
public void SetAlarm(Context context)
{
AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(context, AlarmManagerClass.class);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 60 * 10, pi); // Millisec * Second * Minute
}
}
我有一个AlarmManager,每10分钟将
PostSync();
,其中PostSync
是用于将数据同步到服务器的功能。例如 :
10分钟后,AlarmManager唤醒,并检查是否存在网络连接。如果没有连接,它将在60秒后再次检查。
因此,只要10分钟内没有互联网连接,第一个AlarmManager的任务就不会完成执行,因为它正在等待互联网连接。第二个AlarmManager唤醒并检查是否
haveInternet
,如果没有,它将休眠一分钟,等等。因此,这是一个无限循环。...这会在此代码上发生吗?如何确保第一个AlarmManager的任务尚未完成执行,不唤醒第二个AlarmManager?
最佳答案
我认为您应该使用set
而不是setRepeating
并仅在第一个任务实际完成后安排下一个任务。这样,您将确保永远不会有两个并发的AlarmManager,并且当您连接到Internet时,您的任务每10分钟运行一次。
我认为这样会更简单:您使用AlarmManager#set
延迟10分钟。在任务中,您检查是否有Internet连接:
在这种情况下,请做好您的工作,并以10分钟的延迟时间用AlarmManager#set
设置下一个警报
否则,将下一个警报设置为AlarmManager#set
并延迟60秒
我认为当前使用由警报任务启动的线程的方法很不稳定,如果您使用AlarmManager,请同时使用它或延迟10分钟60秒。
关于android - Android:如何确保AlarmManager不会首先崩溃,AlarmManager尚未完成执行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22067678/