讲解Android中的Widget及AppWidget小工具的创建实例

时间:2022-02-08 08:56:52

1.widget 、app widget 、web app 的概念

widget最初的概念是98年一个叫rose的苹果工程师提出,直到2003年的时候才正式为大家所知,不过随后无数大公司都开始接受并应用这一思路。 现在我们看到在苹果系统里按下f4弹出的dashboard里的小工具叫widget,在windows 7里侧边栏上的那些漂亮的小工具叫gadget(widget变体?),除此以外还有yahoo widget等等widget产品。他们有一个共同的特点就是采用前台web开发用的技术(譬如html、css、javascript)来制作的小工 具、小部件。

在android系统里,几乎每个可视化的view组件都叫widget,起这个名字可能当时是为了赶时髦。

app widget是从android 1.5以后才有的东东,就是可以放在android桌面上的应用程序小组件。这一点上看他的功能很像windows的侧边栏小工具,可惜的是他的采用技术 并不是html等技术。当然app widget才是我们本讲的主角,本来他应该顺理成章叫做widget的,至少也要叫做gadget吧,可惜这个名字已经被他自己的系统占用了,所以只好 改名叫app widget。

最后讲一下web app 或者说是android web application,也许叫mobile web application 更准确些。我们发现现在智能机系统平台很多,譬如ios、android、windows phone 、webos、blackberry等等,它们采用的技术框架也各不相同,有没有办法写一个程序在各个系统上都能运行呢?答案是肯定的,写基于 webkit的浏览器的应用即可。我们使用 html5、css3、javascript、webkit 等技术来写的web application也许是今后的一个大潮流也说不准啊。有机会我们再讲讲android web application 的开发。

2.创建一个最简单的widget

代码案例:

1)main.xml

?
1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent"
  android:layout_height="fill_parent">
  <textview android:id="@+id/tvcurrtime" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello"
    android:textcolor="@color/black"/>
</linearlayout>

2)hello_widget_provider.xml

?
1
2
3
4
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
  android:minwidth="146dip" android:minheight="72dip" android:initiallayout="@layout/main">
</appwidget-provider>

3)androidmanifest.xml

?
1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.woody.testwidget" android:versioncode="1"
   android:versionname="1.0">
  <application android:icon="@drawable/icon" android:label="@string/app_name">
     <receiver android:name=".hellowidgetprovider" android:label="@string/app_name"> <!-- hellowidgetprovider为那个class(业务处理) -->
      <intent-filter>
        <action android:name="android.appwidget.action.appwidget_update" /> <!-- 指定了的 -->
      </intent-filter>
      <meta-data android:name="android.appwidget.provider"android:resource="@xml/hello_widget_provider" /> <!-- 为上面指定了的widget -->
    </receiver>
  </application>
</manifest>

4)hellowidgetprovider.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class hellowidgetprovider extends appwidgetprovider { 
  /** called when the activity is first created. */
  @override
  public void onupdate(context context, appwidgetmanager appwidgetmanager, int[] appwidgetids) {
    timer timer = new timer();
    timer.scheduleatfixedrate(new mytime(context, appwidgetmanager), 1, 1000);
  }
 
  public class mytime extends timertask {
    remoteviews remoteviews;
    appwidgetmanager appwidgetmanager;
    componentname thiswidget;
    dateformat format = simpledateformat.gettimeinstance(simpledateformat.medium, locale.getdefault());   
    public mytime(context context, appwidgetmanager appwidgetmanager) {
      this.appwidgetmanager = appwidgetmanager;
      remoteviews = new remoteviews(context.getpackagename(), r.layout.main);
      thiswidget = new componentname(context, hellowidgetprovider.class);
    }
    @override
    public void run() {
      remoteviews.settextviewtext(r.id.tvcurrtime, "time = " + format.format(new date()));
      appwidgetmanager.updateappwidget(thiswidget, remoteviews);
    }
  }
}  

代码解释:remoteview是用来描述一个跨进程显示的view,也就是说这个view是在另外一个进程显示的。它inflate于layout资源文件。并且提供了可以修改过view内容的一些简单基础的操作。

appwidget---remoteview,appwidgetprovider是一个brocasereceiver,只是接受到enable, update,disale,delete这些message,而真正显示界面的是appwidgethostview(这是在launcher里面实现的),这中间就是通过remoteview来沟通。通过remoteview告诉launcher你想要的appwidget是长什么样。