实现自动注销功能
Implemet Auto Logout Function
我需要每天下午 3 点从应用程序中注销用户。
我需要在每天下午 3 点调用注销 API。
我的Android版本是4.4.4。
我已经实现了这个功能 alarmManager.It 没有在准确的时间触发(有时它会延迟 1 分钟触发,有时延迟 15 分钟)
有没有办法解决这个问题。
下面的代码...
//设置自动退出的闹钟
private void CallAutoLogOut() {
boolean alarmUp = (PendingIntent.getBroadcast(this, 0,
new Intent("myactionalarm"),PendingIntent.FLAG_NO_CREATE) != null);
Intent alaramIntent = new Intent("myactionalarm");
alaramIntent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, alaramIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 15);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
AlarmManager alarmManager = (AlarmManager) this.getSystemService(ALARM_SERVICE);
if (alarmUp)
{
Log.e("alaram", "Alarm is already active");
}else {
Log.e("alaram", "Alarm is set..!"+calendar.getTime());
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
// alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 2*60*1000, pendingIntent);
}
}
// 接收广播调用自动退出
@Override
public void onReceive(Context context, Intent intent) {
this.con = context;
RequestQueue requestQueue = Volley.newRequestQueue(context);
Log.e("alaram", "just called reciver");
if (intent.getAction() != null) {
if (intent.getAction().equals("myactionalarm")) {
Log.e("alaram", "onReceive: ----->" + intent);
callLogoutApi(requestQueue);
}
}
}
您在 setInexactRepeating
时使用了警报管理器的重复警报功能
有了这个 API 当您的闹钟重复时,它永远不会在准确的时间完成,并且会根据可用的系统资源触发。这也比 EXACT 消耗更少的内存和能量。
如果你想在准确的时间进行并且是绝对必要的,你需要设置一个准确的闹钟,然后在该闹钟内设置一个新的闹钟以重复。
要精确计时,请使用 setExact()
alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
您的服务器是否需要在下午 3 点整触发它?否则,您可以执行手动策略,即使您的 API 未被触发,也可以在下午 3 点在本地自动注销。
此外,我确实相信,如果有人只是将他们的 Android 时钟调回某个时间,这样下午 3 点就不会出现并且你的 API 永远不会被解雇,那么这个策略很容易失败。
我需要每天下午 3 点从应用程序中注销用户。
我需要在每天下午 3 点调用注销 API。
我的Android版本是4.4.4。
我已经实现了这个功能 alarmManager.It 没有在准确的时间触发(有时它会延迟 1 分钟触发,有时延迟 15 分钟)
有没有办法解决这个问题。
下面的代码...
//设置自动退出的闹钟
private void CallAutoLogOut() {
boolean alarmUp = (PendingIntent.getBroadcast(this, 0,
new Intent("myactionalarm"),PendingIntent.FLAG_NO_CREATE) != null);
Intent alaramIntent = new Intent("myactionalarm");
alaramIntent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, alaramIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 15);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
AlarmManager alarmManager = (AlarmManager) this.getSystemService(ALARM_SERVICE);
if (alarmUp)
{
Log.e("alaram", "Alarm is already active");
}else {
Log.e("alaram", "Alarm is set..!"+calendar.getTime());
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
// alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 2*60*1000, pendingIntent);
}
}
// 接收广播调用自动退出
@Override
public void onReceive(Context context, Intent intent) {
this.con = context;
RequestQueue requestQueue = Volley.newRequestQueue(context);
Log.e("alaram", "just called reciver");
if (intent.getAction() != null) {
if (intent.getAction().equals("myactionalarm")) {
Log.e("alaram", "onReceive: ----->" + intent);
callLogoutApi(requestQueue);
}
}
}
您在 setInexactRepeating
有了这个 API 当您的闹钟重复时,它永远不会在准确的时间完成,并且会根据可用的系统资源触发。这也比 EXACT 消耗更少的内存和能量。
如果你想在准确的时间进行并且是绝对必要的,你需要设置一个准确的闹钟,然后在该闹钟内设置一个新的闹钟以重复。
要精确计时,请使用 setExact()
alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
您的服务器是否需要在下午 3 点整触发它?否则,您可以执行手动策略,即使您的 API 未被触发,也可以在下午 3 点在本地自动注销。
此外,我确实相信,如果有人只是将他们的 Android 时钟调回某个时间,这样下午 3 点就不会出现并且你的 API 永远不会被解雇,那么这个策略很容易失败。