安卓widget的详解

原创 2015年07月11日 10:27:36

第一步:先写一个类,继承于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;
	}
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

安卓桌面时钟widget代码

  • 2015-03-26 21:07
  • 2.05MB
  • 下载

安卓看笑话widget源码

  • 2012-02-13 15:40
  • 2.55MB
  • 下载

[安卓]手机管家(十八)一键 锁屏清理线程以及widget

有些broadcastReceiver不能在manifest里静态注册(不用运行起来就能收到) 锁屏是不能静态注册的,非常频繁的锁屏,动态注册,绑到service里最好,这样生命周期长 在se...
  • rjlgo
  • rjlgo
  • 2015-06-25 17:46
  • 654

安卓:App Widget应用程序小组件(一)

App Widgets IN THIS DOCUMENT The BasicsDeclaring an App Widget in the ManifestAdding the AppWi...

linux和安卓上(ppp widget)使用3g网卡的方法

在usb 3G上网卡中,有许多都是使用的称为zeroCD的一种模式。就是在初始时,将3G上网卡,识别为一个CD设备。然后自动安装驱动,安装完成后。自动卸载。将3G网卡转换成串口模式。 要想在li...

安卓定制软件桌面(launch)上预置特定程序的widget

最近做一个项目,需要做一个类似安卓launch的定制桌面,其中,需要在软件启动后把天气预报的widget预置到界面里,网上很多资料都是关于安卓平板的底层编译方法,就是直接修改安卓系统的底层设置,然后重...

安卓开发之 App Widget

一、什么是App Widget Android平台上在桌面上所放置的一种小控件 与App Widget相关的类/对象: AppWidgetProviderInfo对象:定义App Widget的一...
  • cxmscb
  • cxmscb
  • 2016-08-06 13:45
  • 2166

Android时钟的widget【安卓进化三十七】

前段时间解决一个widget的bug,具体分析是“appWidgetManager.updateAppWidget(THIS_APPWIDGET, views);”这个方法updateAppWidge...

Android中widget的应用【安卓源码解析三】

最近看widget,这个widget可以任意放到桌面上(前提是你的桌面上有足够大的空间),感觉效果很炫,widget就是一个BroadcastReceiver,它们使用XML metedata来描述w...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)