android AppWidget 未添加到 Lollipop 上的主屏幕

2024-03-20

我开发了一个应用程序,可以在主屏幕小部件上显示新闻源。由于以下情况,在 Lollipop 之前的 Android 设备上一切正常:

  • 用户进入启动器的小部件屏幕以选择/添加特定的小部件
  • 用户单击 MyNewsWidget 以添加到其主屏幕
  • 调用配置活动,以便用户可以从不同的新闻源中进行选择
  • 用户单击配置活动内的“保存”按钮,然后该活动应完成,并且 MyNewsWidget 应添加到其主屏幕。

我正在 LG Nexus 5 设备上测试我的应用程序,但是当我在配置活动完成工作后单击将小部件添加到主屏幕时,小部件没有添加到主屏幕。

这是我在配置活动中的 Intent 代码:

int[] appWidgetIds = new int[]{mWidgetId};
Intent intent = new Intent(WidgetResourcesActivity.this, NewsWidgetProvider.class);
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
sendBroadcast(intent);
setResult(RESULT_OK, intent);
finish();

另外,这是我的 WidgetProvider 类中的代码:

    @Override
    public void onReceive(Context context, Intent intent) {

        //I got this result on pre-Lollipop android devices "Action is: ACTION_APPWIDGET_UPDATE"
        if (intent.getAction().equals(AppWidgetManager.ACTION_APPWIDGET_UPDATE)) {
            int[] appWidgetIds = intent.getExtras().getIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS);
            for (int widgetId : appWidgetIds) {
                if (!isWidgetAdded(context, widgetId)) {
                    Intent widgetIntent = new Intent(Intent.ACTION_MAIN);
                    widgetIntent.setClass(context, WidgetResourcesActivity.class);
                    widgetIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    widgetIntent.putExtra(WidgetResourcesActivity.EXTRA_WIDGET_ID, widgetId);
                    context.startActivity(widgetIntent);
                    PendingIntent pendingIntent = PendingIntent.getActivity(context, widgetId, widgetIntent, PendingIntent.FLAG_UPDATE_CURRENT);
                } else {
                    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
                    int[] widgetIds = new int[]{widgetId};
                    onUpdate(context, appWidgetManager, widgetIds);
                    RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.app_widget);
                    updateButtonsStatus(remoteViews, 0, mFeedsCount);
                    AppWidgetManager.getInstance(context).updateAppWidget(appWidgetIds, remoteViews);
                }
            }
            return;
        }

        //Here is my trouble . . .
        //Unfortuantely, I got this result on Lollipop android devices "Action is: ACTION_APPWIDGET_DELETED" !! Why? 
        if (intent.getAction().equals(AppWidgetManager.ACTION_APPWIDGET_DELETED)) {
            if (BuildConfig.DEBUG) Log.e(TAG, "action : " + intent.getAction());
            removeWidgetId(context, intent.getExtras().getInt(AppWidgetManager.EXTRA_APPWIDGET_ID));
            return;
        }

        super.onReceive(context, intent);

        if (intent.getExtras() == null)
            return;

        int widgetId = intent.getExtras().getInt(EXTRA_WIDGET_ID);
        if (BuildConfig.DEBUG)
            Log.e(TAG, "action : " + intent.getAction() + " id : " + intent.getExtras().getInt(EXTRA_BUTTON_ID));

        if (intent.getExtras().getInt(EXTRA_BUTTON_ID) == R.id.widget_arrow_back) {
            mIndex = intent.getExtras().getInt(EXTRA_FEED_INDEX);
            if (mIndex > 0) {
                mIndex--;
                if (BuildConfig.DEBUG) Log.e(TAG, "currentIndex : " + mIndex);
                RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.app_widget);
                updateButtonsStatus(remoteViews, mIndex, mFeedsCount);
                updateWidget(context, remoteViews, mIndex, widgetId);
                handleWidgetBackButton(context, remoteViews, widgetId);
                handleWidgetNextButton(context, remoteViews, widgetId);
            }
        }

        if (intent.getExtras().getInt(EXTRA_BUTTON_ID) == R.id.widget_arrow_next) {
            mIndex = intent.getExtras().getInt(EXTRA_FEED_INDEX);
            if (mIndex < mFeedsCount - 1) {
                mIndex++;
                if (BuildConfig.DEBUG) Log.e(TAG, "currentIndex : " + mIndex);
                RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.app_widget);
                updateButtonsStatus(remoteViews, mIndex, mFeedsCount);
                updateWidget(context, remoteViews, mIndex, widgetId);
                handleWidgetNextButton(context, remoteViews, widgetId);
                handleWidgetBackButton(context, remoteViews, widgetId);
            }
        }
    }

遗憾的是,之前的场景不适用于 android Lollipop(5.0 及更高版本)。 任何好的帮助将不胜感激。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android AppWidget 未添加到 Lollipop 上的主屏幕 的相关文章

