widget的进一步使用,利用AppWidgetProvider实现桌面的时钟挂件

1、通过上面介绍widget的基本应用外面知道,系统最多30分钟才更新挂件的内容,为了实时更新时钟我们必须自己发送广播来实现挂件内容的更新,其方法就是覆写父类AppWidgetProvider的onReceive()方法,并在注册的广播接收的intent-fliter里添加接受自己的广播。

2、用过查看Mainfest文件知道广播接受原始只注册了android.appwidget.action.APPWIDGET_UPDATE,但是可以接收android.appwidget.action.APPWIDGET_ENABLED,android.appwidget.action.APPWIDGET_DISENABLED,猜想AppWidgetProvider里的接受者在系统里已经注册了接收这些广播,而我写的类继承它,因此也可以接收。

3、当我去掉注册的android.appwidget.action.APPWIDGET_UPDATE只保留我自己添加的更新时间的广播时候却收不到android.appwidget.action.APPWIDGET_UPDATE等一些广播了并且在widget里找不到我定义的挂件了。猜想在系统定义了相应的规则,必须注册了的广播中含有android.appwidget.action.APPWIDGET_UPDATE,且注册的类必须继承了AppWidgetProvider才会在系统里注册一个挂件,并且继承的类可以收到AppWidgetProvider接受的广播。

下面给出实现的demo:

widget类:

package com.example.user.appwidget;

import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.RemoteViews;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Comparator;

/**
 * Implementation of App Widget functionality.
 */
public class NewAppWidget extends AppWidgetProvider {

    private final  static  String Action_UpDateTime ="android.appwidget.action.APPWIDGET_UPDATE";
    private final  static  String Action_Enable ="android.appwidget.action.APPWIDGET_ENABLED";
    private  static  ArrayList<Integer> widgetIds = new ArrayList<>();

    private static boolean  HasUpdateThread = false;
    Thread upWidget= null;

    @Override
    public void onReceive(Context context, Intent intent) {

        int size = widgetIds.size();
        int [] widgetIdArray =  new int [size];
        for(int i = 0 ; i < size ; i++)
        {
            widgetIdArray[i] = widgetIds.get(i);
        }

        onUpdate(context , AppWidgetManager.getInstance(context) , widgetIdArray );

        System.out.println("收到了广播" + intent.getAction());

        super.onReceive(context, intent);
    }

    static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
                                int appWidgetId) {
        Calendar c = Calendar.getInstance();
        int hour = c.get(Calendar.HOUR_OF_DAY);
        int minute = c.get(Calendar.MINUTE);
        int seconds = c.get(Calendar.SECOND);
        CharSequence widgetText = "Time:" + hour + ":" + minute + ":" + seconds;//context.getString(R.string.appwidget_text);
        // Construct the RemoteViews object
        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.new_app_widget);
        views.setTextViewText(R.id.appwidget_text, widgetText);

        // Instruct the widget manager to update the widget
        appWidgetManager.updateAppWidget(appWidgetId, views);
    }

    // 到达指定更新时间(new_app_widget_info.xml中指定的,大于30分钟才有效,小于30分钟会30分钟执行一次)
    // 或者向桌面添加Widget时候执行
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        // There may be multiple widgets active, so update all of them
        for (int appWidgetId : appWidgetIds)
        {
            updateAppWidget(context, appWidgetManager, appWidgetId);
            if(!widgetIds.contains((Integer)appWidgetId))
            {
                System.out.println("不含有挂件"+appWidgetId);
                widgetIds.add((Integer) appWidgetId);
            }
            else
                System.out.println("含有挂件"+appWidgetId);
        }
        if (!HasUpdateThread)
        {
            System.out.println("创建了一个进程");HasUpdateThread =true;
            upWidget = new UpDateWiget(context);
            upWidget.start();

        }
    }

    //当第一个widget创建时候执行
    @Override
    public void onEnabled(Context context) {
        // Enter relevant functionality for when the first widget is created
//        System.out.println("1111111111111111111111111111111111111111111111");

    }

    //当最后一个widget实例被删除时执行
    @Override
    public void onDisabled(Context context) {
        // Enter relevant functionality for when the last widget is disabled
    }

    class UpDateWiget extends Thread {
//        public int widgetId;
        public Context context;

        public UpDateWiget(Context context) {
//            this.widgetId = widgetId;
            this.context = context;
        }

        @Override
        public void run() {
            while (true) {
                Intent intent = new Intent("android.appwidget.action.APPWIDGET_UPDATETIME");
//                intent.putExtra("wigetId", widgetId);
                try {
                    sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("发送了一条广播");
                context.sendBroadcast(intent);
            }
        }
    }

}

  挂件的布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#09C"
    android:padding="@dimen/widget_margin">

    <TextView
        android:id="@+id/appwidget_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:layout_margin="8dp"
        android:background="#09C"
        android:contentDescription="@string/appwidget_text"
        android:text="ca"
        android:textColor="#ffffff"
        android:textSize="20dp"
        android:textStyle="bold|italic" />

