浅谈如何给appwidget添加复杂view

转载 2012年03月24日 11:45:26
我们都知道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添加复杂view

版权声明:本文为博主原创文章,未经博主允许不得转载。       我们都知道Android原生的widget只支持极少数几个简单的view,所以功能及其简单。很多人都希望在AppWidget添加L...
  • qq_35114086
  • qq_35114086
  • 2016年11月26日 11:17
  • 111

Android AppWidget如何支持复杂的View

Android AppWidget如何支持复杂的View 一直想知道如何在AppWidget里面添加 ListView,EditText 这些复杂的View.我们知道要在AppWidget里添加...
  • chengyingzhilian
  • chengyingzhilian
  • 2013年01月12日 20:46
  • 651

从源码解析,为何AppWidget不支持自定义View

为何AppWidget不支持自定义View? 几个大类RemoveViews, RemoveViewsService, RemoveViewsFactory就不说了。不是本节主题。   切入正题,直接...
  • wangxueming
  • wangxueming
  • 2017年06月13日 10:53
  • 388

AppWidget实现自定义view

一、鸡汤 appwidget是android中小组件,我们经常说的widget其实是指的那些button、textview、imageview等这些小控件,而appwidget则是嵌入到别的app中的...
  • qq379454816
  • qq379454816
  • 2016年08月09日 11:56
  • 3287

Android中如何给app widget添加复杂view

目前我们要实现自己的Launcher,Launcher的效果要做得很炫,同时Launcher中的很多部件要动态加载。 基于Widget实现的思路可以让Launcer与应用解耦,但是很多动画效果无法实...
  • zhao3546
  • zhao3546
  • 2013年08月29日 16:58
  • 2088

代码方式桌面添加AppWidget

前段时间做了个桌面的widget,第一次接触AppWidget,遇到了不少问题,今天整理下和大家探讨下.   至于AppWidget的有些基础知识,我在这里就不多说了,大家有什么不明白,随便百度下,就...
  • So_Strange
  • So_Strange
  • 2016年03月30日 14:25
  • 1174

如何给View添加背景图片

from:@"http://xubenyang.me/54"  给大家一个问题,如何给view添加背景图片?也许在你的脑中一下子会又N多方法,但是这里想介绍的是一种使用“内置”的方法,可以省去大家不少...
  • iphoneing
  • iphoneing
  • 2010年09月15日 16:17
  • 6460

为View添加手势

#import @interface TestGestureRecognizerViewController : UIViewController { UIView *aView; } @...
  • zzzili
  • zzzili
  • 2013年01月05日 14:21
  • 1085

android视图学习---添加窗口小部件以及AppWidget的创建详解和快捷方式

转载请注明出处:http://blog.csdn.net/qinjuning                今天给大家展现的如何创建一个窗口小部件(AppWidget)以及如何...
  • u014737138
  • u014737138
  • 2016年04月06日 09:46
  • 912

给view添加旋转动画

private func startAnimation(){ // 创建动画 let anim = CABasicAnimation(keyPath: "transfo...
  • github_26672553
  • github_26672553
  • 2016年03月27日 16:40
  • 379
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:浅谈如何给appwidget添加复杂view
举报原因:
原因补充:

(最多只允许输入30个字)