首次单击Android widget时无法启动活动

首次单击Android widget时无法启动活动,android,android-widget,android-pendingintent,Android,Android Widget,Android Pendingintent,我有一个android小部件,它实际上是一个启动活动的按钮。该小部件使用此代码工作正常,但有一个小错误: 当我将小部件添加到主屏幕时,第一次单击它什么也不做,第二次它工作。然后,它从第一次单击开始正常工作。当手机重启时也会发生同样的事情。有人能帮我解决这个问题吗 MyWidgetIntenterReceiver.java MyWidgetProvider.java: public class MyWidgetProvider extends AppWidgetProvider {

我有一个android小部件,它实际上是一个启动活动的按钮。该小部件使用此代码工作正常,但有一个小错误:

当我将小部件添加到主屏幕时,第一次单击它什么也不做,第二次它工作。然后,它从第一次单击开始正常工作。当手机重启时也会发生同样的事情。有人能帮我解决这个问题吗

MyWidgetIntenterReceiver.java


MyWidgetProvider.java:

    public class MyWidgetProvider extends AppWidgetProvider {

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
        int[] appWidgetIds) {

    RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_demo);
    remoteViews.setOnClickPendingIntent(R.id.widget_button, buildButtonPendingIntent(context));

    pushWidgetUpdate(context, remoteViews);
}

public static PendingIntent buildButtonPendingIntent(Context context) {
    Intent intent = new Intent();
    intent.setAction("Start");
    return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}

public static void pushWidgetUpdate(Context context, RemoteViews remoteViews) {
    ComponentName myWidget = new ComponentName(context, MyWidgetProvider.class);
    AppWidgetManager manager = AppWidgetManager.getInstance(context);
    manager.updateAppWidget(myWidget, remoteViews);     
}}
   <receiver android:name="com.hybernect.flashlight.MyWidgetProvider" >
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        </intent-filter>

        <meta-data
            android:name="android.appwidget.provider"
            android:resource="@xml/demo_widget_provider" />
    </receiver>
    <receiver
        android:name="com.hybernect.flashlight.MyWidgetIntentReceiver"
        android:label="widgetBroadcastReceiver" >
        <intent-filter>
            <action android:name="Start" />
        </intent-filter>

        <meta-data
            android:name="android.appwidget.provider"
            android:resource="@xml/demo_widget_provider" />
    </receiver>


清单中的小部件:

    public class MyWidgetProvider extends AppWidgetProvider {

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
        int[] appWidgetIds) {

    RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_demo);
    remoteViews.setOnClickPendingIntent(R.id.widget_button, buildButtonPendingIntent(context));

    pushWidgetUpdate(context, remoteViews);
}

public static PendingIntent buildButtonPendingIntent(Context context) {
    Intent intent = new Intent();
    intent.setAction("Start");
    return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}

public static void pushWidgetUpdate(Context context, RemoteViews remoteViews) {
    ComponentName myWidget = new ComponentName(context, MyWidgetProvider.class);
    AppWidgetManager manager = AppWidgetManager.getInstance(context);
    manager.updateAppWidget(myWidget, remoteViews);     
}}
   <receiver android:name="com.hybernect.flashlight.MyWidgetProvider" >
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        </intent-filter>

        <meta-data
            android:name="android.appwidget.provider"
            android:resource="@xml/demo_widget_provider" />
    </receiver>
    <receiver
        android:name="com.hybernect.flashlight.MyWidgetIntentReceiver"
        android:label="widgetBroadcastReceiver" >
        <intent-filter>
            <action android:name="Start" />
        </intent-filter>

        <meta-data
            android:name="android.appwidget.provider"
            android:resource="@xml/demo_widget_provider" />
    </receiver>



在我看来,您可能对Android小部件非常陌生,并且缺少一些您需要了解的基础知识。我的建议是找到更多的教程,而不是你编写的教程,来比较处理小部件的不同方式

我编写了一个简单的小部件作为演示教程-它包含小部件所需的所有样板代码,其他内容很少:

我这样写是为了让任何人都能轻松地删除“wifi”相关代码,并使其适应自己的小部件需求。它可能非常适合您查看,并且添加一个按钮相对简单


MyWidgetIntentReceiver
MyWidgetProvider
中,您混合了不同的
onUpdate()
方法。下面我将尝试解释您在原始问题中给出的代码的错误


将小部件添加到主屏幕时,将调用
MyWidgetProvider.onUpdate()
,后者反过来调用
buildPendingEvent()

这将创建一个
pendingent
,当单击按钮时,它将发送一个动作设置为“开始”的广播

这就是发生的事情。单击该按钮,您发送一个带有“开始”的广播,然后您的
MyWidgetIntententReceiver
会收到该广播

我不明白你为什么选择这样做,因为你可以从这门课开始活动


当您的
MyWidgetIntentReceiver.onReceive()
方法运行时,它会调用自己的
onUpdate()
方法

(注意:这是一种不好的做法;在
广播接收器中尽量少做)

此新的
onUpdate()
方法设置单击操作以启动活动:

Intent configIntent = new Intent(context, WidgetFlash.class);
configIntent.putExtra("widget", 1);
configIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

PendingIntent configPendingIntent = PendingIntent.getActivity(context,
        0, configIntent, 0);

remoteViews.setOnClickPendingIntent(R.id.widget_button,
        configPendingIntent);
因此,第二次单击按钮时,将启动
WidgetFlash
活动


总结如下:

  • 您的第一次更新调用了
    pendingent.getBroadcast()
    ,它向接收器发送“开始”
  • 您的第二次更新调用了
    pendingent.getActivity()
    ,这将启动
    WidgetFlash

我不理解您的
MyWidgetIntententReceiver
在该代码中的必要性。

当您第一次说它不工作时,您应该在第一次单击它时查看logcat。您可能会在其中看到有用/信息丰富的内容。logcat在第一次单击时不会显示任何内容:(你正在过滤logcat吗?如果是,请不要。你会错过一些重要的东西。请发布你的声明你有为你的小部件定义的配置活动吗?现在它根本不工作了吗?我将MyWidgetIntententReceiver中的onUpdate更改为你发布的新方法,按钮现在没有任何作用我没有发布任何新方法。这都是您的原始代码。告诉我,您为什么决定使用
MyWidgetIntententReceiver
?看起来您的基本原理都错了。