【问题标题】:Minimal Android widget, APPWIDGET_DELETED and APPWIDGET_DISABLED intents never being received最小的 Android 小部件,APPWIDGET_DELETED 和 APPWIDGET_DISABLED 意图永远不会被接收
【发布时间】:2014-03-28 13:09:12
【问题描述】:

我遇到的问题与之前提出的问题非常相似,但并不完全相同。参考文献:1234

我编写了一个最小的 Android 小部件,但永远不会收到 APPWIDGET_DELETEDAPPWIDGET_DISABLED

在上面的参考文献 1 和 2 中,提出的解决方案是实现 onReceive 并明确查找这些意图。但是,我在onReceive 中插入了一个日志调用,并且可以确认这些意图都没有出现,尽管APPWIDGET_UPDATEAPPWIDGET_ENABLED 正按预期出现在日志中。为了仔细检查这一点,我还插入了 onDeletedonDisabled 的最小实现,它们的主体仅由对 super 的调用组成,并在其上放置了断点,而这些实现永远不会到达。

Reference 3 似乎通过简单地卸载并重新安装他的应用程序来解决他的问题,但这对我来说是无效的。事实上,我已经在多个模拟器图像以及实际设备上尝试过这个,其中一些是新鲜的,以前从未有过以前的版本,但这个问题仍然存在。

根据参考资料中的回复说这些变通办法对他们有用,还有大量使用onDeletedonDisabled 方法的在线教程,但没有提到它们实际上不起作用,我打算假设我一定做错了什么,这不是 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);
    }
}

【问题讨论】:

  • 摆脱android:exported="false"。您的应用小部件不应该在那里使用它。您需要将这个&lt;receiver&gt; 导出,以便操作系统可以与之对话。
  • 谢谢!做到了,如果您提供您的评论作为答案,我会接受!

标签: android android-intent android-widget


【解决方案1】:

需要导出AppWidgetProvider,以便协调应用小部件(在主机和提供者之间)的核心操作系统进程可以与其通信。因此,android:exported="false" 是不合适的。

说实话,我并没有期望与提供者合作,而不仅仅是一些事件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    • 2017-01-19
    • 2020-10-14
    • 2014-04-08
    相关资源
    最近更新 更多