关闭

安卓widget的详解

134人阅读 评论(0) 收藏 举报
分类:

第一步:先写一个类,继承于AppwidgetProvider,这个类的父类还是BroadCastReceiver

   //AppWidgetProvider实际上是一个广播,
  //继承了它,所以要去清单文件上注册,至于怎么注册,监听哪个动作,直接去开发文档上复制
public class myWidgetBroadCastReceiver extends AppWidgetProvider {
	
		ActivityManager am;
		@Override
		public void onReceive(Context context, Intent intent) {
			// TODO Auto-generated method stub
//			Log.i("huang", "onReceive");
			super.onReceive(context, intent);
			
					}
		
		
		}
		
		
		//按照广播的更新周期时间值多少来调用
		@Override
		public void onUpdate(Context context, AppWidgetManager appWidgetManager,
			int[] appWidgetIds) {
		// TODO Auto-generated method stub
		super.onUpdate(context, appWidgetManager, appWidgetIds);
		
//		Log.i("huang", "onUpdate");
		
		context.startService(new Intent(context, WidgetServerce.class));
		
		}
		
		
		
		
		
		//第一次被揪到屏幕上的时候调用
		@Override
		public void onEnabled(Context context) {
		// TODO Auto-generated method stub
		super.onEnabled(context);
		Log.i("huang", "onEnabled");
		
		
		context.startService(new Intent(context, WidgetServerce.class));
		
		}
		
		
		
		
		//在屏幕上的最后一个widget被移除的时候调用
		@Override
		public void onDisabled(Context context) {
		// TODO Auto-generated method stub
		super.onDisabled(context);
		context.stopService(new Intent(context, WidgetServerce.class));
		Log.i("huang", "onDisabled");
		}
}


第二步:因为是广播,当然要到清单文件里去注册了,要怎么注册呢?不知道,那就去开   发文档的Dev Guide页面瞧一瞧,然后直接把=拷贝过来改一改

 <!--widget的广播  -->				
        <receiver android:name="com.example.mobilsafe.widget.myWidgetBroadCastReceiver" >
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
                
            </intent-filter>

            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/example_appwidget_info"  />
        </receiver>

第三步:在清单文件上注册的时候,

            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/example_appwidget_info"  />

这个节点里需要一个widget的配置信息,我们就去res目录下创建一个xml文件夹,

在xml文件夹里面创建一个保存配置的文件,配置要怎么写呢?不知道,同样的,          去开发文档里面拷贝

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
   
    android:initialLayout="@layout/activity_main_widget"
    android:minHeight="72dp"
    android:minWidth="294dp"
    android:updatePeriodMillis="86400000"
     >

</appwidget-provider>

第四步:在写widget配置的时候,有一个设置初始布的属性

android:initialLayout="@layout/activity_main_widget"

在这个属性里面写对应的布局文件即可,这样这个widget就创建完成了

需要注意的是:如果这个程序没widget空间的时候已经部署在手机上了,后来开发完

widget空间在部署到手机上有可能找不到这个widget,需要先将这个程序先卸载  

掉,再重新部署(当时在这里卡了半天,都找不到原因)



好了,现在开始上代码了

//第一次被揪到屏幕上的时候调用

  //AppWidgetProvider实际上是一个广播,
  //继承了它,所以要去清单文件上注册,至于怎么注册,监听哪个动作,直接去开发文档上复制
public class myWidgetBroadCastReceiver extends AppWidgetProvider {
	
