在重新启动之前,Android AppWidget不会显示在蜂窝菜单中

时间:2011-05-16 22:11:31

标签: android android-3.0-honeycomb

我已经为Honeycomb创建了一个运行良好的AppWidget,除了首次安装时,它不会显示在Widgets菜单中,因此无法添加到主屏幕。重新启动设备将允许它显示,或者在开发期间,从Eclipse发送两次将导致它显示。

有什么想法吗?

谢谢!

4 个答案:

答案 0 :(得分:10)

显然EboMike是对的,设置android:installLocation =“internalOnly”确实解决了这个问题。如果没有指定安装位置,它应该默认为internalOnly,但似乎不适合我。 Honeycomb可能会发生一些变化吗?

另外,即使设置了internalOnly,我仍然看到从Eclipse安装时的问题(小部件在第二次运行之前不会出现在选择菜单中)但是从Android市场安装时,它似乎工作正常是我的主要关注点。

谢谢!

答案 1 :(得分:4)

实际上是here描述了它的原因,它的设计与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控制台中看到一条消息说“正在启动活动......”)并且它将立即“完成”而不显示任何内容在设备上可视化。现在,您的小部件将列在小部件列表中!

答案 2 :(得分:1)

鬼,

我做了这个installLocation修复,它第一次工作。

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

答案 3 :(得分: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);

然后在系统中提供稳定的窗口小部件初始化我在应用程序或窗口小部件启动时从Application对象发送此广播:

public class MyApp extends Application {

    @Override
    public void onCreate() {

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

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