Android AppWidgetProvider 定时刷新问题


AppWidgetProvider是专门用来制作Android桌面组件的东东

本来想做一个小时钟

但是在定时刷新的时候遇到了问题

很多资料和书上的方法是

在onUpdate()方法中

用Intent请求Service

    Intent intent = new Intent(context, UpdateService.class);
    context.startService(intent);
在service中的onStart()或者onReceive()方法中来实现更新界面

而在AndroidManifest.xml中定义一个receiver

    <receiver
      android:label="@string/app_name"
      android:name=".DeskMain">
            <intent-filter> 
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
            </intent-filter> 
     <meta-data android:name="android.appwidget.provider"
        android:resource="@xml/my_widget_provider" >
      </meta-data>
    </receiver>
DeskMain是你的AppWidgetProvider类 @xml/my_widget_provider是提供UI信息的配置文件 比如宽高

android.appwidget.action.APPWIDGET_UPDATE 书上的解释是 当AppWidget更新时会收到的系统广播信息

但是用eclipse填写xml的时候这个选项已经没有了 于是上网查了一下

在 appwidget-provider 用 android:updatePeriodMillis 这种方式已经在SKD1.5以后被废了

解决的办法找了一下 大概总结了几种

1.在onUpdate()中用自己的Timer和TimerTask解决

2.用Thread

3.Intent intent=new Intent(context ,WidgetService.class);
        PendingIntent refreshIntent=PendingIntent.getService(context, 0, intent, 0);
        AlarmManager alarm=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        alarm.setRepeating(AlarmManager.RTC, 0, 1000, refreshIntent);//每秒1次
        context.startService(intent);     


service类↓

  1. public class WidgetService extends Service  
  2. {  
  3.   
  4.     @Override  
  5.     public IBinder onBind(Intent intent)  
  6.     {         
  7.         return null;  
  8.     }  
  9.       
  10.     @Override  
  11.     public void onStart(Intent intent, int startId)  
  12.     {     
  13.         super.onStart(intent, startId);  
  14.         RemoteViews rv = new RemoteViews(this.getPackageName(), R.layout.app);  
  15.         rv.setTextViewText(R.id.av1, new Date().toLocaleString());  
  16.         ComponentName cn = new ComponentName(this, DeskMain.class);  
  17.         AppWidgetManager am = AppWidgetManager.getInstance(this);  
  18.         am.updateAppWidget(cn, rv);  
  19.     }  
  20. }  

AppWidgetProvider类↓

  1. public class DeskMain extends AppWidgetProvider  
  2. {  
  3.   
  4.     @Override  
  5.     public void onUpdate(Context context, AppWidgetManager appWidgetManager,  
  6.             int[] appWidgetIds)  
  7.     {  
  8.         Log.i("syso""update3...................");  
  9.         Intent intent=new Intent(context ,WidgetService.class);  
  10.         PendingIntent refreshIntent=PendingIntent.getService(context, 0, intent, 0);  
  11.         AlarmManager alarm=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);  
  12.         alarm.setRepeating(AlarmManager.RTC, 01000, refreshIntent);  
  13.         context.startService(intent);        
  14.     }  
  15.       
  16.     @Override  
  17.     public void onReceive(Context context, Intent intent)  
  18.     {  
  19.         Log.i("syso""receive...................");  
  20.         super.onReceive(context, intent);  
  21.     }  

AndroidManifest.xml

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.       package="com.app"  
  4.       android:versionCode="1"  
  5.       android:versionName="1.0">  
  6. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>  
  7.   
  8.   
  9.     <application android:icon="@drawable/icon" android:label="@string/app_name" android:screenOrientation="portrait" android:permission="android.permission.ACCESS_FINE_LOCATION">  
  10.         <activity android:name=".Main"  
  11.                   android:label="@string/app_name">  
  12.      <!--  -->  
  13.     <receiver  
  14.       android:label="@string/app_name"  
  15.       android:name=".DeskMain">  
  16.             <intent-filter>    
  17.                 <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />    
  18.             </intent-filter>    
  19.      <meta-data android:name="android.appwidget.provider"  
  20.         android:resource="@xml/my_widget_provider" >  
  21.       </meta-data>  
  22.     </receiver>  
  23.     <service android:name="WidgetService" />  
  24.       
  25.     </application>  
  26.     <uses-sdk android:minSdkVersion="7" />    
  27.       
  28. </manifest>  

layout下的app.xml UI布局                                          xml下的my_widget_provider.xml 提供了UI宽高信息

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout  
  3.   xmlns:android="http://schemas.android.com/apk/res/android"  
  4.   android:layout_width="fill_parent"  
  5.   android:layout_height="fill_parent" android:orientation="horizontal" android:gravity="center">  
  6.     <ImageView android:src="@drawable/icon" android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/imageView1"></ImageView>  
  7.       
  8.     <TextView   
  9.      android:gravity="center" android:text="TextView" android:id="@+id/av1" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>  
  10. </LinearLayout>  
   
  1. <?xml version="1.0" encoding="utf-8"?>    
  2. <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"    
  3.     android:minWidth="95dip"    
  4.     android:minHeight="73dip"    
  5.     android:initialLayout="@layout/app"/>   
  • 1
  • 2
  • 下一页

相关内容