在开发Android的widget时,第一个需要解决的问题就是怎么实现让widget定时更新,在查阅比较多的资料后,一般情况用Service在后台更新,废话不多说,贴代码如下:
Widget:
- publicclassNewsWidgetProviderextendsAppWidgetProvider{
-
@Override
-
publicvoidonDeleted(Contextcontext,int[]appWidgetIds){
- }
-
@Override
-
publicvoidonDisabled(Contextcontext){
-
-
super.onDisabled(context);
- }
-
@Override
-
publicvoidonEnabled(Contextcontext){
-
-
super.onEnabled(context);
- }
-
@Override
-
publicvoidonUpdate(Contextcontext,AppWidgetManagerappWidgetManager,int[]appWidgetIds){
- NewsService.updateAppWidgetIds(appWidgetIds);
-
context.startService(newIntent(context,NewsService.class));
- }
-
-
publicstaticRemoteViewsupdateAppWidget(Contextcontext,List<RssNews>list){
-
RemoteViewsviews=newRemoteViews(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);
- }
-
IntentdetailIntent=newIntent(context,NewsSiteList.class);
-
-
PendingIntentpending=PendingIntent.getActivity(context,0,detailIntent,0);
- views.setOnClickPendingIntent(R.id.textView01,pending);
- views.setOnClickPendingIntent(R.id.textView02,pending);
- views.setOnClickPendingIntent(R.id.textView03,pending);
-
returnviews;
- }
-
-
@Override
-
publicvoidonReceive(Contextcontext,Intentintent){
-
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:
- publicclassNewsServiceextendsServiceimplementsRunnable{
-
-
privatestaticfinalStringTAG="NewsService";
-
privatestaticQueue<Integer>sAppWidgetIds=newLinkedList<Integer>();
-
-
publicstaticfinalStringACTION_UPDATE_ALL="com.xxxx.news.UPDATE_ALL";
-
-
privatestaticbooleansThreadRunning=false;
-
-
privatestaticObjectsLock=newObject();
-
-
-
@Override
-
publicIBinderonBind(Intentintent){
-
returnnull;
- }
-
-
publicstaticvoidupdateAppWidgetIds(int[]appWidgetIds){
-
synchronized(sLock){
-
for(intappWidgetId:appWidgetIds){
- sAppWidgetIds.add(appWidgetId);
- }
- }
- }
-
-
publicstaticintgetNextWidgetId(){
-
synchronized(sLock){
-
if(sAppWidgetIds.peek()==null){
-
returnAppWidgetManager.INVALID_APPWIDGET_ID;
-
}else{
-
returnsAppWidgetIds.poll();
-
- }
- }
- }
-
-
privatestaticbooleanhasMoreUpdates(){
-
synchronized(sLock){
-
booleanhasMore=!sAppWidgetIds.isEmpty();
-
if(!hasMore){
-
sThreadRunning=false;
- }
-
returnhasMore;
- }
- }
-
@Override
-
publicvoidonCreate(){
-
super.onCreate();
- }
-
@Override
-
publicvoidonStart(Intentintent,intstartId){
-
super.onStart(intent,startId);
-
if(null!=intent){
-
if(ACTION_UPDATE_ALL.equals(intent.getAction())){
-
AppWidgetManagerwidget=AppWidgetManager.getInstance(this);
-
updateAppWidgetIds(widget.getAppWidgetIds(newComponentName(this,NewsWidgetProvider.class)));
- }
- }
-
synchronized(sLock){
-
if(!sThreadRunning){
-
sThreadRunning=true;
-
newThread(this).start();
- }
- }
- }
-
@Override
-
publicvoidrun(){
-
SharedPreferencessetting=getSharedPreferences("com.xxxx.news_preferences",0);
-
StringupdateTime=setting.getString("list_time","1800000");
-
StringupdateUrl=setting.getString("list_site","xxxxxxxxx");
-
-
-
AppWidgetManagerappWidgetManager=AppWidgetManager.getInstance(this);
-
RemoteViewsupdateViews=null;
-
-
while(hasMoreUpdates()){
-
intappWidgetId=getNextWidgetId();
- List<RssNews>listNews=NewsContenttList.getNewsList(updateUrl);
-
if(listNews!=null){
-
updateViews=NewsWidgetProvider.updateAppWidget(this,listNews);
- }
-
if(updateViews!=null){
- appWidgetManager.updateAppWidget(appWidgetId,updateViews);
- }
- }
-
-
IntentupdateIntent=newIntent(ACTION_UPDATE_ALL);
-
updateIntent.setClass(this,NewsService.class);
-
PendingIntentpending=PendingIntent.getService(this,0,updateIntent,0);
-
-
Timetime=newTime();
-
longnowMillis=System.currentTimeMillis();
- time.set(nowMillis+Long.parseLong(updateTime));
-
longupdateTimes=time.toMillis(true);
-
Log.d(TAG,"requestnextupdateat"+updateTimes);
-
- AlarmManageralarm=(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()方法**: 当接收到广播时...
4. **AlarmManager**: 为了实现定时更新,开发者通常会使用AlarmManager来设置周期性的触发器,使Widget在指定的时间间隔内更新自身。 5. **权限(PERMISSIONS)**: 开发时钟Widget可能需要请求`INTERNET`权限,以便...
3. **服务(Service)**:如果AppWidget需要后台处理或定时更新,可以使用服务来处理这些任务。例如,通过AlarmManager定期更新AppWidget的状态。 4. **Intent**:用于在AppWidget与应用的其他部分之间传递信息。 ...
Android App Widget是Android系统提供的一种轻量级组件,允许开发者在用户的主屏幕上创建小型应用程序,通常称为小部件或快捷方式。这些小部件可以提供实时信息,如天气预报、日历事件,或者执行简单的操作,如播放...
综上所述,创建一个每秒刷新时间的AppWidget涉及到对`AppWidgetProvider`的理解、使用`Handler`进行定时任务、布局设计以及元数据配置等多个方面。通过精心设计和实现,你可以为用户提供一个实用且实时的桌面时钟小...
- **动态更新**:除了在安装时初始化Widget,还可以通过AlarmManager或JobScheduler定时更新Widget,或者根据需要(例如,接收到新的数据)触发更新。 - **自定义行为**:AppWidgetProvider的其他回调方法,如`...
6. **实现更新逻辑**:在`onUpdate()`方法中,使用`RemoteViews`对象来操作Widget的视图,并通过`AppWidgetManager`更新Widget的内容。`RemoteViews`可以用来设置布局中的文本,例如设置TextClock的文本为当前时间。...
通过这个项目,开发者不仅可以掌握基本的Widget开发技术,还能了解到如何在Android系统中与用户界面交互、如何使用BroadcastReceiver以及如何利用系统服务进行定时更新。此外,实践中遇到的问题和解决过程,也是提升...
本资料包"androidWidget小组件开发.zip"包含了一个名为"MyWidget"的示例项目,可能包含了关于如何创建和实现Android Widget小组件的代码和资源。 1. **Widget组件概述** - Android Widget是Android系统中的一个...
总的来说,“Android时钟Widget Demo”是一个综合性的Android开发示例,涵盖了Widget的基本使用、定时更新、动画效果和用户交互等多个方面。开发者可以通过这个例子学习如何创建具有动态特性和交互功能的桌面组件,...
AppWidget,即桌面小部件,是Android系统提供的一种允许应用程序在主屏幕放置动态更新的组件,用户无需打开完整应用即可查看信息或进行简单交互。本文将全面解析AppWidget的工作原理、生命周期、启动运行过程以及...
深入理解Android Widget的源码对于开发者来说至关重要,因为这可以帮助他们优化用户体验,实现更丰富的桌面小部件功能。让我们一起探索Android Widget背后的源码结构和关键组件。 1. **AppWidgetProvider**: 这是...
总之,“Android桌面小部件widget日签Or日历可作为桌面日历”是一个融合了多种技术的项目,它涵盖了Android开发中的多个核心概念,包括Widget开发、日期处理、定时任务、UI设计和数据获取等。通过这样的项目实践,...
3. **服务或BroadcastReceiver**:这通常用于更新AppWidget的显示内容,比如定时获取数据或响应用户操作。 4. **AndroidManifest.xml配置**:在这里,你需要声明AppWidgetProvider,并指定其对应的布局和配置文件。...
2. 自动更新:AppWidget通常会设置定时更新,这可以通过在`AppWidgetProvider`中设置AlarmManager来实现。每当到设定的时间,系统就会触发更新事件,调用`onUpdate()`方法。 3. 更新UI:在`onUpdate()`方法中,使用...
6. **更新机制**: AppWidget的更新通常通过AppWidgetManager调用AppWidgetProvider的`onUpdate()`方法实现。开发者可以通过AlarmManager或JobScheduler设置定期更新,或者在接收到特定Intent时立即更新。 7. **小...
以上就是Android实现Widget时钟的基本流程和关键知识点,通过这个过程,开发者可以学习到Android组件的使用、Widget的配置与更新机制,以及如何通过服务实现后台定时任务。记得在实际项目中遵循Android最佳实践,...
- **扩展Widget的功能**:例如,增加定时更新数据的能力,或者让用户可以通过Widget直接与应用进行交互。 通过以上步骤,您可以成功地创建一个简单的Android Widget,并对其基本工作原理有了初步的理解。随着实践的...