You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 12天气Widget无法自动更新求助(Android 9正常)

问题分析与解决建议

你的天气Widget在Android 12上无法自动更新,核心问题大概率是PendingIntent类型不匹配、Android 12+精确闹钟权限的动态申请缺失,以及闹钟设置逻辑冲突,以下是具体修复方案:

1. 修正PendingIntent类型:用getBroadcast而非getActivity

你当前用PendingIntent.getActivity()创建意图,但StackWidgetProvider是BroadcastReceiver而非Activity。Android 12对PendingIntent的类型校验更严格,类型不匹配会直接导致广播无法触发。修改createClockTickIntent方法:

private PendingIntent createClockTickIntent(Context context) {
    Intent alarm = new Intent(context, StackWidgetProvider.class);
    alarm.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
    ComponentName thisAppWidgetComponentName = new ComponentName(context.getPackageName(), getClass().getName());
    int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisAppWidgetComponentName);
    alarm.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);

    int flags = PendingIntent.FLAG_UPDATE_CURRENT;
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
        flags |= PendingIntent.FLAG_IMMUTABLE;
    }
    // 关键修改:用getBroadcast替代getActivity
    return PendingIntent.getBroadcast(context, 0, alarm, flags);
}

2. 动态申请SCHEDULE_EXACT_ALARM权限

Android 12(API 31)及以上,SCHEDULE_EXACT_ALARM权限需要用户手动授权,仅在Manifest声明无效。在Widget初始化时检查并请求权限:

private void checkExactAlarmPermission(Context context) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        if (!alarmManager.canScheduleExactAlarms()) {
            Intent intent = new Intent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intent);
        }
    }
}

在onEnabled方法开头调用权限检查:

@Override
public void onEnabled(Context context) {
    super.onEnabled(context);
    checkExactAlarmPermission(context);
    // 后续闹钟设置逻辑...
}

3. 优化闹钟设置逻辑,避免冲突

你同时调用setRepeating和setExactAndAllowWhileIdle会导致逻辑混乱,Android 6+推荐使用精确闹钟方式,每次触发后重新设置下一次闹钟:

修改onEnabled方法:

@Override
public void onEnabled(Context context) {
    super.onEnabled(context);
    checkExactAlarmPermission(context);
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    long firstTriggerTime = System.currentTimeMillis() + 1000; // 1秒后首次触发
    setNextExactAlarm(context, alarmManager, firstTriggerTime);
}

private void setNextExactAlarm(Context context, AlarmManager alarmManager, long triggerTime) {
    PendingIntent pendingIntent = createClockTickIntent(context);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent);
    } else {
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent);
    }
}

修改onReceive方法:

@Override
public void onReceive(Context context, Intent intent) {
    super.onReceive(context, intent);
    // 先处理Widget更新逻辑(确保你已实现更新UI的代码)
    updateWeatherWidget(context);

    // 再设置下一次闹钟
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    long nextTriggerTime = System.currentTimeMillis() + 1800000; // 30分钟后
    setNextExactAlarm(context, alarmManager, nextTriggerTime);
}

4. 确保Intent Action唯一(可选)

为避免和系统广播冲突,可自定义唯一Action:

private static final String ACTION_WIDGET_UPDATE = "com.your.package.action.WIDGET_WEATHER_UPDATE";

// 在createClockTickIntent里设置自定义Action
alarm.setAction(ACTION_WIDGET_UPDATE);

// 在Manifest的<receiver>标签添加对应<intent-filter>
<receiver android:name=".StackWidgetProvider">
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        <action android:name="com.your.package.action.WIDGET_WEATHER_UPDATE" />
    </intent-filter>
    <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_info" />
</receiver>

额外检查点

  • 确认updateWeatherWidget方法正确实现,能正常刷新Widget UI
  • 测试时关闭应用的电池优化,Android 12对后台限制严格,可引导用户将应用加入电池白名单

内容的提问来源于stack exchange,提问作者user2260040

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 20:30:29