安卓桌面小组件

今天开发中用到了桌面小组件,可以说安卓中的小组件用起来是非常的方便和实用的,比如显示日期时间,手电筒,日历,天气预报这些小组件。
下面就告诉大家如何创建你的小组件!

1.首先你要创建一个类似广播一样的东西,这个类可以帮你监视你的组件。这里面什么逻辑都没有写,只是重写了一些重要的生命周期方法

public class WightProvider extends AppWidgetProvider 
{
    //每当组件从屏幕上移除
    @Override
    public void onDeleted(Context context, int[] appWidgetIds) {
        // TODO Auto-generated method stub
        super.onDeleted(context, appWidgetIds);
    }

    //当最后一个该Widget删除是调用该方法,注意是最后一个
    @Override
    public void onDisabled(Context context) {
        super.onDisabled(context);
    }


    // 当该Widget第一次添加到桌面是调用该方法,可添加多次但只第一次调用
    @Override
    public void onEnabled(Context context) {
        super.onEnabled(context);
    }

    // 每接收一次广播消息就调用一次
    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        super.onReceive(context, intent);
    }

    //每次更新都调用一次该方法
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds) {
        // TODO Auto-generated method stub
        super.onUpdate(context, appWidgetManager, appWidgetIds);
    }
}

2.组件的监视器都有了,还没有组件?创建一个!
你还要在layout文件夹下创建一个wight.xml文件,用于显示组件里面的内容,这里我用的TextView简单的显示一下了


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView_show"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="我的桌面小组件" />

LinearLayout>

你还要配置这个小组件的一些属性信息,比如宽高,刷新时间等
这里我在res下创建了一个xml文件夹,在xml文件夹下创建了widget_config.xml,布局引用的是刚刚创建的widget.xml


<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:initialLayout="@layout/wight"
    android:minHeight="40dp"
    android:minWidth="100dp"
    android:updatePeriodMillis="40000" >
    
appwidget-provider>

3.创建完了广播和布局,接下来就需要显示了,显示的话就需要在清单文件中配置一下就完成了!

<receiver android:name="com.example.mydemo.WightProvider">
<intent-filter>
    <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
    intent-filter>
    <meta-data
        android:name="android.appwidget.provider"
        android:resource="@xml/wight_config" >
    meta-data>
receiver>

你以为这就完事了吗?没错!当然可以显示,但是开发中的桌面小组件不会只显示一个文字或者一张图片,如果需要有更多的逻辑参与,多了一些判断或者请求网络等等复杂步骤怎么办?那就需要Service来帮忙~
这里创建一个Service来控制小组件内容的显示逻辑

/**
 * 当组件被开启时候,就需要开启当前Service设置视图
 * @author AdministratorLi
 *
 */
public class TimerService extends Service 
{
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        updateViews();
    }

    /**
     * 设置显示视图
     */
    private void updateViews() {
        RemoteViews rv = new RemoteViews(getPackageName(),R.layout.wight);
        rv.setTextViewText(R.id.textView_show, "具体的逻辑交给当前Service就好!");

        AppWidgetManager manager = AppWidgetManager.getInstance(getApplicationContext());
        ComponentName cn = new ComponentName(getApplicationContext(),WightProvider.class);
        manager.updateAppWidget(cn, rv);
    }
}

创建完就配置一下清单文件,这是我的习惯!

<service android:name="com.example.mydemo.TimerService">service>

这里只是创建了Service,你创建了没开启显然是没用的。还需要在组件添加到桌面的时候开启,那就需要修改WightProvider这个类,当onEnabled(添加到桌面)时开启服务,当onDisabled(移除到桌面)时,停止服务!

//当最后一个该Widget删除是调用该方法,注意是最后一个
    @Override
    public void onDisabled(Context context) {
        context.stopService(new Intent(context,TimerService.class));
        super.onDisabled(context);
    }


    // 当该Widget第一次添加到桌面是调用该方法,可添加多次但只第一次调用
    @Override
    public void onEnabled(Context context) {
        context.startService(new Intent(context,TimerService.class));
        super.onEnabled(context);
    }

到这,你的桌面小组件就出来了!如果有什么疑问和建议,欢迎QQ骚扰:997797281!

你可能感兴趣的:(循序渐进)