		ActivityManager am;
		@Override
		public void onReceive(Context context, Intent intent) {
			// TODO Auto-generated method stub
//			Log.i("huang", "onReceive");
			super.onReceive(context, intent);
			
			am=(ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
			
			
			if(intent.getAction().equals("Intent.action.zouni")){
//				Log.i("huang", "一键清理");
				List<RunningAppProcessInfo> runningAppProcesses = am.getRunningAppProcesses();
				for (RunningAppProcessInfo runningAppProcessInfo : runningAppProcesses) {
					am.killBackgroundProcesses(runningAppProcessInfo.processName);
				}
			}
		}
		
		
		
		
		
		//按照广播的更新周期时间值多少来调用
		@Override
		public void onUpdate(Context context, AppWidgetManager appWidgetManager,
			int[] appWidgetIds) {
		// TODO Auto-generated method stub
		super.onUpdate(context, appWidgetManager, appWidgetIds);
		
//		Log.i("huang", "onUpdate");
		
		context.startService(new Intent(context, WidgetServerce.class));
		
		}
		
		
		
		
		
		//第一次被揪到屏幕上的时候调用
		@Override
		public void onEnabled(Context context) {
		// TODO Auto-generated method stub
		super.onEnabled(context);
		Log.i("huang", "onEnabled");
		
		//第一次出现在屏幕的时候启动服务
		context.startService(new Intent(context, WidgetServerce.class));
		
		}
		
		
		
		
		//在屏幕上的最后一个widget被移除的时候调用
		@Override
		public void onDisabled(Context context) {
		// TODO Auto-generated method stub
		super.onDisabled(context);
		context.stopService(new Intent(context, WidgetServerce.class));
		Log.i("huang", "onDisabled");
		}
}



启动的服务,在服务里面实时更新widget的内容

public class WidgetServerce extends Service {
    
	
	Timer timer;
	TimerTask task;
	
	AppWidgetManager awm;
	ActivityManager am;
	PackageManager pm;
	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
	}
	
	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		super.onCreate();
		pm=getPackageManager();
		am=(ActivityManager) getSystemService(ACTIVITY_SERVICE);
		awm=AppWidgetManager.getInstance(WidgetServerce.this);
		
		timer=new Timer();//创建一个计时器
		
		//计时器要执行的任务
		task=new TimerTask() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				//第二步:将要更新的widget的广播接受类绑定进去
				ComponentName provider=new ComponentName(WidgetServerce.this, myWidgetBroadCastReceiver.class);
				
				
				//第三步:得到远程view的布局文件,然后就可以开始对子view进行操作
				RemoteViews views=new RemoteViews(getPackageName(), R.layout.activity_main_widget);
				
				 //设置文本
				views.setTextViewText(R.id.tv_widget_ProcessCount, "正在运行的程序:"+getProcesscount()+"个");
				
				
				long memoryinfo[]=MemoryInfoManager.getMemoryinfo(WidgetServerce.this);
				views.setTextViewText(R.id.tv_widget_MemoryInfo,"可用内存:"+Formatter.formatFileSize(WidgetServerce.this, memoryinfo[0]));
				
				Intent it=new Intent();
				it.setAction("Intent.action.zouni");
				PendingIntent pi=PendingIntent.getBroadcast(WidgetServerce.this, 0, it, 0);
				
				//设置点击事件,并指定一个广播,当点击的时候,widget的广播接收类就会接收到这个广播,当然必须得先注册
				views.setOnClickPendingIntent(R.id.but_widget_KillAll, pi);
				
				//第一步:第一个参数是指要更新哪个widget,将其widget的广播接受类绑定进去,
				//第一个参数是要更新的widget的对象的view对象,是个远程的view
				awm.updateAppWidget(provider, views);
			}
		};
		timer.schedule(task, 0, 300);
	}
	
	@Override
	public void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		task.cancel();
		task=null;
		timer.cancel();
		timer=null;
	}
	
	
	/**
	 * 获取正在运行的线程数
	 * @return
	 */
	private int getProcesscount(){
		int ProcessCount=0;
		List<RunningAppProcessInfo> runningAppProcesses = am.getRunningAppProcesses();
		for (RunningAppProcessInfo runningAppProcessInfo : runningAppProcesses) {
			try {
				pm.getApplicationInfo(runningAppProcessInfo.processName, 0);
				ProcessCount++;
			} catch (NameNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return ProcessCount;
	}
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:19838次
    • 积分:653
    • 等级:
    • 排名:千里之外
    • 原创:46篇
    • 转载:12篇
    • 译文:0篇
    • 评论:1条