我有一个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>
答案 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
。