android widget 桌面插件的简单事例讲解

来源:互联网 发布:南京民宿市场数据 编辑:程序博客网 时间:2024/05/16 08:53

  想要做个可以在桌面上显示的插件需要3个步骤:

  1. 继承AppWidgetProvider

  2. 编写widget的界面xml, 编写mywidget属性xml

  3. AndroidManifest.xml  注册插件

 

先上图

这个案例是一个会自增的数字, 非常的简单。

 

1. 继承AppWidgetProvider

public class MyWidgetProvider extends AppWidgetProvider{private static Timer myTimer;private static int index = 0;private final String broadCastString = "knowheart.wd.appWidgetUpdate"; @Overridepublic void onDeleted(Context context, int[] appWidgetIds){// TODO Auto-generated method stubsuper.onDeleted(context, appWidgetIds);}@Overridepublic void onEnabled(Context context){// TODO Auto-generated method stubsuper.onEnabled(context);}@Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds){// TODO Auto-generated method stubsuper.onUpdate(context, appWidgetManager, appWidgetIds);}@Overridepublic void onReceive(Context context, Intent intent){super.onReceive(context, intent);}}

首先我们添加一个类, 用于继承AppWidgetProvider, 它就是用来控制我们的插件更新删除的一些操作

这里会用到onEnabled、onUpdate、onReceive三个方法

 

  2. 编写widget的界面xml, 编写mywidget属性xml

layout/widget_layout.xml

<?xml version="1.0" encoding="utf-8"?>  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:background="#000000"android:layout_gravity="center_horizontal"android:layout_width="300dp"android:layout_height="wrap_content"><TextViewandroid:id="@+id/update"android:text="0" android:layout_width="fill_parent"android:layout_height="wrap_content" android:gravity="center" /></LinearLayout>


新建一个文件夹命名xml, 再添加一个xml文件

xml/mywidget.xml

<?xml version="1.0" encoding="UTF-8"?><appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"      android:minWidth="300dip" android:minHeight="72dp"      android:updatePeriodMillis="86400000"     android:initialLayout="@layout/widget_layout"      >  </appwidget-provider>  


这里设置插件的长宽、刷新时间, 0为手动刷新、以及插件的界面xml

 

  3. AndroidManifest.xml  注册插件

 <!-- 注册该插件 -->        <receiver android:name="MyWidgetProvider" >            <intent-filter >                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />                <action android:name="com.wd.appWidgetUpdate" >                </action>            </intent-filter>            <meta-data                android:name="android.appwidget.provider"                android:resource="@xml/mywidget" />        </receiver>



<action android:name="com.wd.appWidgetUpdate" >  这一段是向系统注册一个广播, 我们会在逻辑处理时将该广播发送给AppWidgetProvider的更新方法, 以实现手动刷新。

 

那么完成上面三部基本上就可以显示一个插件在桌面上了。

 

如果我们想让插件显示的数字每秒加一的话, 我们需要做后台处理

public class MyWidgetProvider extends AppWidgetProvider{private static Timer myTimer;private static int index = 0;//定义我们要发送的事件private final String broadCastString = "com.wd.appWidgetUpdate"; @Overridepublic void onDeleted(Context context, int[] appWidgetIds){// TODO Auto-generated method stubsuper.onDeleted(context, appWidgetIds);System.out.println("onDeleted");}@Overridepublic void onEnabled(Context context){System.out.println("onEnabled");// TODO Auto-generated method stubsuper.onEnabled(context);//在插件被创建的时候这里会被调用, 所以我们在这里开启一个timer 每秒执行一次MyTask mMyTask = new MyTask(context);myTimer = new Timer();myTimer.schedule(mMyTask, 1000, 1000);System.out.println("onEnabled2");}@Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds){System.out.println("onUpdate");// TODO Auto-generated method stubsuper.onUpdate(context, appWidgetManager, appWidgetIds);}@Overridepublic void onReceive(Context context, Intent intent){//当判断到是该事件发过来时, 我们就获取插件的界面, 然后将index自加后传入到textview中System.out.println("onReceive");if(intent.getAction().equals(broadCastString)){index++;RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.widget_layout);rv.setTextViewText(R.id.update, Integer.toString(index));//将该界面显示到插件中AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);ComponentName componentName = new ComponentName(context,MyWidgetProvider.class);appWidgetManager.updateAppWidget(componentName, rv);}// TODO Auto-generated method stubsuper.onReceive(context, intent);}class MyTask extends TimerTask{private Context mcontext = null;private Intent intent = null;public MyTask(Context context) {//新建一个要发送的Intentmcontext = context;intent = new Intent();intent.setAction(broadCastString);}@Overridepublic void run(){System.out.println("2");//发送广播(由onReceive来接收)mcontext.sendBroadcast(intent);}}}


 

最后, 附上工程源码:

http://download.csdn.net/detail/knowheart/5003328

原创粉丝点击