Android主屏幕小部件

时间:2017-03-03 10:30:59

标签: java android widget android-widget

我是第一次进行小部件开发。所以请耐心等待。我有一个Android服务,可以从onStart()启动小部件。所以我在WidgetProvideronUpdate()并更新按钮等视图。 现在我的问题是 -

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 个答案:

答案 0 :(得分:1)

1)您已经使用MyWidgetProvider方法执行此操作。虽然您的目标应该是Intent intent = new Intent(context, MyWidgetProvider.class); ,但是这样:

onReceive

然后在Intent serviceIntent = new Intent(context, MyService.class); 中,您将检查意图操作是否为“播放”并从那里开始服务:

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

2)为了让您的服务与您的Widget进行通信,您需要发送广播:

onUpdate

3)你不需要明确打开应用程序(实际上你不能这样做),如果你的更新周期设置为30分钟,你将收到onReceive回调,你需要从那里开始你的服务。

4)当操作与您的自定义操作(ApplicationEvents.DATA_FETCHED)匹配时,您将更新 alertDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 事件中的用户界面。