首次单击时,Android小部件无法启动活动

时间:2014-05-22 16:59:56

标签: android android-widget android-pendingintent

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

当我将小部件添加到主屏幕时,第一次单击它不会执行任何操作,第二次它可以正常工作。然后它从第一次点击正常工作。手机重启时会发生同样的事情。有人帮我解决了这个问题吗?

MyWidgetIntentReceiver.java

public class MyWidgetIntentReceiver extends BroadcastReceiver {


@Override
public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals("Start")) {
        onUpdate(context);
    }
}


private void onUpdate(Context context) {
    RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
            R.layout.widget_demo);

    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);

    MyWidgetProvider.pushWidgetUpdate(context.getApplicationContext(),
            remoteViews);
} }


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>


1 个答案:

答案 0 :(得分:0)

在我看来,您可能对Android小部件非常陌生,并且缺少一些您需要了解的基础知识。我的建议是找到一些除了你工作之外的其他教程,以比较小部件的不同处理方式。

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

我以这样的方式写它,让任何人都可以轻松删除&#34; wifi&#34;相关代码,并使其适应自己的小部件要求。它可能非常适合您查看,而且只需添加一个按钮就相对简单。


您正在混淆onUpdate()MyWidgetIntentReceiver中的不同MyWidgetProvider方法。下面我将尝试解释您在原始问题中提供的代码有什么问题。


当您将小部件添加到主屏幕时,会调用MyWidgetProvider.onUpdate(),然后调用buildPendingIntent()

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

这会创建一个PendingIntent,当点击该按钮时,会发送一个动作设置为&#34;开始&#34;的广播。

这就是发生的事情。单击该按钮,您将发送&#34;开始&#34;在其中,这是由MyWidgetIntentReceiver收到的。

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


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

(注意:这是不好的做法;尽量少在BroadcastReceiver内做)

这个新的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活动。


总结:

  • 您的第一次更新通话PendingIntent.getBroadcast(),发送&#34;开始&#34;到接收者
  • 您的第二次更新调用PendingIntent.getActivity(),即启动WidgetFlash

我不明白您需要在此代码中使用MyWidgetIntentReceiver