安卓之appwidget学习总结

appwidget就是我们常用的桌面控件,最常见的就是桌面上的时钟控件。

appwidget实质上是一个带界面的广播。我是这么认为的。。

首先先构造一个appwidget:

public class FirstWidget extends AppWidgetProvider {
	@Override
	public void onDeleted(Context context, int[] appWidgetIds) {
		// TODO Auto-generated method stub
		super.onDeleted(context, 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);
		// context.startService(new Intent(context, FSerVice.class));
	}

	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub	
		super.onReceive(context, intent);	 
		AppWidgetManager appWidgetManger = AppWidgetManager
				.getInstance(context);
		int[] appIds = appWidgetManger.getAppWidgetIds(new ComponentName(
				context, FirstWidget.class));
		RemoteViews views = new RemoteViews(context.getPackageName(),
				R.layout.widget);

			views.setImageViewResource(R.id.imageView,R.drawable.ic_launcheron);
		}
		appWidgetManger.updateAppWidget(appIds, views);
	}
	@Override
	public void onUpdate(Context context, AppWidgetManager appWidgetManager,
			int[] appWidgetIds) {
		// TODO Auto-generated method stub
		Bitmap bmp;
		if (mContext == null) {
			mContext = context;
		}
		super.onUpdate(context, appWidgetManager, appWidgetIds);
		RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.widget);
		Intent intentClick = new Intent(SET_WIFI_ACTION);
		PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0,
				intentClick, 0);
		views.setOnClickPendingIntent(R.id.imageView, pendingIntent)
		appWidgetManager.updateAppWidget(appWidgetIds, views);

		/** 为AppWidget设置点击事件的响应 */

	}
}


PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0,intentClick, 0);

这里有三个选择有getBroadcast,getActivity还有getService.

但是我在实际使用中发现了这个问题:即以broadcast形式发送点击事件会在一些清理软件杀进程之后失效,点击就没效果了。

但是通过按钮启动一个activity的话就不会产生这个问题,如果是一些比较短时间的操作,我想用这个,然后把theme设置为透明主题的话和后台效果就一样了,而且一会有失效的结果 ,更何况现在手机root的比例较大,而且清理已经成了用户的习惯。

桌面控件的描述文件放在res文件夹里的xml文件夹:

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider
  xmlns:android="http://schemas.android.com/apk/res/android"
   android:initialLayout="@layout/widget"
    android:minWidth="72dp"
    android:minHeight="72dp" 
    android:updatePeriodMillis="0"
    android:configure="com.example.widgetflashlight.FileActivity"
>
</appwidget-provider>

包括大小,关于大小应为(你想要的格子x74)-2,一个格子是74x74的.

updatePeriodMillis是更新的周期,sdk在1.5以后就不支持这个了,可能是为了省电吧,要自己写一个service来更新,我想这可能也是为什么被杀了进程之后,serivce应该就没了,所以桌面上的小控件就不会继续更新了。

关于这个configure,如果你的桌面控件生效之前需要启动一个activity来初始化的话就需要配置一个configure。

widget的布局文件依旧放在layout文件夹里:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout  xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <ImageButton
        android:id="@+id/imageView"
        android:layout_width="72dp"
        android:layout_height="36dp"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:src="@drawable/ic_launcheron"
        />
</RelativeLayout>

这是我写的一个桌面上的开关控件。

前面说到appwidget类似于一个广播 ,所以也要注册在xml里的:

  <receiver android:name="FirstWidget" >
            <intent-filter >
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" >
                </action>
                <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
                <action android:name="com.example.widgetflashlight.action.widget.click" >
                </action>
            </intent-filter>
            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/widget" />
        </receiver>
过滤器里面的几个action是这个桌面控件需要“听”见的,这里有它的点击事件,wifi开关状态的改变,还有它自己的更新广播 。

这样下来一整个桌面控件就做完了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值