Ionic-Cordova安卓kiosk插件每日自动触发更新功能方案咨询
适配方案(安卓原生插件侧实现)
本方案基于安卓系统原生能力实现,完全规避原有方案的两个问题,所有逻辑均在安卓插件侧完成,无需前端频繁触发调用。
核心实现思路
用安卓系统AlarmManager注册精准定时任务,触发每日0点的更新校验,同时用SharedPreferences替代文件存储更新日期,轻量化持久化逻辑。
具体实现步骤
1. 实现更新校验基础逻辑
将原有日期判断逻辑迁移到安卓原生侧,自带去重能力,调用多少次都不会重复执行当日更新:
// 安卓原生侧更新校验工具类 public class UpdateManager { private final Context mContext; private static final String SP_NAME = "update_config"; private static final String KEY_LAST_UPDATE = "last_update_date"; public UpdateManager(Context context) { this.mContext = context; } public void checkAndUpdate() { SharedPreferences sp = mContext.getSharedPreferences(SP_NAME, Context.MODE_PRIVATE); String lastUpdateDate = sp.getString(KEY_LAST_UPDATE, ""); String todayDate = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).format(new Date()); // 非当日更新才执行逻辑 if (!todayDate.equals(lastUpdateDate)) { update(); // 调用安卓原生提供的更新函数 SharedPreferences.Editor editor = sp.edit(); editor.putString(KEY_LAST_UPDATE, todayDate); editor.apply(); // 每次更新完成后重新注册下一日的定时任务,规避时区、系统时间变更导致的定时偏移 registerDailyUpdateAlarm(); } } }
2. 注册每日0点定时任务
使用AlarmManager注册系统级定时任务,Kiosk设备一般为常驻插电/前台运行,定时触发准确率接近100%:
// 放到UpdateManager类中 private void registerDailyUpdateAlarm() { AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(mContext, UpdateBroadcastReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast( mContext, 1001, // 自定义唯一请求码即可 intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE ); // 计算次日0点时间戳 Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.add(Calendar.DAY_OF_MONTH, 1); // 适配安卓不同版本的定时触发规则 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); } else { alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); } }
3. 实现定时广播接收器
接收系统发出的定时触发信号,直接调用更新校验逻辑:
public class UpdateBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { new UpdateManager(context).checkAndUpdate(); } }
在Cordova插件的plugin.xml中添加广播注册配置,打包时自动写入AndroidManifest.xml:
<platform name="android"> <config-file target="AndroidManifest.xml" parent="/manifest/application"> <receiver android:name="替换为你自己的包名.UpdateBroadcastReceiver" android:exported="false"/> </config-file> </platform>
4. 精简前端调用逻辑
完全移除原有用户启动场景时触发插件的逻辑,仅保留两个触发节点即可:
- 应用首次安装/版本更新后首次启动,调用一次插件的定时任务注册接口
- 若Kiosk设备有定时重启策略,可额外添加开机广播接收器,收到开机广播后重新注册定时任务,避免系统重启后定时任务丢失
方案优势
- 解决0点自动触发问题:由安卓系统级定时任务触发,无需用户操作,到期自动执行
- 解决冗余调用问题:前端仅需触发1-2次注册逻辑,后续所有更新校验、执行逻辑均在原生侧自动完成,无多余性能消耗
- 自带兜底能力:若极端情况定时任务未触发,可保留前端手动更新入口,调用同一个
checkAndUpdate方法,因为有日期去重逻辑,多次调用也不会重复更新
内容的提问来源于stack exchange,提问作者SamC
相关产品推荐
相关产品推荐