随机推荐

  • Objective C 相当于 PHP 范围函数?

    我想快速创建一个从 0 到 10000 的数字数组 但步进增量为 500 数组如下所示 0 500 1000 10000 in PHP 这是内置于range http php net manual en function range php
  • 汇总分钟到小时的需求

    我不知道我是否在这个问题的正确部分 我环顾四周并没有找到答案 所以这是我的问题 我有一个 CSV 文件 订购如下 dat lt read csv text Date Demand 01 01 2012 00 00 00 5061 5 01
  • conda.exe:加载共享库时出错:libz.so.1

    无法在我的 RHEL 机器中安装 Anaconda3 2019 10 Linux x86 64 收到错误 gt conda exe 加载共享库时出错 libz so 1 无法从共享对象映射段 不允许操作 Anaconda 或 Minicon
  • 为什么我的排除字段仍然出现在这个 Django 表单中?

    我在用着exclude在我的表单的 Meta 类中 从表单中排除我想以编程方式填写的字段 但它仍然显示在表单中 以下是代码的一些摘录 Model class Info models Model completed by models For
  • 在linux中链接信号处理程序的正确方法?

    我有几个信号处理程序用来干净地退出程序 并且我想通过链接信号处理程序调用来很好地处理任何其他吸引它们的东西 我在手册页中使用 sigaction 作为信号 表示它不再是首选 查看 sigaction 结构体 其中指定了信号掩码等 以及几个标
  • 内部使用 try catch 防止 C++ DLL 异常

    我正在开发一个 C DLL 为主应用程序分配一个数组 该函数返回错误代码 而不是指向新创建的数组的指针 因此第一个成员的地址将写入函数的参数中 例子 int foo int arrayPtr int array new int 10 arr
  • 如何打破长字符串以符合 PEP8 要求? [复制]

    这个问题在这里已经有答案了 我的项目中有很多这样的长线 但不知道如何打破它以使 PEP8 满意 PEP8 显示警告 format me id pic url http graph facebook com 0 picture width 1
  • Visual Studio 需要在 Team City Build Server 上运行 MSTest 测试吗?

    我们正在设置 Team City 构建服务器 在以前的 VS 2008 项目中 完整版本的 Visual Studio 已安装在构建服务器上 我们现在正在启动一个 VS 2010 项目 是否可以在不安装 Visual Studio 的情况下
  • 如何在 Windows 上从 GitHub Desktop 更新 git 版本

    我想用新的worktree中引入的功能git 2 5 https git scm com docs git worktree 但是 我不知道如何更新到最新版本的 GitHub Desktop notgit 本身 我安装桌面版 GitHub
  • JTable 行之间的标题

    我想知道如何实现这样的事情 row 1 row 2 HEADLINE比如 2011 年 1 月 27 日 row 3 row 4 HEADLINE比如 2011 年 1 月 28 日 row 5 这些 假 行应该只是信息行而不是真实行 我找
  • 如何在C#中获取当前产品版本?

    如何在 C 中以编程方式获取当前产品版本 My code VersionNumber System Reflection Assembly GetExecutingAssembly GetName Version ToString 我得到
  • 什么是textview.setTextSize()?

    在我的 Android 游戏中 有一个文本视图 我使用以下代码设置文本大小 textview setTextSize 30 30以像素为单位 但它到底是什么 是字符的高度还是宽度 是序数号吗 在android java或kotlin 中设置
  • WPF - 宽度和高度必须为非负数

    我的应用程序遇到了一个奇怪的异常 它一直运行良好 直到我升级了我的开发机器 相同的操作系统 VS2010 并尝试再次调试软件 这是我得到的异常 宽度和高度必须为非负数 堆栈跟踪在这里 at System Windows Size ctor
  • 使用 babel 后,'Symbol' 在 IE 中未定义

    我有一个reactjs使用 ES6 标准编写的应用程序 我使用webpack来建造它 这webpack加载js模块使用babel loader 具体来说 我使用以下版本的包 email protected cdn cgi l email p
  • OpenCV - 如何从 Canny 函数的结果中提取边缘?

    我在 OpenCV 中使用 Canny 函数 如下所示 Mat detected edges GetImage Canny detected edges detected edges 20 20 3 kernel size 我的问题是这个函
  • 在 C++ 中将对象数组设置为 null

    假设我有一个 C 中 Foo 类型的对象数组 Foo array 10 在 Java 中 我可以简单地通过以下方式将此数组中的对象设置为 null array 0 null the first one 我怎样才能在 C 中做到这一点 使用指
  • PHPStorm中Code Sniffer触发的Xdebug

    我在安装 PHPStorm 时 xdebug 和 Code Sniffer 都工作得很好 但真正烦人的部分是 调试器现在似乎将 Code Sniffer 错误视为断点 并中断代码 让我知道样式警告 尝试测试代码 如何防止 Code Snif
  • Firestore存储大小限制如何存储大型数组

    我有一个收藏users userID followers该用户 ID 是 firebase UID 因此长度为 29 个字节 字符串大小的计算方式为 UTF 8 编码字节数 1 在每个用户文档中 我都有一个名为 follower 的数组和另
  • 解析 DateFormat 时的 Java 时区

    我的代码解析日期如下 String ALT DATE TIME FORMAT yyyy MM dd T HH mm ss SSSZ SimpleDateFormat sdf new SimpleDateFormat ALT DATE TIM
  • android AppWidget 未添加到 Lollipop 上的主屏幕

    我开发了一个应用程序 可以在主屏幕小部件上显示新闻源 由于以下情况 在 Lollipop 之前的 Android 设备上一切正常 用户进入启动器的小部件屏幕以选择 添加特定的小部件 用户单击 MyNewsWidget 以添加到其主屏幕 调用