android Widget 桌面小图标,类似快捷方式

步骤一:清单文件配置
  receiver必须是AppWidgetProvider的子类
  通过intent-filter过滤指定的android.appwidget.action.APPWIDGET_UPDATE动作
  除此之外,还需配置meta-data属性,其中name为指定字段,
   resource为欲添加小图标时显示的样式

<receiver android:name=".Receiver.ProcessReceiver">
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE"></action>
            </intent-filter>
            <meta-data android:name="android.appwidget.provider"
                android:resource="@xml/process_widget"></meta-data>
        </receiver>
		<receiver android:name=".Receiver.KillProcessReceiver">
            <intent-filter>
                <action android:name="cn.gzu.edu.action.killprocess"></action>
            </intent-filter>
        </receiver>


//resource配置模板
 /**
 *minWidth  桌面显示的最小宽度
 *minHeight  桌面显示的最小高度,以上两个参数决定改桌面图标的风格
 *initialLayout  图标显示时加载的布局文件,可以是指定宽高的任意布局文件,但建议尽量简单

process_widget.xml为自定义的布局
 */

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="290dp"
    android:minHeight="72dp"
    android:initialLayout="@layout/process_widget" >
</appwidget-provider>


步骤二:建立ProcessReceiver,即AppWidgetProvider的子类,用于处理相应的业务
  示例为一个清理进程服务的启动为停止

public class ProcessReceiver extends AppWidgetProvider {

	@Override
	public void onEnabled(Context context) {
		super.onEnabled(context);
		Intent intentStart=new Intent(context,ProcessWidgetService.class);
		context.startService(intentStart);
	}
	
	@Override
	public void onDeleted(Context context, int[] appWidgetIds) {
		super.onDeleted(context, appWidgetIds);
	}
	
	@Override
	public void onUpdate(Context context, AppWidgetManager appWidgetManager,
			int[] appWidgetIds) {
		super.onUpdate(context, appWidgetManager, appWidgetIds);
	}
	
	@Override
	public void onDisabled(Context context) {
		super.onDisabled(context);
		Intent intentStop=new Intent(context,ProcessWidgetService.class);
		context.stopService(intentStop);
	}

}


步骤三:桌面图标的业务处理
  1,得到AppWidgetManager实例,如同activityManager与PackageManager一样
  2,建立组件,即将服务与图标建立连接
  3,建立RemoteViews对象,即可操作图标上的子组件
   与普通activity不同的是,这里不能findView,而只能通过setTextViewText
   之类操作子组件。
  4,通过PendingIntent发出广播,设置相应的action
   setOnClickPendingIntent为子组件的点击事件注册点击处理逻辑
   最后交给广播接收者处理业务逻辑

public class ProcessWidgetService extends Service {
	private Timer timer;
	
	private TimerTask task=new TimerTask(){

		@Override
		public void run() {
			AppWidgetManager awManager=AppWidgetManager.getInstance(getApplicationContext());
			ComponentName provider=new ComponentName(getApplicationContext(), ProcessReceiver.class);
			RemoteViews remoteViews=new RemoteViews(getPackageName(), R.layout.process_widget);
			int processSize=TaskProcessUtil.getRunningAppSize(getApplicationContext());
			remoteViews.setTextViewText(R.id.process_count, "运行总进程数:"+processSize+"个");
			long memory=TaskProcessUtil.getSystemAviMemory(getApplicationContext());
			remoteViews.setTextViewText(R.id.process_memory, "剩余内存:"+TextFormat.formatByte(memory));

			Intent intent=new Intent(getApplicationContext(),KillProcessReceiver.class);
			intent.setAction("cn.gzu.edu.action.killprocess");
			PendingIntent pendingIntent=PendingIntent.getBroadcast(getApplicationContext(), 100, intent, 0);

			remoteViews.setOnClickPendingIntent(R.id.process_widget_btn_clear, pendingIntent);
			awManager.updateAppWidget(provider, remoteViews);
		}};
	
	@Override
	public void onCreate() {
		super.onCreate();
		//不断的对widget里面的数据进行更新   用定时器来实现
		timer=new Timer();
		timer.schedule(task,0 ,1000);
	}

	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
		task.cancel();
		task=null;
	}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值