始创于2000年 股票代码:831685
咨询热线:0371-60135900 注册有礼 登录
  • 挂牌上市企业
  • 60秒人工响应
  • 99.99%连通率
  • 7*24h人工
  • 故障100倍补偿
您的位置: 网站首页 > 帮助中心>文章内容

Android Launcher开发之桌面小部件AppWidget详解

发布时间:  2012/8/9 17:19:58

导读:先简单说说Widget的原理。Widget是在桌面上的一块显示信息的东西,也通过单击Widget跳转到一个程序里面。而系统自带的程序,典型的Widget是music,这个Android内置的音乐播放小程序。先简单说说Widget的原理。Widget是在桌面上的一块显示信息的东西,也通过单击Widget跳转到一个程序里面。而系统自带的程序,典型的Widget是music,这个Android内置的音乐播放小程序。这个是典型的Widget+app应用。就是一个程序既可以通过Widget启动,也可以通过App启动。Widget就是一个AppWidgetProvider+一个UI界面显示(预先绑定了好多Intent),界面上的信息可以通过程序控制而改变,单击Widget,上的控件只能激发发送一个Intent,或发出一个Service的启动通知。而AppWidgetProvider可以拦截这个Intent,而进行相应的处理(比如显示新的信息)。Android开发里要大量的通过手动的方式配置好多xml文件。这对于.net开发来说不得不说是个梦靥呀。这也许也是一般的java程序员比.net程序的工资高的一个原因吧。毕竟做Java开发,特别是Android开发,确实很累。你可以看下源码对照着源码进行讲解。我们先开发一个比较简单的Widget应用,实现的主要功能是可以通过的不断变化,而不断的显示当前时间。首先,要自己手动建一个名为xml的文件夹。建一个xml文件,加入如下代码:

1.<appwidget-providerxmlns:Android="http://schemas.android.com/apk/res/android
2. 
3.        Android:minHeight="72px"  4. 
5.        Android:minWidth="72px"    6. 
7.      Android:updatePeriodMillis="3800000"android:initialLayout="@layout/main">  8. 
9. </appwidget-provider> 
这个是Widget的显示设置,是对Widget属性的一个配置文件这个Android:minHeight是Widget的高,这个android:minWidth 是Widget的宽。这个android:updatePeriodMillis属性是设置Widget页面的 更新页面的时间的频率。而这个android:initialLayout属性是表示的是初始化页面的布局,Android里画UI的地方都是通过xml文件,也可以通过代码程序来画,不过这样画的太麻烦了。 看下以下的文件系统,res文件夹是系统存放资源文件的目录。以drawable开头的文件夹是存放图片资源的文件夹。而后面的hdpi和ldpi等,都是平常在不同的状态如(横屏与竖屏时)系统调用不同的图片资源。Layout就是存放的一般都是xml,UI设计就是在这个layout文件夹里。Value里放的strings.xml就是从程序里分离的字符串,在实现国际化的时候可能会用到。 看看layout里的main.xml ,只有一个空间就是TextView,这个是用来显示时间用的。 建一个类TestAppWidget继承于AppWidgetProvider,而AppWidgetProvider继承与android.content.BroadcastReceiver,所以TestAppWidget就是一个拦截处理Intent的BroadcastReceiver,这些Intent只能在Androidmainfest里设置来拦截处理。

