android桌面小组件(时钟)--widget初体验

本文介绍了如何在Android中创建一个时钟桌面小组件(Widget),包括创建新工程、定义布局、设置WidgetProvider、实现定时更新服务以及配置AndroidManifest.xml文件的关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

android桌面小组件(时钟)--widget初体验

App Widget是应用程序窗口小部件(Widget)是微型的应用程序视图,它可以被嵌入到其它应用程序中(比如桌面)并接收周期性的更新。你可以通过一个App Widget Provider来发布一个Widget。

(1).创建一个新的工程

(2).创建窗口部件的布局layout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:background="#ccc"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/id_time"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@android:color/white"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true" />

</RelativeLayout>


(3).编辑WidgetProvider对应的资源文件widgetconfig.xml(文件夹:res/xml/widgetconfig.xml)

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

</appwidget-provider>

    android:minWidth : 最小宽度
    android:minHeight : 最小高度
    android:updatePeriodMillis : 更新widget的时间间隔(ms),"86400000"为1个小时
    android:previewImage : 预览图片
    android:initialLayout : 加载到桌面时对应的布局文件
    android:resizeMode : widget可以被拉伸的方向。horizontal表示可以水平拉伸,vertical表示可以竖直拉伸
    android:widgetCategory : widget可以被显示的位置。home_screen表示可以将widget添加到桌面,keyguard表示widget可以被添加到锁屏界面。
    android:initialKeyguardLayout : 加载到锁屏界面时对应的布局文件


(4).创建WidgetProvider类继承AppWidgetProvider

package com.czz.widgetdemo;

import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;

/**
 * Created by czz on 2016/3/30.
 */
public class WidgetProvider extends AppWidgetProvider {

    private Intent mTimerIntent = null;

    // 当 widget 更新时被执行。
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        super.onUpdate(context, appWidgetManager, appWidgetIds);
    }

    // 当 widget 被删除时被触发。
    @Override
    public void onDeleted(Context context, int[] appWidgetIds) {
        super.onDeleted(context, appWidgetIds);
    }

    // 当第1个 widget 的实例被创建时触发。
    @Override
    public void onEnabled(Context context) {
        super.onEnabled(context);
        if (null == mTimerIntent){
            mTimerIntent = new Intent(context,TimerService.class);
            context.startService(mTimerIntent);
        }
    }

    //  当最后1个 widget 的实例被删除时触发。
    @Override
    public void onDisabled(Context context) {
        super.onDisabled(context);
        if (null != mTimerIntent){
            context.stopService(mTimerIntent);
            mTimerIntent = null;
        }
    }

    //  接收到任意广播时触发,并且会在上述的方法之前被调用。
    @Override
    public void onReceive(Context context, Intent intent) {
        super.onReceive(context, intent);
    }
}


(5).创建TimerService服务

public class TimerService extends Service {

    private Timer mTimer;
    private SimpleDateFormat mFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

    public TimerService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        throw new UnsupportedOperationException("Not yet implemented");
    }

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

        mTimer = new Timer();
        mTimer.schedule(new TimerTask() {
            @Override
            public void run() {
                upTimeView();
            }
        },0,1000);

    }

    private void upTimeView(){
        String time = mFormat.format(new Date());
        RemoteViews rvs = new RemoteViews(getPackageName(),R.layout.layout);
        rvs.setTextViewText(R.id.id_time,time);

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

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


(6).配置AndroidManifest.xml清单文件

1.android.appwidget.action.APPWIDGET_UPDATE,必须要显示声明的action!因为所有的widget的广播都是通过它来发送的;要接收widget的添加、删除等广播,就必须包含它。

2.android:name -- 指定metadata名,通过android.appwidget.provider来辨别data。
    android:resource -- 指定 AppWidgetProviderInfo 对应的资源路径。即,@xml/widgetconfig。

 <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver android:name=".WidgetProvider">

            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>
            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/widgetconfig" />

        </receiver>

        <service android:name=".TimerService"></service>
    </application>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值