随笔 - 224  文章 - 41  trackbacks - 0
<2010年8月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

享受编程

常用链接

留言簿(11)

随笔分类(159)

随笔档案(224)

文章分类(2)

文章档案(4)

经典c++博客

搜索

  •  

最新评论

阅读排行榜

评论排行榜

参考网站:http://www.eoeandroid.com/viewthread.php?tid=19709&highlight=widget
        Android开发应用除了程序应用,还有是Widget应用。好多人会开发程序应用而不会开发Widget应用。
   

先简单说说Widget的原理。Widget是在桌面上的一块显示信息的东西,也通过单击Widget跳转到一个程序里面。而系统自带的程序,典型的Widget是music,这个Android内置的音乐播放小程序。这个是典型的Widget+app应用。就是一个程序既可以通过Widget启动,也可以通过App启动。Widget就是一个AppWidgetProvider+一个UI界面显示(预先绑定了好多Intent),界面上的信息可以通过程序控制而改变,单击Widget,上的控件只能激发发送一个Intent,或发出一个Service的启动通知。而AppWidgetProvider可以拦截这个Intent,而进行相应的处理(比如显示新的信息)。

    我们先来看看AndroidManifest.xml中的代码:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package
="com.android"
      android:versionCode
="1"
      android:versionName
="1.0">
    
<application android:icon="@drawable/icon" android:label="@string/app_name">
        
<receiver android:name=".BatteryMonitor"
                  android:label
="@string/app_name">
            
<intent-filter>
                
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            
</intent-filter>
            
<meta-data
                
android:name="android.appwidget.provider"
                android:resource
="@xml/widget_provider" />
        
</receiver>

    
</application>
    
<uses-sdk android:minSdkVersion="3" />
</manifest> 
这里很清楚的可以看出AppWidgetProvider就是一个receiver的东西。
在receiver中
            <meta-data
                
android:name="android.appwidget.provider"
                android:resource
="@xml/widget_provider" />
代表了一个widget_provider代码如下:
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider
  
xmlns:android="http://schemas.android.com/apk/res/android"
  android:minWidth
="100dip"
  android:minHeight
="100dip"
  android:initialLayout
="@layout/main" >
</appwidget-provider>

这个是Widget的显示设置,是对Widget属性的一个配置文件这个android:minHeight是Widget的高,这个android:minWidth
是Widget的宽。这个android:updatePeriodMillis属性是设置Widget页面的
更新页面的时间的频率。而这个android:initialLayout属性是表示的是初始化页面的布局,Android里画UI的地方都是通过xml文件,也可以通过代码程序来画,不过这样画的太麻烦了。

建一个类BatteryMonitor继承于AppWidgetProvider,而AppWidgetProvider继承与android.content.BroadcastReceiver,所以TestAppWidget就是一个拦截处理Intent的BroadcastReceiver,这些Intent只能在Androidmainfest里设置来拦截处理。
在onUpdate中设置窗口界面:

    public void defaultWidget(Context context) {
        
        RemoteViews updateViews 
= new RemoteViews(context.getPackageName(), R.layout.main);
        
        
//updateViews.setTextViewText(R.id.battery_level, BatteryLevel+" %");
        
        updateViews.setImageViewResource(R.id.battery_img, R.drawable.batteryimg);
        
        
// Push update for this widget to the home screen
        ComponentName batteryWidget = new ComponentName(context, BatteryMonitor.class);
        AppWidgetManager manager 
= AppWidgetManager.getInstance(context);
        manager.updateAppWidget(batteryWidget, updateViews);        
    }
启动一个服务来更新电源电量:
context.startService(new Intent(context, BatteryMonitorReceiver.class));
import android.app.Service;
import android.appwidget.AppWidgetManager;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.util.Log;
import android.widget.RemoteViews;




public class BatteryMonitorReceiver extends Service
{
    
private int BatteryLevel = 0;

    
private BroadcastReceiver batteryReceiver = new BroadcastReceiver()
    
{
        @Override
        
public void onReceive(Context context, Intent intent)
        
{
            String action 
= intent.getAction();
            
if (action.equals(Intent.ACTION_BATTERY_CHANGED))
            
{
                Log.d(
"BatteryLevel","BatteryCHANGED");
                BatteryLevel 
= intent.getIntExtra("level"0);
                UpdateAppWidget(context);
            }

        }

    }
;
    
    
public void UpdateAppWidget(Context context){
         RemoteViews updateViews 
= new RemoteViews(context.getPackageName(), R.layout.main);
         updateViews.setTextViewText(R.id.battery_level, BatteryLevel
+" %");
        
        
// Push update for this widget to the home screen
        ComponentName batteryWidget = new ComponentName(context, BatteryMonitor.class);
        AppWidgetManager manager 
= AppWidgetManager.getInstance(context);
        manager.updateAppWidget(batteryWidget, updateViews);
    }

    
    
/* (non-Javadoc)
     * @see android.app.Service#onCreate()
     
*/

    @Override
    
public void onCreate() {
        
// TODO Auto-generated method stub
        super.onCreate();
        
        IntentFilter itFilter 
= new IntentFilter();
        itFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
        registerReceiver(batteryReceiver, itFilter);
    }


    @Override
    
public void onStart(Intent intent, int startId)
    
{
        
    }


    
    
/* (non-Javadoc)
     * @see android.app.Service#onDestroy()
     
*/

    @Override
    
public void onDestroy() {
        
// TODO Auto-generated method stub
        super.onDestroy();
        unregisterReceiver(batteryReceiver);
    }


    @Override
    
public IBinder onBind(Intent intent)
    
{
        
// TODO Auto-generated method stub
        return null;
    }


}
在xml中注册服务
        <service android:name=".BatteryMonitorReceiver">
          
<intent-filter>
              
<action android:name="com.adroid.pp" />
              
<category android:name="android.intent.category.default" />
          
</intent-filter>
        
</service>
代码下载
posted on 2010-06-13 13:13 漂漂 阅读(3118) 评论(1)  编辑 收藏 引用 所属分类: android 开发

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理