我是第一次进行小部件开发。所以请耐心听我说。我有一个 Android 服务,它从 onStart()
启动小部件。所以我在我的 WidgetProvider
类 onUpdate()
中并更新按钮等 View 。
现在我的问题是 -
1) 如何处理小部件中按钮的按下并告知服务有关按钮按下的信息,以便服务正常工作?
2)服务完成工作后,需要更新小部件按钮,我该如何处理?
3) 当应用程序被终止时,服务也会被终止。那么当我点击小部件时,如何确定该应用程序已被杀死并打开该应用程序?
4)如果应用程序中的 UI 正在与服务通信并接收来自服务的响应,我如何将这些响应也告诉小部件?
我的小部件代码是这样的 -
public class MyWidgetProvider extends AppWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
RemoteViews remoteViews;
ComponentName componentName;
remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
componentName = new ComponentName(context, MyWidgetProvider.class);
remoteViews.setOnClickPendingIntent(R.id.button1,getPendingSelfIntent(context, "Play",componentName));
remoteViews.setOnClickPendingIntent(R.id.button2,getPendingSelfIntent(context, "Pause",componentName));
appWidgetManager.updateAppWidget(componentName, remoteViews);
}
@Override
public void onReceive(Context context, Intent intent)
{
super.onReceive(context, intent);
if ("Play".equals(intent.getAction())) {
//I really dont know what to do here....
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
RemoteViews remoteViews;
ComponentName watchWidget;
remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
watchWidget = new ComponentName(context, MyWidgetProvider.class);
appWidgetManager.updateAppWidget(watchWidget, remoteViews);
}
}
protected PendingIntent getPendingSelfIntent(Context context, String action, ComponentName componentName) {
Intent intent = new Intent(context, MyService.class);
intent.setAction(action);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, componentName);
return PendingIntent.getService(context, 0, intent, 0);
}
}
请您帮我解决这个问题
最佳答案
1) 您已经使用 getPendingSelfIntent()
方法执行此操作。尽管您的目标应该是 MyWidgetProvider
,如下所示:
Intent intent = new Intent(context, MyWidgetProvider.class);
然后在您的 onReceive
中,您将检查 Intent 操作是否为“Play”并从那里启动您的服务:
Intent serviceIntent = new Intent(context, MyService.class);
2) 为了让您的服务与您的小部件通信,您需要发送广播:
Intent widgetUpdateIntent = new Intent(this, MyWidgetProvider.class);
widgetUpdateIntent.setAction(ApplicationEvents.DATA_FETCHED);//this is your custom action
widgetUpdateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
sendBroadcast(widgetUpdateIntent);
3) 您不需要显式打开应用程序(实际上您不能这样做),如果您将更新周期设置为 30 分钟,您将收到 onUpdate
回调并且您也需要从那里启动您的服务。
4) 当操作与您的自定义操作 (ApplicationEvents.DATA_FETCHED
) 匹配时,您将在 onReceive
事件中更新 UI。
关于java - Android 主屏幕小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42576489/