最简Android小部件,永远不会收到APPWIDGET_DELETED和APPWIDGET_DISABLED意图

3
我有一个与之前提出的问题非常相似的问题,但不完全相同。参考资料:1234 我编写了最小程度的 Android 小部件,但是我从未收到 APPWIDGET_DELETED 和 APPWIDGET_DISABLED 意图。
在上述引用的1和2中,提供的解决方案是实现 onReceive,并明确查找这些意图。然而,我在 onReceive 中插入了一个日志调用,并可以确认这些意图中没有一个出现,尽管 APPWIDGET_UPDATE 和 APPWIDGET_ENABLED 如预期的出现在日志中。为了再次检查这一点,我还���入了 onDeleted 和 onDisabled 的最小实现,它们的主体仅包含对带断点的超级函数的调用,并且这些功能从未被实现。
参考3似乎通过简单地卸载并重新安装他的应用程序来解决他的问题,但在我的情况下无效。事实上,我已经在多个模拟器镜像以及实际设备上尝试过这一点,其中一些是全新的,并且以前从未有过先前版本,但是这个问题仍然存在。
基于参考文献中的回复说这些变通方法对他们起作用,以及在线教程的大量使用 onDeleted 和 onDisabled 方法而不提到它们实际上不起作用,我将假设我必须做错了什么,而这不是 Android 中的错误。
这是我的最小清单文件:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.test.testwidgets">

    <application android:allowBackup="true"
        android:label="@string/app_name"
        android:icon="@drawable/ic_launcher"
        android:theme="@style/AppTheme">

        <receiver android:label="Test Widget"
                  android:name="com.test.testwidgets.TestWidgetProvider"
                  android:exported="false">
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
            </intent-filter>
            <meta-data android:name="android.appwidget.provider"
                       android:resource="@xml/test_widget_info"/>
        </receiver>
    </application>

</manifest>

这是我的最小Java源代码:

public class TestWidgetProvider extends AppWidgetProvider {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.w("Schedule", "On receive " + intent.getAction());
        super.onReceive(context, intent);
    }

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        for (int widgetId : appWidgetIds) {
            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.test_widget);
            appWidgetManager.updateAppWidget(widgetId, views);
        }
    }

    @Override
    public void onDeleted(Context context, int[] appWidgetIds) {
        super.onDeleted(context, appWidgetIds);
    }

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

1
摆脱 android:exported="false"。如果它存在,您的应用小部件将无法工作。您需要将此 <receiver> 导出,以便操作系统可以与其通信。 - CommonsWare
谢谢!这就是我想要的,如果您把您的评论作为答案提供,我会接受它! - AndroidSlinger
1个回答

6
一个AppWidgetProvider需要被导出,这样可以让协调应用小部件(主机和提供程序之间)的核心操作系统进程与其交流。因此,android:exported="false"是不合适的。
老实说,我本来以为提供程序什么都不会工作,而不仅仅是一些事件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接