`
407827531
  • 浏览: 1073118 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

Android中的AppWidget(上)

阅读更多

推荐安卓开发神器(里面有各种UI特效和android代码库实例)

   Android中的AppWidget与google widget和中移动的widget并不是一个概念,这里的AppWidget只是把一个进程的控件嵌入到别外一个进程的窗口里的一种方法。View在另外一个进程里显示,但事件的处理方法还是在原来的进程里。这有点像 X Window中的嵌入式窗口。
broncho-a1-widget

Android中的AppWidget包括以下几个部分:

AppWidgetProvider

AppWidgetProvider是AppWidget提供者需要实现的接口,它实际上是一个BroadcastReceiver。只不过子类要实现的不再是onReceive,而是转换成了几个新的函数:

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
public void onDeleted(Context context, int[] appWidgetIds)
public void onEnabled(Context context)
public void onDisabled(Context context)

这几个函数用来响应AppWidgetService发出的相应的广播消息。

AppWidgetProvider的实现者

作为AppWidgetProvider的实现者,一定要实现onUpdate函数,因为这个函数决定widget的显示方式,如果没有这个函数widget根本没办法出现。

void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)

onUpdate的实现基本上遵循下面的流程:

o 创建RemoteViews
o 调用AppWidgetManager的updateAppWidget去更新widget.

现在我们看下Music里的MediaAppWidgetProvider实现:

    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        defaultAppWidget(context, appWidgetIds);
 
        // Send broadcast intent to any running MediaPlaybackService so it can
        // wrap around with an immediate update.
        Intent updateIntent = new Intent(MediaPlaybackService.SERVICECMD);
        updateIntent.putExtra(MediaPlaybackService.CMDNAME,
                MediaAppWidgetProvider.CMDAPPWIDGETUPDATE);
        updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
        updateIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
        context.sendBroadcast(updateIntent);
    }


在defaultAppWidget里面:
o 创建RemoteViews,并设置相应的属性。

       final Resources res = context.getResources();
        final RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.album_appwidget);
 
        views.setViewVisibility(R.id.title, View.GONE);
        views.setTextViewText(R.id.artist, res.getText(R.string.emptyplaylist));


o 为View上的控制设置事件处理方法。

        linkButtons(context, views, false /* not playing */);
 
       private void linkButtons(Context context, RemoteViews views, boolean playerActive) {
        // Connect up various buttons and touch events
        Intent intent;
        PendingIntent pendingIntent;
 
        final ComponentName serviceName = new ComponentName(context, MediaPlaybackService.class);
 
        if (playerActive) {
            intent = new Intent(context, MediaPlaybackActivity.class);
            pendingIntent = PendingIntent.getActivity(context,
                    0 /* no requestCode */, intent, 0 /* no flags */);
            views.setOnClickPendingIntent(R.id.album_appwidget, pendingIntent);
        } else {
            intent = new Intent(context, MusicBrowserActivity.class);
            pendingIntent = PendingIntent.getActivity(context,
                    0 /* no requestCode */, intent, 0 /* no flags */);
            views.setOnClickPendingIntent(R.id.album_appwidget, pendingIntent);
        }
 
        intent = new Intent(MediaPlaybackService.TOGGLEPAUSE_ACTION);
        intent.setComponent(serviceName);
        pendingIntent = PendingIntent.getService(context,
                0 /* no requestCode */, intent, 0 /* no flags */);
        views.setOnClickPendingIntent(R.id.control_play, pendingIntent);
 
        intent = new Intent(MediaPlaybackService.NEXT_ACTION);
        intent.setComponent(serviceName);
        pendingIntent = PendingIntent.getService(context,
                0 /* no requestCode */, intent, 0 /* no flags */);
        views.setOnClickPendingIntent(R.id.control_next, pendingIntent);
    }


o 更新widget

    pushUpdate(service, appWidgetIds, views);
    private void pushUpdate(Context context, int[] appWidgetIds, RemoteViews views) {
        // Update specific list of appWidgetIds if given, otherwise default to all
        final AppWidgetManager gm = AppWidgetManager.getInstance(context);
        if (appWidgetIds != null) {
            gm.updateAppWidget(appWidgetIds, views);
        } else {
            gm.updateAppWidget(THIS_APPWIDGET, views);
        }
    }


RemoteViews

RemoteViews并不是一个真正的View,它没有实现View的接口,而只是一个用于描述View的实体。比如:创建View需要的资源ID和各个控件的事件响应方法。RemoteViews会通过进程间通信机制传递给AppWidgetHost。

现在我们可以看出,Android中的AppWidget与google widget和中移动的widget并不是一个概念,这里的AppWidget只是把一个进程的控件嵌入到别外一个进程的窗口里的一种方法。View在另外一个进程里显示,但事件的处理方法还是在原来的进程里。这有点像 X Window中的嵌入式窗口。

 

分享到:
评论

相关推荐

    android之appwidget(一)简单appwidget

    在Android平台上,AppWidget是系统桌面的一个组成部分,它允许开发者创建小型、静态或动态的应用程序组件,用户可以直接在主屏幕上与这些组件互动,无需打开完整的应用程序。本篇将深入探讨如何开发一个简单的App...

    android之appwidget(四)终 appwidget控件更新

    在Android平台上,AppWidget是能够将小部件添加到用户主屏幕上的迷你应用程序,它们提供了一种无需打开完整应用即可展示信息或执行简单操作的方式。本文将深入探讨Android AppWidget的第四部分,主要关注如何更新App...

    appWidget启动Activity

    在Android开发中,`appWidget` 是一种可以在用户主屏幕上显示的小部件,它提供了一种无需打开应用程序就能与用户交互的方式。本篇文章将深入探讨如何使用`appWidget`来启动一个`Activity`。 首先,我们需要了解`app...

    Android AppWidget实例验证

    在Android平台上,AppWidget是Android系统提供的一种小部件功能,允许开发者创建可以在用户主屏幕上显示的小应用程序。AppWidgets虽然小巧,但能为用户提供便捷的功能访问,例如天气预报、音乐播放控制等。本教程将...

    Android App Widget 开发

    <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> android:name="android.appwidget.provider" android:resource="@xml/app_widget_info" /> <service android:name="....

    android之appwidget(二)启动新activity

    一个AppWidget由一个或多个`RemoteViews`组成,`RemoteViews`是用于展示在AppWidget上的视图。它们不直接支持启动Activity,但我们可以利用PendingIntent来实现这一功能。PendingIntent是一个表示意图的未来动作,它...

    android appwidget使用说明及示例程序

    Android AppWidget是Android系统提供的一种轻量级组件,允许开发者在用户的主屏幕上创建小型应用程序,通常称为小部件或快捷方式。这些小部件不需要用户启动应用,就能直接在主屏幕上显示和交互,为用户提供便捷的...

    android AppWidget ListView

    在Android开发中,AppWidget是桌面小部件,它允许开发者将应用程序的功能直接集成到用户的主屏幕上,无需打开应用。在本案例中,我们探讨的是如何在AppWidget中使用ListView,这是一个增强用户交互的方式,使小部件...

    android appwidget全面解析

    同时,WidgetProvider还应处理用户在AppWidget上的点击等交互事件。 ### 四、开发技巧与注意事项 #### 4.1 性能优化 由于AppWidget可能会消耗系统资源,开发者应关注性能优化。避免在AppWidget中执行耗时操作,如...

    android app widget demo

    在"appwidget"这个压缩包文件中,可能包含了示例代码和资源文件,供开发者学习如何实现上述功能。通过研究这些文件,你可以更好地理解App Widget的工作原理和实现细节,从而在自己的项目中创建出富有特色的桌面小...

    android之appwidget

    AppWidget是Android操作系统提供的一种组件,允许开发者在用户主屏幕上创建小型应用程序,这些小部件无需用户直接启动应用就能显示和交互。AppWidget为用户提供了一种快速访问应用功能的方式,增强了用户体验。本文...

    android appwidget 经典完整代码

    Android AppWidget是Android系统提供的一种桌面小部件功能,允许开发者创建可以放置在用户主屏幕上的小型应用程序。这些小部件不需要用户直接启动,而是持续显示在屏幕上,为用户提供快速访问或控制应用的功能。在这...

    android 桌面控件appwidget

    Android 桌面控件(AppWidget)是Android操作系统提供的一种独特功能,允许开发者创建可以在用户主屏幕上显示的小型应用程序组件。这些控件通常提供快速访问应用的核心功能或展示实时信息,如天气预报、日历事件或...

    Android -- AppWidget源码.zip

    在Android系统中,AppWidget是桌面小部件的实现,它允许开发者将应用程序的功能和信息集成到用户的主屏幕上,用户无需打开应用即可与之交互。这个压缩包“Android -- AppWidget源码.zip”很可能是包含了Android App...

    Android之AppWidget(桌面小部件)开发浅析

    AppWidget 即桌面小部件,也叫桌面控件,就是能直接显示在Android系统桌面上的小程序,先看图:   图中我用黄色箭头指示的即为AppWidget,一些用户使用比较频繁的程序,可以做成AppWidget,这样能方便地使用。典型...

    android之appwidget(三)自定义action广播

    在Android开发中,AppWidget是桌面小部件,它允许开发者扩展Android主屏幕的功能,提供一种在用户主屏幕上显示实时信息和交互式控件的方式。本文将深入探讨如何在AppWidget中自定义Action广播,以便更好地控制和扩展...

    android app widget 介绍

    App Widget 的概念 一个简单的App Widget例子 PendingIntent的使用 RemoteViews的使用 接收来自App Widget的广播 更新App Widget的控件状态

    appWidget启动Service

    在Android开发中,AppWidget是桌面小部件,它允许用户在主屏幕上与应用程序进行交互,而无需实际打开应用。Service是Android系统中的一个组件,它可以在后台长时间运行,执行一些耗时的操作,如音乐播放、数据同步等...

    Android应用源码之Android小部件AppWidget.zip

    在Android开发中,AppWidget是桌面小插件,它并不像普通的应用程序那样通过用户点击图标启动,而是直接在主屏幕上显示并可以实时更新内容。用户可以自定义小部件的大小和样式,并且可以通过小部件与应用程序进行简单...

    android 桌面组件 App widget的使用 AppWidgetProvider

    <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> android:name="android.appwidget.provider" android:resource="@xml/app_widget_info" /> ``` 其中,`<meta-data>` 标签引用了一个 ...

Global site tag (gtag.js) - Google Analytics