</RelativeLayout>

  mainfset里注册的广播:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.user.appwidget">

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

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

        <receiver android:name=".NewAppWidget">
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            <action android:name="android.appwidget.action.APPWIDGET_UPDATETIME"/>
            </intent-filter>

            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/new_app_widget_info" />
        </receiver>

    </application>

</manifest>

  

时间: 2025-01-18 09:06:16

widget的进一步使用,利用AppWidgetProvider实现桌面的时钟挂件的相关文章

利用mstsc远程桌面传送文件,记录一下

尼玛之前服务器上传有点异常,在服务器装了一个上传下载监控的软件,用的是什么 绿色版QQ流量监控,绿色是挺绿色的,装了就等哭吧.没时间打字反正就是删除不了,后来想办法删除了.艹.所有服务除了系统服务能上网以外,其他任何服务都无法上网,包括 radmin!!!悲剧了.我服务器又没装 server-u,更别说拿浏览器去下载文件了.因为我删除了QQ流量监控以后,所有的lps都出问题,因为监控其实就是基于劫持所有的网络吧.不清楚原理但是明白大概. 尼玛要修复lps,最后找到360的lps修复工具.唉,总算

云计算:利用叶子云桌面虚拟化管理平台搭建企业的桌面云,叶子云安装(二)

云计算:利用叶子云桌面虚拟化管理平台搭建企业的桌面云,叶子云安装(二) --企业轻松搭建kvm桌面云系列教程 一,安装准备 1.先下载叶子云的安装光盘文件,光盘文件是iso格式的. 2.如果你用虚拟机安装,则不用刻录光盘,如果你是用物理机安装,则应该刻录成光盘. 3.光盘文件可到下方的qq群下载. 二,安装演示 安装演示分为2种情况,1种是在虚拟机内进行安装演示,另一种是在物理服务器上进行演示. A.虚拟机安装叶子云虚拟化 1.创建一个虚拟机(会的建议跳过) 我们这里以 VMware演示如何安装

利用Deskpool 搭建 桌面云教室

1    产品概述 Deskpool是一个精简高效的桌面云教学平台,通过统一的管理平台全面管理位于数据中心的物理和虚拟资源,用户仅需要使用低成本的ARM架构云终端或者显示器一体机就可以连接到数据中心中的Windows桌面,并获得类似本地PC的使用体验.如图11所示: 图11 桌面云平台的工作原理   云平台为用户部署桌面云提供了所需的全部功能,它致力于帮助用户利用有限成本,最大化IT资源的效率和利用率,最大限度帮助用户构建最具灵活性的基础架构平台,帮助管理员有效管理复杂的用户环境.云教学平台的主

Windows server 2016利用Hyper-V实现桌面虚拟化

Hyper-V虚拟化技术在Windows server 2012时就已完成RTM版发布,它的VDI可以基于虚拟机进行发布.微软其实很早就在其系统集成VPC(虚拟 PC),却一直没有得到关注,各方面表现也很一般,Hyper-V桌面虚拟化在历经几次版本升级后已经非常给力,不仅在其性能上大有提升,而且现在又与其原生的桌面虚拟化相融合,可以灵活组合搭配应用环境,进行各种场景下的桌面交付. 如果想要搭建Hyper-V并很好的管理,那么需要了解的知识点有: Hyper-V Hyper-V是微软的一款虚拟化产

利用免费云桌面软件搭建办公和教育场境

随着信息化技术的飞速发展,我们的生活也发生了翻天覆地的变化,云计算为我们带来了很多便利,其中云桌面发展最为迅猛,越来越多的企业.政府.学校等机构开始应用云桌面,以提升办公效率,降低运营成本: 云桌面与传统电脑相比,具有很多明显优势: 灵活访问-多种设备接入,随时随地移动访问,多屏共享统一账号.应用数据: 简化管理-集中部署,统一管理,远程维护,应用软件统一安装.升级.卸载: 数据安全-数据存储在云端,保障数据安全,统一病毒防控,抵御病毒入侵: 绿色节能-低功耗(约15W),低占用空间,低噪音,节

利用canvas画一个动态时钟

目标:利用canvas画布画一个动态时钟,根据目前的时间可以实时更新的,可以在过程中添加一些效果,比如让时钟外围的一圈颜色渐变,时钟上的数字颜色改变,时钟的指针颜色改变... 设置一个定时器 先放上一张效果图,参考一下 先建一个画布,写好样式 <style type="text/css"> *{ margin: 0; padding: 0; } div{ //设置div的text-align为center,margin-top text-align: center; mar

[mediatek]修改google原生桌面的时钟显示格式

通过keyguardstatusview.java中可以看到,代码所采用的日期格式固定 观察者定义如下: private static class FormatChangeObserver extends ContentObserver { private WeakReference<ClockView> mClock; private Context mContext; public FormatChangeObserver(ClockView clock) { super(new Hand

利用css3 transform实现一个时钟

transform:rotate(1deg) <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <link rel="stylesheet" href="clock.css"> <title>Clock</title> </head> <body>

初学JavaScript之利用计时器做出的简单时钟

//由于刚学HTML时间不久,JavaScript也是刚刚接触,有很多繁琐代码,希望多多体谅,后续会慢慢改进的<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>简单时钟</title> <style type="text/css"> .wrap{ width: 400px; height: 400px; borde