android - 未调用 AppWidgetProvider 的 onEnabled 和 onDisabled 的解决方法

标签 android android-widget

由于我使用 AlarmManager 执行定期小部件更新,因此我需要确保 onEnabledonDisabled 能够可靠地工作。

但是,我意识到它们有时不会被触发。我不是唯一面临此问题的人。

Android appWidgetProvider onEnabled never called on tablet

  1. 是否有任何提交给 Google Android 团队的官方错误票?
  2. 是否有任何解决方法,尤其是 onDisabled?因为我不希望在删除最后一个小部件后,AlarmManager 仍然被重复触发。

AndroidManifest.xml

    <receiver android:name="org.yccheok.MyAppWidgetProvider"
        android:exported="true" >
        <intent-filter >
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            <action android:name="android.appwidget.action.APPWIDGET_ENABLED" />
            <action android:name="android.appwidget.action.APPWIDGET_DELETED" />
            <action android:name="android.appwidget.action.APPWIDGET_DISABLED" />
        </intent-filter>

        <meta-data
            android:name="android.appwidget.provider"
            android:resource="@xml/widget_info" />
    </receiver>

public class MyAppWidgetProvider extends AppWidgetProvider {

    private static PendingIntent createAlarmUpdatePendingIntent(Context context) {
        Intent intent = new Intent(context, JStockAppWidgetProvider.class);
        intent.setAction(JStockAppWidgetProvider.ALARM_UPDATE_ACTION);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        return pendingIntent;
    }

    @Override
    public void onEnabled(Context context)
    {        
        super.onEnabled(context);

        PendingIntent pendingIntent = createAlarmUpdatePendingIntent(context);
        AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        int scanSpeed = JStockApplication.instance().getJStockOptions().getScanSpeed();
        alarmManager.setRepeating(AlarmManager.RTC, System.currentTimeMillis() + scanSpeed, scanSpeed, pendingIntent);
    }

    @Override
    public void onDisabled(Context context)
    {
        super.onDisabled(context);

        PendingIntent pendingIntent = createAlarmUpdatePendingIntent(context);
        AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        alarmManager.cancel(pendingIntent);
    }

最佳答案

您可以在方法中检查当前正在运行的多个实例。

private boolean hasInstances(Context context) {
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
    int[] appWidgetIds = appWidgetManager.getAppWidgetIds(
            new ComponentName(context, this.getClass()));
    return (appWidgetIds.length > 0);
}

关于android - 未调用 AppWidgetProvider 的 onEnabled 和 onDisabled 的解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22445176/

相关文章:

Android:如何从 ContentResolver 查询中排除 Facebook 联系人

android - 尝试检索 LinearLayout 时出现奇怪的 NullpointerException

android - 将样式资源 ID 从 XML 传递到类不起作用

android - 在 Android 中的按钮上编写多行文本

java - Android 在 ThemeOverlay.AppCompat.Dark.ActionBar 中将工具栏/小部件背景更改为黑色

android - Gridview教程问题

android - 为以编程方式创建的编辑文本执行类型文本

android - 如何在保持页面全宽的同时设置 ViewPager 页面之间的填充

imageView 上的 android setAlpha 进入 CollapsingToolbarLayout 不起作用

android canvas line strokeCap round 比 simple line 大