安卓 AppWidget 在蜂窝系统中不会在菜单中显示直到重新启动。

7
我为Honeycomb创建了一个AppWidget,它运行良好,但是刚安装时,它不会显示在小部件菜单中,因此无法添加到主屏幕。重新启动设备将允许它显示出来,或者在开发过程中,从Eclipse发送两次将使其显示出来。
有什么想法吗?
谢谢!

你在清单文件中设置了什么安装位置? - EboMike
我没有设置它,但经过一些研究,我添加了internalOnlt。结果仍然相同 :( - FloatingCoder
(我指的是internalOnly) - FloatingCoder
4个回答

10

显然 EboMike 是正确的,设置 android:installLocation="internalOnly" 确实解决了问题。如果没有指定安装位置,它应该默认为 internalOnly,但是对我来说似乎不是这样。也许在 Honeycomb 中有些改变?

此外,即使设置了 internalOnly,当从 Eclipse 安装时仍然遇到了问题(小部件在选择菜单中不会显示,直到第二次运行),但从 Android 市场安装时,它似乎可以正常工作,这是我的主要关注点。

谢谢!


安装位置可能会很棘手,如果它在SD卡上,小部件将拒绝显示,直到您将其移回内部存储并重置手机。我本以为不指定位置会默认为“仅限内部”,但也许Honeycomb改变了一些东西。哦,好吧,只要现在能用就行了... - EboMike

4
这是由于Android 3.1的设计原因,具体描述可以在这里找到。默认情况下,installLocation已经设置为“internalOnly”,所以这并不能解决问题,重启也不行。
要解决这个问题,需要在小部件中触发一个活动。这将激活它,然后它将出现在小部件列表中。
要实现这一点,您可以添加一个什么都不做的活动,如下所示:
1)在AndroidManifest.xml中,在“application”标记内添加以下内容:
<activity
    android:name=".DummyActivity"
    android:label="@string/app_name">
    <intent-filter> 
        <action android:name="android.intent.action.MAIN" /> 
        <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
</activity>

2) 然后在您的“src”中创建一个名为“DummyActivity.java”的类,如下所示:

package com.domain.app;
import android.app.Activity;
import android.os.Bundle;
public class DummyActivity extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        finish();
    }
}

现在,当您将小部件部署到您的设备时,该活动将自动启动(您将在Eclipse控制台中看到一条消息:"starting activity ..."),并且它将立即“完成”,而不会在设备上显示任何可视化内容。现在您的小部件将列在小部件列表中!

1

有点诡异,

我做了这个installLocation修复,第一次就成功了。

但是从那时起,每次在我的Xoom上更新小部件后,我仍然需要重新启动才能在列表中看到它。


0
为了解决我的小部件问题,我会发送小部件更新广播。在我的WidgetController.class中就像这样:
Intent intent = new Intent();
intent.setClassName(context, context.getPackageName() + ".WidgetProvider");
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,
        getWidgetIds(context));
context.sendBroadcast(intent);

为了在系统中提供稳定的小部件初始化,我会在应用程序或小部件启动时从应用程序对象发送此广播:
public class MyApp extends Application {

    @Override
    public void onCreate() {

        WidgetController.getInstance().updateWidget(getApplicationContext());
    }
}

!!! 重要提示:当 AppWidget 在应用程序中托管时,这已经足够了,但是当 AppWidget 与之分离时,您应该使用本主题中 @John 提出的方法。


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