Android 主屏幕小部件

Android home screen widget

我是第一次做widget开发。所以请多多包涵。我有一个从 onStart() 启动小部件的 Android 服务。所以我在我的 WidgetProvider class onUpdate() 中并像按钮一样更新视图。 现在我的问题是 -

1) 如何处理小部件中的按钮按下并告知服务有关按钮按下的信息以便服务执行其工作?

2) 服务完成工作后,需要更新小部件按钮,我该如何处理?

3) 当应用被杀死时,服务也被杀死。那么当我点击widget时,如何判断应用被kill掉并打开应用呢?

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 中,您将检查意图操作是否为 "Play" 并从那里开始您的服务:

Intent serviceIntent = new Intent(context, MyService.class);

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

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。