2

如果可以的话,我正在尝试弄清楚如何将意图发送到主屏幕以向其添加小部件。有任何想法吗?这是我一直在玩弄的一些代码,至少可以提示“添加小部件”选择。

AppWidgetManager mAppWidgetManager;
AppWidgetHost mAppWidgetHost;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    selectWidget();

    mAppWidgetManager = AppWidgetManager.getInstance(this);
    mAppWidgetHost = new AppWidgetHost(this, R.id.APPWIDGET_HOST_ID);
}

void selectWidget() {
    int appWidgetId = this.mAppWidgetHost.allocateAppWidgetId();
    Intent pickIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_PICK);
    pickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
    startActivityForResult(pickIntent, R.id.REQUEST_PICK_APPWIDGET);
}

感谢任何做出贡献的人。

4

1 回答 1

4

您可以将 ACTION_APPWIDGET_PICK 意图发送到系统,但您的应用程序无法处理它,除非您正在编码的是主屏幕替换,即启动器。

查看App Widget Host的文档,特别是有关Host Binding的部分。您在该方法中使用的代码与原始 Launcher 应用程序中使用的代码相同(在Android 4.0 及更低版本selectWidget()的标题Binding app widgets 下)。然后是用于处理意图的实现。此方法是您的代码中缺少的方法,但如果您包含它,您最终将完成主屏幕应用程序所做的所有工作(请参阅该页面中的下一个)。onActivityResultaddAppWidget(Intent data)

如果您继续阅读 App Widget Host 文档,您将看到绑定过程在 Android 4.1 上发生了变化,并且此任务还有一个新的意图,需要清单中的权限。为了使事情更复杂,请记住@CommonsWare 的评论:有很多主屏幕实现,可能会以不同的方式执行绑定过程:(

总结一下:不幸的是,无法获取应用小部件列表处理用户选择的内容,也无法要求启动器应用为我们执行此操作。也许在未来的 Android 版本中,正如最新 Launcher 源代码中的这条评论所揭示的那样:

/** 我们可能会在稍后充实这一点,以处理允许外部应用程序放置小部件,但现在,我们只想公开该操作以在其他地方检查。*/

于 2013-08-27T19:58:15.770 回答