繁体   English   中英

Android主屏幕小部件

[英]Android home screen widget

我是第一次进行小部件开发。 所以,请忍受我。 我有一个Android服务,该服务从onStart()启动小部件。 因此,我在WidgetProvider类的onUpdate()并更新了按钮之类的视图。 现在我的问题是-

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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM