学习android开发也是需要很长时间的,这天的开发中又遇到一些挠破头皮的问题。
1.想在桌面做个动画,使用了Intent,PendingIntent, RemoteViews, AppWidgetManager和AppWidgetProvider中的刷新和接收广播事件,但是这样做只能有控件时并加上事件触发才能产生效果,没有达到我的要求,结果放弃了这种方法。代码如下:public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {Intent intent = new Intent();intent.setAction(UPDATE_ACTION);PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0,intent, 0);//这个pendingIntent把Intent包装起来,作为广播发送到接收函数中RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.fly_widget);remoteViews.setOnClickPendingIntent(R.id.imageFlyId, pendingIntent);//就是这,只能使用控件操作Widget,才有效果appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);super.onUpdate(context, appWidgetManager, appWidgetIds);}public void onReceive(Context context, Intent intent) {if (UPDATE_ACTION.equals(action)) {System.out.println("AAAAAAAAAAAAAA");context.startService(new Intent(context, UpdateService.class));RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.fly_widget);remoteViews.setImageViewResource(R.id.imageFlyId,R.drawable.fly02001);AppWidgetManager appWidgetManage = AppWidgetManager.getInstance(context);ComponentName componentName = new ComponentName(context,FlyWidgetProvider.class);//这个对象据个人理解,可理解为做出来的那个widget部件appWidgetManage.updateAppWidget(componentName, remoteViews);super.onReceive(context, intent);
2.以上那种方法不适合,就在此代码上加上service和Thread,结果导致Thread一行不止,停不下来,直接内存崩溃,代码贴上,以防忘记自己犯过的错误。
//继承service的子类中的代码public void onStart(Intent intent, int startId) {Runnable runnable = new Runnable() {public void run() {try {RemoteViews updateViews = new RemoteViews(getPackageName(),R.layout.fly_widget);ComponentName thisWidget = new ComponentName(UpdateService.this,FlyWidgetProvider.class);AppWidgetManager manager = AppWidgetManager.getInstance(UpdateService.this);//这个对象是Widget管理器对象buildUpdate(updateViews);manager.updateAppWidget(thisWidget, updateViews);//需要刷新} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}}};
3.以上都是不可行的办法,资料都翻烂了,网页也卡了,最后还是被我找到了可行了办法,就是再加上个Handler来操作那个Runnable,让它随着你的思路进行运行和停止,代码如下:
Handler handler = new Handler();Runnable runnable = new Runnable() {public void run() {System.out.println("run");try {//System.out.println("!Start"); RemoteViews updateViews = new RemoteViews(getPackageName(),R.layout.fly_widget);ComponentName thisWidget = new ComponentName(UpdateService.this,FlyWidgetProvider.class);AppWidgetManager manager = AppWidgetManager.getInstance(UpdateService.this);buildUpdate(updateViews);manager.updateAppWidget(thisWidget, updateViews);handler.postDelayed(runnable, 330);} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}}};public void onStart(Intent intent, int startId) {handler.post(runnable);System.out.println("start");super.onStart(intent, startId);}@Overridepublic void onDestroy() {// TODO Auto-generated method stub// animThread.setFlag(false);System.out.println("RRRRRRRRRRR");handler.removeCallbacks(runnable);//尤其是这里,一定要附上,要不然,程序就崩了,这句是删除Runnable对象的意思,也就是截断了这根线程,让它无法走动。super.onDestroy();}
虽是错误百出,但收获不少,最起码对这些API不会那么陌生。