首次单击Android widget时无法启动活动
我有一个android小部件,它实际上是一个启动活动的按钮。该小部件使用此代码工作正常,但有一个小错误: 当我将小部件添加到主屏幕时,第一次单击它什么也不做,第二次它工作。然后,它从第一次单击开始正常工作。当手机重启时也会发生同样的事情。有人能帮我解决这个问题吗 MyWidgetIntenterReceiver.java首次单击Android widget时无法启动活动,android,android-widget,android-pendingintent,Android,Android Widget,Android Pendingintent,我有一个android小部件,它实际上是一个启动活动的按钮。该小部件使用此代码工作正常,但有一个小错误: 当我将小部件添加到主屏幕时,第一次单击它什么也不做,第二次它工作。然后,它从第一次单击开始正常工作。当手机重启时也会发生同样的事情。有人能帮我解决这个问题吗 MyWidgetIntenterReceiver.java MyWidgetProvider.java: public class MyWidgetProvider extends AppWidgetProvider {
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小部件非常陌生,并且缺少一些您需要了解的基础知识。我的建议是找到更多的教程,而不是你编写的教程,来比较处理小部件的不同方式 我编写了一个简单的小部件作为演示教程-它包含小部件所需的所有样板代码,其他内容很少:
在
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
?看起来您的基本原理都错了。