`
20386053
  • 浏览: 461898 次
文章分类
社区版块
存档分类
最新评论

如何在appWidget中添加复杂的View

 
阅读更多

我们都知道android原生的widget只支持极少数几个简单的view,所以功能及其简单。很多人都希望在AppWidget添加ListView、GridView等复杂的view来实现更为复杂的功能。我们知道要在AppWidget里添加 View都是通过RemoteView来做到了,然而RemoteView本身功能很弱,支持的操作很少,而且支持RemoteView的Widget很少:

A RemoteViews object (and, consequently, an App Widget) can support the following layout classes:

* FrameLayout

* LinearLayout

* RelativeLayout

And the following widget classes:

* AnalogClock

* Button

* Chronometer

* ImageButton

* ImageView

* ProgressBar

* TextView

Descendants of these classes are not supported.

要实现上述功能通常有两种做法:

1. 修改framework层:

以上这些view都是在类名前面加了”@RemoteView” ,这样才被AppWidget所识别。网上有人流传着既然通过@RemoteView这个标签来确定RemoteView是否支持view.在view的源文件加上@RemoteView这个标签就可以支持了。这是错误的一个思想,添加RemoteView这个标签能实现的仅仅是能够在给AppWidget添加这个view的时候不会报错,但是确无法实现你所想要的功能。我们知道RemoteView是用来描述一个垮进程显示的view。 所以你的view还需要做很多有关进程间通信的事情。这个比较复杂,一般只有对framework比较牛的大神才可以做,如HTC等厂家就支持。android 3.0以后的版本也可以支持一些复杂的RemoteView,可是现在还没有开源~~~

修改framework层的优点是:可以让所有允许于该平台的launcher都可以添加这些复杂的AppWidget。

缺点是:需要的知识技能太深,一般人无法匹敌。

2. 修改launcher

我们知道诸如ADW ,GO桌面,launcher plus等主流通用桌面都可以支持带有listview的AppWidget。他们是如何实现的呢?他们的代码中都包含有一个mobi.intuitit.android.widget ,代码发布于http://code.google.com/p/android-launcher-plus/

通过在launcher中添加上述代码便可以使用针对这个框架实现的一些appwidget,例如桌面滚动联系人:ContactWidget。

具体如何实现,这个网上的资料不是很多,我也没有研究很深入,有兴趣的童鞋可以尝试着反编译ContactWidget查看他的实现流程。

上述修改方法的优点是:具有一定的通用性,针对系统开发人员来说,按照上述修改了launcher便可以使用这一个框架的一系列的appwidget。对于应用开发人员来说开发的appwidget可以使用在诸如ADW,go桌面等这一系列的桌面上

缺点:appwidget的编写较为复杂 ,在我的资源里边有一个使用这个框架编写的widget,大家有兴趣的可以看看~~http://download.csdn.net/source/3305935

3.实现一个伪widget

如果你需要实现的是一个仅能在你自己的launcher上使用的widget,那么下面介绍的方法便很适合你。

不知道大家有没有见过Dell Stage这个桌面,反编译(邪恶的笑)后便会惊奇的发现,那些看似widget的widget,其实都不是appwidget,而是一个个activity,震惊!愕然!有木有?

稍稍研究之后便发现其中的奥秘并不复杂,甚至比之前的两种方式更为简单。

public final class Launcher extends Activity implements

View.OnClickListener, OnLongClickListener, LauncherModel.Callbacks,

AllAppsView.Watcher {

原生的launcher.java中Launcher是继承于Activity的,所以无法在其中嵌入activity,所以我们首先需要修改public final class Launcher extends ActivityGroup implements

View.OnClickListener, OnLongClickListener, LauncherModel.Callbacks,

AllAppsView.Watcher {

继承于 ActivityGroup之后便可以在 Launcher中嵌入activity了。

使用

ActivityGroup.getLocalActivityManager()获得LocalActivityManager

然后LocalActivityManager.startActivity(id, intent).getDecorView()

;可以得到指定intent的view。

例如:

我在launcher中自定义了一个activity,test.class:

LocalActivityManager lam;

ActivityGroup group;

lam = group.getLocalActivityManager();

Intent intent = new Intent(group,test.class);

Window w = lam.startActivity(id, intent);

View subactivityView =w.getDecorView();

把subactivityView嵌入后便可以得到下面的结果。我按照原来launcher中添加appwidget的添加流程,仿写了一个添加activity的框架。

由于懒得添加新资源,所以使用的是原来系统自带的资源,哈哈,最上边的Wallpapers就是我新添加的一个选项~

原理与这个类似:http://www.cnblogs.com/over140/archive/2010/09/07/1820876.html

只要将这个得到的view嵌入launcher中就可以了,具体如何嵌入的方法可以参看launcher中添加folder,appwidget的流程方法。

需要注意的是:LocalActivityManager.startActivity(id, intent)能够添加只是同一个应用里边的Activity,如果你试图加载一个外部的activity就会报错。难道我们无法像appwidget一样,将widget与launcher分离开来吗?其实这个也是有方法的,只要将你外部定义

widget的AndroidManifest.xml中的android:sharedUserId修改成与launcher2的一致,就可以让你的widget与launcher2运行在同一个进程中,这样就可以相互调用了。

上述做法的优点是:操作简单,而且理论上可以支持所有activity的view,开发appwidget就像开发普通activity一样。

缺点是:这么操作会让launcher占用很多的内存,默认dalvik为每个应用分配的空间为16M,如果添加了很多appwidget的话,很可能造成内存溢出。


分享到:
评论

相关推荐

    应用创建AppWidget的小demo

    你需要定义一个`AppWidgetProvider`并在`AndroidManifest.xml`中注册它,以便系统可以识别并处理与该AppWidget相关的广播事件,如添加、删除或更新AppWidget。 2. **AppWidgetProviderInfo**: 这是一个配置类,用于...

    Android -- AppWidget源码.zip

    用户在添加小部件时可以启动此Activity进行个性化设置,然后将配置信息保存到AppWidget提供者的SharedPreferences中。 开发流程如下: 1. **定义AppWidgetProviderInfo**: 在AndroidManifest.xml中声明...

    AppWidget窗口小部件

    当用户首次添加AppWidget时,系统会启动这个Activity,用户在这里设置个性化选项,然后Activity会返回配置信息给AppWidgetProvider。 7. **权限管理**: 创建AppWidget时,需要确保在AndroidManifest.xml中声明必要...

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

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

    AppWidget

    5. **发布AppWidget**:在`onCreate()`方法中,使用`AppWidgetManager`的`addAppWidget()`方法来发布小部件。 ```java AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this); appWidgetManager...

    appwidget的简单使用

    最后,为了让用户能够将AppWidget添加到主屏幕,你需要在主活动中创建一个意图(Intent)并调用`PendingIntent`,然后在需要的位置显示一个通知或快捷方式让用户触发添加操作。 ```java Intent intent = new Intent...

    android 桌面控件appwidget

    5. **添加AppWidget到主屏幕**:在应用中提供一个启动器(Launcher)Activity,让用户可以将AppWidget添加到主屏幕。这个Activity通常会启动一个Intent,让用户选择AppWidget的大小和位置。 6. **测试和发布**:...

    android之appwidget

    - **添加**: 用户从AppWidget选择器中添加小部件时,系统会触发`AppWidgetProvider`的`onReceive()`方法,接着调用`onEnabled()`。 - **更新**: 当需要更新小部件内容时(如定时刷新或接收到特定广播),`onUpdate...

    创建主屏幕控件----App Widget

    最后,别忘了在你的应用中添加权限,以便能够在主屏幕上添加和更新App Widget: ```xml ``` 总结来说,创建一个Android App Widget涉及以下几个关键步骤: 1. 在AndroidManifest.xml中声明BroadcastReceiver。 2....

    AppWidget桌面小控件

    1. **定义AppWidget配置**: 在AndroidManifest.xml文件中注册AppWidget,并指定其对应的AppWidget提供者类(AppWidgetProvider)。这个类是Android系统与你的AppWidget交互的入口点,继承自`AppWidgetProvider`。 2...

    android appWidget每日一句源码

    `RemoteViews`可以修改布局中的View对象,从而更新AppWidget的显示。 三、布局设计 项目的压缩包中可能包含一个或多个布局文件,比如`layout.xml`,用于定义AppWidget的外观。这个布局通常包含一个TextView,用来...

    AppWidget_DEMO

    【AppWidget_DEMO】是一个关于Android App Widget的演示项目,由CSDN博主u012792686分享。App Widget是Android系统提供的一种小型应用组件,用户可以在主屏幕上添加,无需打开应用程序就能获取信息或执行简单操作。...

    AppWidget-master.zip

    RemoteViews可以访问远程进程中的View层次结构,使得AppWidget能够在不启动应用程序的情况下更新自身。 3. **AppWidgetManager**:它是Android系统提供的接口,用于管理AppWidget实例的生命周期,如添加、删除、...

    Android基础教程之---AppWidget讲解2

    在Android开发中,AppWidget是一种可以在用户主屏幕上展示的小应用程序,它无需用户打开实际应用即可提供一些基本功能或显示信息。AppWidget是Android系统的一个独特特性,使得开发者可以将应用程序的某些功能以快捷...

    小部件AppWidget.zip

    5. **提供配置Activity(可选)**: 如果你的AppWidget需要用户进行个性化设置,你可以创建一个配置Activity,在首次添加AppWidget时调用。 学习这个压缩包,你将可能接触到以下知识点: 1. **BroadcastReceiver**...

    Android AppWidget实例验证

    在该类中,重写`onUpdate()`方法以在AppWidget被添加或更新时更新其UI。例如,我们可以在按钮点击时更新文本视图的内容: ```java public class AppWidgetProvider extends AppWidgetProvider { @Override ...

    安卓Andriod源码——小部件AppWidget.zip

    在Android系统中,小部件(AppWidget)是用户可以在主屏幕上添加的应用程序组件,它们提供了一种无需打开应用即可与应用交互的方式。本资源“安卓Andriod源码——小部件AppWidget.zip”包含了关于创建和实现Android...

    Android 桌面组件【app widget】 进阶项目--心情记录器

    6. **元数据配置**:在AndroidManifest.xml中,我们需要定义`<appwidget-provider>`标签,设置App Widget的大小、初始布局、最小尺寸等属性。 7. **Widget配置活动**(Optional):如果小部件需要用户进行初次设置...

    Android小部件AppWidget-IT计算机-毕业设计.zip

    【Android小部件AppWidget】是Android操作系统中的一种特殊组件,它允许用户在主屏幕上放置小型的应用程序界面元素,提供快捷的操作或显示实时信息。在Android应用开发中,AppWidget是扩展应用程序功能的一种方式,...

    Android Appwidget

    在本项目中,我们将深入探讨如何实现一个简单的Android AppWidget。 首先,了解AppWidget的基本构成: 1. **AppWidgetProvider**: 这是AppWidget的主要组件,继承自BroadcastReceiver。它监听并响应系统广播,如...

Global site tag (gtag.js) - Google Analytics