android的widget定时更新
相关文章:
推荐圈子: Android
更多相关推荐
- 让自己的Android应用支持appwidget
- widget 第一步 HelloWidget 皆 widget模版
- 关于Service的生命周期,以及ServiceConnection接口时注意的东东
推荐圈子: Android
更多相关推荐
<script type="text/javascript"></script>
在开发Android的widget时,第一个需要解决的问题就是怎么实现让widget定时更新,在查阅比较多的资料后,一般情况用Service在后台更新,废话不多说,贴代码如下:
Widget:
- public class NewsWidgetProvider extends AppWidgetProvider {
- @Override
- public void onDeleted(Context context, int[] appWidgetIds) {
- }
- @Override
- public void onDisabled(Context context) {
- // TODO Auto-generated method stub
- super.onDisabled(context);
- }
- @Override
- public void onEnabled(Context context) {
- // TODO Auto-generated method stub
- super.onEnabled(context);
- }
- @Override
- public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {
- NewsService.updateAppWidgetIds(appWidgetIds);
- context.startService(new Intent(context,NewsService.class));
- }
- public static RemoteViews updateAppWidget(Context context,List<RssNews> list) {
- RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.appwidget_layout);
- if (list.size() > 3) {
- views.setTextViewText(R.id.textView01, list.get(0).title);
- views.setTextViewText(R.id.textView02, list.get(1).title);
- views.setTextViewText(R.id.textView03, list.get(2).title);
- }
- Intent detailIntent=new Intent(context,NewsSiteList.class);
- PendingIntent pending=PendingIntent.getActivity(context, 0, detailIntent, 0);
- views.setOnClickPendingIntent(R.id.textView01, pending);
- views.setOnClickPendingIntent(R.id.textView02, pending);
- views.setOnClickPendingIntent(R.id.textView03, pending);
- return views;
- }
- @Override
- public void onReceive(Context context, Intent intent) {
- super.onReceive(context, intent);
- }
- }
public class NewsWidgetProvider extends AppWidgetProvider { @Override public void onDeleted(Context context, int[] appWidgetIds) { } @Override public void onDisabled(Context context) { // TODO Auto-generated method stub super.onDisabled(context); } @Override public void onEnabled(Context context) { // TODO Auto-generated method stub super.onEnabled(context); } @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) { NewsService.updateAppWidgetIds(appWidgetIds); context.startService(new Intent(context,NewsService.class)); } public static RemoteViews updateAppWidget(Context context,List<RssNews> list) { RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.appwidget_layout); if (list.size() > 3) { views.setTextViewText(R.id.textView01, list.get(0).title); views.setTextViewText(R.id.textView02, list.get(1).title); views.setTextViewText(R.id.textView03, list.get(2).title); } Intent detailIntent=new Intent(context,NewsSiteList.class); PendingIntent pending=PendingIntent.getActivity(context, 0, detailIntent, 0); views.setOnClickPendingIntent(R.id.textView01, pending); views.setOnClickPendingIntent(R.id.textView02, pending); views.setOnClickPendingIntent(R.id.textView03, pending); return views; } @Override public void onReceive(Context context, Intent intent) { super.onReceive(context, intent); } }
Service:
- public class NewsService extends Service implements Runnable {
- private static final String TAG="NewsService";
- private static Queue<Integer> sAppWidgetIds=new LinkedList<Integer>();
- public static final String ACTION_UPDATE_ALL = "com.xxxx.news.UPDATE_ALL";
- private static boolean sThreadRunning = false;
- private static Object sLock = new Object();
- @Override
- public IBinder onBind(Intent intent) {
- return null;
- }
- public static void updateAppWidgetIds(int[] appWidgetIds){
- synchronized (sLock) {
- for (int appWidgetId : appWidgetIds) {
- sAppWidgetIds.add(appWidgetId);
- }
- }
- }
- public static int getNextWidgetId(){
- synchronized (sLock) {
- if (sAppWidgetIds.peek() == null) {
- return AppWidgetManager.INVALID_APPWIDGET_ID;
- } else {
- return sAppWidgetIds.poll();
- }
- }
- }
- private static boolean hasMoreUpdates() {
- synchronized (sLock) {
- boolean hasMore = !sAppWidgetIds.isEmpty();
- if (!hasMore) {
- sThreadRunning = false;
- }
- return hasMore;
- }
- }
- @Override
- public void onCreate() {
- super.onCreate();
- }
- @Override
- public void onStart(Intent intent, int startId) {
- super.onStart(intent, startId);
- if (null != intent) {
- if (ACTION_UPDATE_ALL.equals(intent.getAction())) {
- AppWidgetManager widget = AppWidgetManager.getInstance(this);
- updateAppWidgetIds(widget.getAppWidgetIds(new ComponentName(this, NewsWidgetProvider.class)));
- }
- }
- synchronized (sLock) {
- if (!sThreadRunning) {
- sThreadRunning=true;
- new Thread(this).start();
- }
- }
- }
- @Override
- public void run() {
- SharedPreferences setting=getSharedPreferences("com.xxxx.news_preferences", 0);
- String updateTime=setting.getString("list_time", "1800000");
- String updateUrl=setting.getString("list_site", "xxxxxxxxx");
- AppWidgetManager appWidgetManager=AppWidgetManager.getInstance(this);
- RemoteViews updateViews=null;
- while (hasMoreUpdates()) {
- int appWidgetId=getNextWidgetId();
- List<RssNews> listNews = NewsContenttList.getNewsList(updateUrl);
- if (listNews != null) {
- updateViews = NewsWidgetProvider.updateAppWidget(this, listNews);
- }
- if (updateViews != null) {
- appWidgetManager.updateAppWidget(appWidgetId, updateViews);
- }
- }
- Intent updateIntent=new Intent(ACTION_UPDATE_ALL);
- updateIntent.setClass(this, NewsService.class);
- PendingIntent pending=PendingIntent.getService(this, 0, updateIntent, 0);
- Time time = new Time();
- long nowMillis = System.currentTimeMillis();
- time.set(nowMillis+Long.parseLong(updateTime));
- long updateTimes = time.toMillis(true);
- Log.d(TAG, "request next update at "+updateTimes);
- AlarmManager alarm=(AlarmManager)getSystemService(Context.ALARM_SERVICE);
- alarm.set(AlarmManager.RTC_WAKEUP, updateTimes, pending);
- stopSelf();
- }
- }
public class NewsService extends Service implements Runnable { private static final String TAG="NewsService"; private static Queue<Integer> sAppWidgetIds=new LinkedList<Integer>(); public static final String ACTION_UPDATE_ALL = "com.xxxx.news.UPDATE_ALL"; private static boolean sThreadRunning = false; private static Object sLock = new Object(); @Override public IBinder onBind(Intent intent) { return null; } public static void updateAppWidgetIds(int[] appWidgetIds){ synchronized (sLock) { for (int appWidgetId : appWidgetIds) { sAppWidgetIds.add(appWidgetId); } } } public static int getNextWidgetId(){ synchronized (sLock) { if (sAppWidgetIds.peek() == null) { return AppWidgetManager.INVALID_APPWIDGET_ID; } else { return sAppWidgetIds.poll(); } } } private static boolean hasMoreUpdates() { synchronized (sLock) { boolean hasMore = !sAppWidgetIds.isEmpty(); if (!hasMore) { sThreadRunning = false; } return hasMore; } } @Override public void onCreate() { super.onCreate(); } @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); if (null != intent) { if (ACTION_UPDATE_ALL.equals(intent.getAction())) { AppWidgetManager widget = AppWidgetManager.getInstance(this); updateAppWidgetIds(widget.getAppWidgetIds(new ComponentName(this, NewsWidgetProvider.class))); } } synchronized (sLock) { if (!sThreadRunning) { sThreadRunning=true; new Thread(this).start(); } } } @Override public void run() { SharedPreferences setting=getSharedPreferences("com.xxxx.news_preferences", 0); String updateTime=setting.getString("list_time", "1800000"); String updateUrl=setting.getString("list_site", "xxxxxxxxx"); AppWidgetManager appWidgetManager=AppWidgetManager.getInstance(this); RemoteViews updateViews=null; while (hasMoreUpdates()) { int appWidgetId=getNextWidgetId(); List<RssNews> listNews = NewsContenttList.getNewsList(updateUrl); if (listNews != null) { updateViews = NewsWidgetProvider.updateAppWidget(this, listNews); } if (updateViews != null) { appWidgetManager.updateAppWidget(appWidgetId, updateViews); } } Intent updateIntent=new Intent(ACTION_UPDATE_ALL); updateIntent.setClass(this, NewsService.class); PendingIntent pending=PendingIntent.getService(this, 0, updateIntent, 0); Time time = new Time(); long nowMillis = System.currentTimeMillis(); time.set(nowMillis+Long.parseLong(updateTime)); long updateTimes = time.toMillis(true); Log.d(TAG, "request next update at "+updateTimes); AlarmManager alarm=(AlarmManager)getSystemService(Context.ALARM_SERVICE); alarm.set(AlarmManager.RTC_WAKEUP, updateTimes, pending); stopSelf(); } }
这个只是我的情况,如果大家有不一样的情况,稍微修改即可。
相关推荐
"Widget定时更新"这个主题聚焦于如何通过Service组件来实现在后台定期更新Widget的内容,特别是更新图片,这是Android Widget功能的一个常见需求。 首先,我们来理解Widget和Service的基本概念。Widget是Android...
3. **Widget更新触发器**: 可以通过设置AlarmManager定时触发更新,也可以监听特定事件,如接收到新的通知或数据更改时更新Widget。 **三、源码分析** 1. **AppWidgetProvider的onReceive()方法**: 当接收到广播时...
通过这个项目,开发者不仅可以掌握基本的Widget开发技术,还能了解到如何在Android系统中与用户界面交互、如何使用BroadcastReceiver以及如何利用系统服务进行定时更新。此外,实践中遇到的问题和解决过程,也是提升...
本资料包"androidWidget小组件开发.zip"包含了一个名为"MyWidget"的示例项目,可能包含了关于如何创建和实现Android Widget小组件的代码和资源。 1. **Widget组件概述** - Android Widget是Android系统中的一个...
- **动态更新**:除了在安装时初始化Widget,还可以通过AlarmManager或JobScheduler定时更新Widget,或者根据需要(例如,接收到新的数据)触发更新。 - **自定义行为**:AppWidgetProvider的其他回调方法,如`...
综上所述,创建一个每秒刷新时间的AppWidget涉及到对`AppWidgetProvider`的理解、使用`Handler`进行定时任务、布局设计以及元数据配置等多个方面。通过精心设计和实现,你可以为用户提供一个实用且实时的桌面时钟小...
1. **AppWidgetProvider**: 这是Android中Widget的核心类,它是一个BroadcastReceiver的子类,负责处理来自系统的所有Widget相关的广播事件,如添加、删除、更新等。在`AndroidManifest.xml`中,我们需要定义...
- 可以使用AlarmManager结合BroadcastReceiver实现定时更新,也可以利用Service在后台运行时更新。 5. **Widget的最佳实践** - 优化性能:避免在Widget更新中执行耗时操作,如网络请求。 - 用户交互:尽管Widget...
3. **服务(Service)**:如果AppWidget需要后台处理或定时更新,可以使用服务来处理这些任务。例如,通过AlarmManager定期更新AppWidget的状态。 4. **Intent**:用于在AppWidget与应用的其他部分之间传递信息。 ...
开发者可以通过AppWidgetManager服务请求更新Widget,或者在服务、广播接收器等其他组件中定时更新Widget。更新通常涉及到远程服务的调用,因为Widget的更新必须在主线程之外进行,以避免阻塞用户界面。 此外,为了...
4. **AlarmManager**: 为了实现定时更新,开发者通常会使用AlarmManager来设置周期性的触发器,使Widget在指定的时间间隔内更新自身。 5. **权限(PERMISSIONS)**: 开发时钟Widget可能需要请求`INTERNET`权限,以便...
- **扩展Widget的功能**:例如,增加定时更新数据的能力,或者让用户可以通过Widget直接与应用进行交互。 通过以上步骤,您可以成功地创建一个简单的Android Widget,并对其基本工作原理有了初步的理解。随着实践的...
开发者可以通过这些API轻松实现Widget的自定义行为,例如定时更新、远程视图(RemoteViews)的更新策略、以及与应用深度集成的新方法。 总之,【eoeAndroid特刊】第四期的Android Widget Ver 2.0.0更新,不仅提升了...
Android App Widget是Android系统提供的一种轻量级组件,允许开发者在用户的主屏幕上创建小型应用程序,通常称为小部件或快捷方式。这些小部件可以提供实时信息,如天气预报、日历事件,或者执行简单的操作,如播放...
- 更新Widget通常有两种方式:一是通过`AppWidgetProvider`的`onUpdate()`方法,二是设置`AlarmManager`定时触发更新。 - `onReceive()`方法是接收广播事件的主要入口,根据接收到的意图(Intent)类型执行相应...
7. **Widget服务**:有时,Widget可能需要长时间运行的任务,如定时更新,此时可以使用Service来支持。 8. **AppWidgetManager**:Android系统提供的接口,用于管理所有已安装的Widget,包括添加、删除和获取Widget...
布局文件可能包含一个TextView或者ImageView来显示时间,而Java代码会负责定时更新时间并将其显示在Widget上。 创建一个Android时钟Widget,我们需要遵循以下步骤: 1. **定义Widget配置文件**:在`res/xml`目录下...
- **AlarmManager和PendingIntent**:定时更新Widget通常通过AlarmManager设置定时任务,结合PendingIntent触发AppWidgetProvider的onUpdate()方法。 5. **交互功能**: - **点击事件**:可以通过在XML中设置...
- 可以设置AlarmManager定时触发更新,或者通过PendingIntent响应用户操作来更新Widget。 8. **实例化和添加到主屏幕**: - 用户可以通过长按主屏幕,选择小部件,然后在列表中找到你的Widget来添加到主屏幕。 -...