1.public class TestAppWidget extends AppWidgetProvider { 
2.  private static final String TAG="TestAppWidget";  3.  private static final String FRESH="com.sinxiao.app.fresh";  4.   private Context mContext ;  5.   private boolean run = true ;  6.   BroadcastReceiver mBroadcast =newBroadcastReceiver() {     
7. 
8.    
9. 
10.      public void onReceive(Contextcontext, Intent intent) {     11.       String action =intent.getAction(); 
12.     
13.       if(action.equals(Intent.ACTION_TIME_TICK)) {  14.    
15.       mContext.sendBroadcast(newIntent(FRESH)); 
16.    
17.    } 
18.    
19.   } 
20.     
21.  }; 
22.     
23.   /** 24.    
25.   * 通知Widget每个1秒刷新一次
26.    */ 
27.  Thread myThread = new  28.    Thread(){ 
29.     
30.    public void run() {  31.    
32.    while (run) {  33.     
34.    try {  35.    
36.    Thread.sleep(1000);  37.     } catch (InterruptedException e) {  38.    e.printStackTrace(); 
39.    } 
40.    mContext.sendBroadcast(newIntent(FRESH));//通知刷新Widget的Intent   41.    } 
42.   }; 
43.    }; 
44.    
45.    @Override   46.    public void onUpdate(Contextcontext, AppWidgetManager appWidgetManager,  47.     
48.   int[] appWidgetIds) {  49.       //  用来给Widget刷新界面显示   50.    Log.d(TAG,"onUpdate");  51.   super.onUpdate(context,appWidgetManager, appWidgetIds);  52.    mContext = context; 
53.    RemoteViews views = newRemoteViews(context.getPackageName(),R.layout.main); 
54.    Calendar 
55.    cal=Calendar.getInstance(); 
56.    System.out.println(cal.getTime().toLocaleString()); 
57.    views.setTextViewText(R.id.txttim,cal.getTime().toLocaleString()); 
58.    appWidgetManager.updateAppWidget(appWidgetIds,views); 
59.   myThread.start(); 
60.    /** 61.   * 本类作为一个bracastReveiver能自己再,注册个监听器
62.   (可以取消注释,看报什么错误)
63.  */ 
64.    //   65.   context.registerReceiver(mBroadcast,new IntentFilter(Intent.ACTION_TIME_TICK));  66.    } 
67.    @Override  68.   public void onReceive(Contextcontext, Intent intent) {  69.    Log.d(tag,"onReceive");  70.    String action =intent.getAction(); 
71.    Log.d(tag, "theaction is "+action);  72.    if (FRESH.equals(action)){  73.    showTime(context); 
74.    }elseif(Intent.ACTION_TIME_TICK.equals(action)){ 
75.    showTime(context); 
76.  } 
77.   super.onReceive(context,intent);  78.    } 
79.    private void showTime(Contextcontext) {  80.    RemoteViews views = newRemoteViews(context.getPackageName(),R.layout.main); 
81.    Calendar 
82.    cal=Calendar.getInstance(); 
83.   views.setTextViewText(R.id.txttim,cal.getTime().toLocaleString()); 
84.    ComponentName thisWidget =new ComponentName(context,TestAppWidget.class);  85.    AppWidgetManager.getInstance(context).updateAppWidget(thisWidget,views); 
86.    } 
87.    public void onDisabled(Contextcontext) {  88.    Log.d(tag,"onDisabled");  89.    super.onDisabled(context);  90.    run = false ;  91.    } 
92.    } 


本文出自:亿恩科技【www.enkj.com】

服务器租用/服务器托管中国五强!虚拟主机域名注册顶级提供商!15年品质保障!--亿恩科技[ENKJ.COM]

  • 您可能在找
  • 亿恩北京公司:
  • 经营性ICP/ISP证:京B2-20150015
  • 亿恩郑州公司:
  • 经营性ICP/ISP/IDC证:豫B1.B2-20060070
  • 亿恩南昌公司:
  • 经营性ICP/ISP证:赣B2-20080012
  • 服务器/云主机 24小时售后服务电话:0371-60135900
  • 虚拟主机/智能建站 24小时售后服务电话:0371-60135900
  • 专注服务器托管17年
    扫扫关注-微信公众号
    0371-60135900
    Copyright© 1999-2019 ENKJ All Rights Reserved 亿恩科技 版权所有  地址:郑州市高新区翠竹街1号总部企业基地亿恩大厦  法律顾问:河南亚太人律师事务所郝建锋、杜慧月律师   京公网安备41019702002023号
      0
     
     
     
     

    0371-60135900
    7*24小时客服服务热线