Widget就是个桌面小组件,有了Widget,我们可以直接在桌面上进行各种操作。
Widget使用

AndroidManifest中声明AppWidget
xml中定义AppWidget配置文件
layout中定义Widget布局文件
创建类继承AppWidgetProvider类

1.AndroidManifest.xml配置

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.xinrui.fristwidget"><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><!-- 声明widget对应的AppWidgetProvider --><!--<receiver android:name=".ExampleAppWidgetProvider" >--><!--<intent-filter>--><!--<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />--><!--<action android:name="com.xinrui.fristwidget.UPDATE_ALL"/>--><!--</intent-filter>--><!--<meta-data android:name="android.appwidget.provider"--><!--android:resource="@xml/example_appwidget_info" />--><!--</receiver>--><!--<service android:name=".ExampleAppWidgetService" >--><!--<intent-filter>--><!--<action android:name="android.appwidget.action.EXAMPLE_APP_WIDGET_SERVICE" />--><!--</intent-filter>--><!--</service>--><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=".MyWidget"><intent-filter><action android:name="android.appwidget.action.APPWIDGET_UPDATE" /></intent-filter><meta-data android:name="android.appwidget.provider"android:resource="@xml/appwidget_info" /></receiver><service android:name=".WidgetService"></service></application></manifest>

2.res 的xml下创建appwidget_info.xml

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"android:initialLayout="@layout/main_activity"android:minHeight="180dp"android:minWidth="350dp"android:previewImage="@drawable/preview"android:updatePeriodMillis="8640000"android:widgetCategory="home_screen|keyguard"></appwidget-provider><!--initialLayout :  widget 的布局文件minHeight: widget  的 最低高度minWidth : widget  的最低高度previewImage : widget 的预览图android:updatePeriodMillis : 更新的频率  google 规定最小时间30 min在这里设置 0 我们自定义widgetCategory : widget 可以被添加主屏幕或者锁屏-->

3.layout下创建布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center_vertical"android:orientation="horizontal"android:paddingLeft="30dp"android:paddingRight="30dp"><LinearLayoutandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:orientation="vertical"><TextViewandroid:id="@+id/tv_date"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="#000"android:text="日期:"android:textSize="16sp" /><TextViewandroid:id="@+id/tv_money"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="#000"android:text="毫秒值:"android:textSize="16sp" /></LinearLayout><Buttonandroid:id="@+id/btn_refound"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="点击"android:textColor="#000"android:textSize="16sp" /></LinearLayout></LinearLayout>

4.provider的创建

package com.xinrui.fristwidget;import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.util.Log;public class MyWidget extends AppWidgetProvider {String TAG = "MyWidget:" ;@Overridepublic void onReceive(Context context, Intent intent) {super.onReceive(context, intent);Log.i(TAG ,"接受广播");}/*** 第一个widget被添加调用* @param context*/@Overridepublic void onEnabled(Context context) {super.onEnabled(context);Log.i(TAG ,"widget  onEnabled 状态");context.startService(new Intent(context, WidgetService.class));}/*** widget被添加 || 更新时调用* @param context*/@Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {super.onUpdate(context, appWidgetManager, appWidgetIds);Log.i(TAG ,"widget  onUpdate 状态");context.startService(new Intent(context, WidgetService.class));}/*** 最后一个widget被删除时调用* @param context*/@Overridepublic void onDisabled(Context context) {super.onDisabled(context);Log.i(TAG ,"widget  onDisabled 状态");context.stopService(new Intent(context, WidgetService.class));}/*** widget被删除时调用* @param context* @param appWidgetIds*/@Overridepublic void onDeleted(Context context, int[] appWidgetIds) {super.onDeleted(context, appWidgetIds);Log.i(TAG ,"widget  onDeleted 状态");}
}

5.service的创建

package com.xinrui.fristwidget;import android.app.PendingIntent;
import android.app.Service;
import android.appwidget.AppWidgetManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log;
import android.widget.RemoteViews;import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;public class WidgetService  extends Service {String  TAG = "WidgetService ";private Timer mTimer;private SimpleDateFormat mFormat;@Nullable@Overridepublic IBinder onBind(Intent intent) {Log.i(TAG,"onBind");return null;}@Overridepublic void onCreate() {super.onCreate();mFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");mTimer = new Timer();mTimer.schedule(new TimerTask() {@Overridepublic void run() {Log.i(TAG,"更新 widget");updateWidget(WidgetService.this);  //更新 widget}}, 0, 1000);}private void updateWidget(Context context) {//通过 RemoteViews 加载布局文件//通过 setTextView 等方法实现对控件的控制RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.main_activity);long millis = System.currentTimeMillis();String format = mFormat.format(new Date(millis));Log.i(TAG,"millis :" + millis + "\n"+ "format: " + format);remoteViews.setTextViewText(R.id.tv_date, "日  期:" + format);remoteViews.setTextViewText(R.id.tv_money, "毫秒值:" + millis);PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, new Intent(this, MainActivity.class), PendingIntent.FLAG_UPDATE_CURRENT);remoteViews.setOnClickPendingIntent(R.id.btn_refound, pendingIntent);   //点击跳转ComponentName componentName = new ComponentName(this, MyWidget.class);AppWidgetManager.getInstance(this).updateAppWidget(componentName, remoteViews);}@Overridepublic void onDestroy() {super.onDestroy();mTimer.cancel();mTimer = null;
Log.i(TAG,"onDestory");}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {return START_STICKY;}}

6.MainActivity

package com.xinrui.fristwidget;import android.app.Activity;
import android.os.Bundle;import android.util.Log;public class MainActivity extends Activity {String TAG  = "MainActivity ";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main_activity);}
}

简单的一个widget小组件就这样实现了

Android 桌面Widget (小组件)开发详解相关推荐

  1. android启动器开发,Android启动器(Launcher)开发详解

    第1章  Launcher的诞生 1.1 Framework启动Launcher流程 1.2 Launcher自身启动流程 App-Launcher-数据加载和UI绑定 目录 [隐藏] 1 1.Lau ...

  2. Android 悬浮窗语音识别功能开发详解

    笔者是一个普通不能再普通的程序员,本着出处兴趣,花时间研究了一下,想实现手机的悬浮窗语音识别功能,这样不影响自己其它操作的,语音识别技术是用百度云语音sdk,应该不难实现,很难实现就是核心语音识别技术 ...

  3. 汉王云名片识别(SM)组件开发详解

    大家好,最近在DeviceOne平台上做了一个汉王云名片识别的功能组件.下面把我开发过程给大家做一个分享,希望可以帮助到大家. 下面我把我的思路给大家讲解一下. 1.找到我要集成的sdk,也就是汉王云 ...

  4. php 汉王云名片_汉王云名片识别(SM)组件开发详解

    大家好,最近在DeviceOne平台上做了一个汉王云名片识别的功能组件.下面把我开发过程给大家做一个分享,希望可以帮助到大家. 下面我把我的思路给大家讲解一下. 1.找到我要集成的sdk,也就是汉王云 ...

  5. 一、微信小程序开发详解

    目录 1.什么是小程序? 2.小程序可以干什么? 3.相关资料 第一个小程序 一.申请帐号 二.测试号申请 三.安装开发工具 四.你的第一个小程序 五.编译预览 六.目录结构 七.JSON 配置 八. ...

  6. android studio下的NDK开发详解

    点击右边,选择你解压的NDK,点击应用.这一步将工具包关联到android  studio. 在 local.properties 文件中设置ndk的路径: 就是你解压的NDK工具集的路径  我的是  ...

  7. android 启动器开发,Android启动器(Launcher)开发详解

    目录 [隐藏] 1 1.Launcher桌面数据和主菜单数据加载流程 1.1 1.1 加载主菜单数据 1.1.1 1.加载调用流程 1.2 1.2 加载桌面数据 1.3 1.3 插入SIM卡时候的数据 ...

  8. Android BLE蓝牙4.0开发详解

    这篇博客主要讲解 蓝牙 BLE 的用法.在讲解之前先讲一些概念性的东西,对于之前没接触过蓝牙开发,现在手上又有个蓝牙BLE项目需要做的人,先看下这些概念还是很重要的.因为我之前就是这样,之前没有接触过 ...

  9. 超简单!Vue 短信验证码组件开发详解

    1. Vue 组件代码如下: Vue.component('timerBtn',{template: '<button v-on:click="run" :disabled= ...

  10. Android 蓝牙BLE开发详解

    Android 蓝牙BLE开发详解 由于年初接手了个有关蓝牙BLE的项目,开始了对蓝牙ble的学习,经过长时间的慢慢学习(学得太慢,太拖了),终于了解了该怎么写蓝牙BLE,现在就给大家分享一下. 一. ...

最新文章

  1. checkbox复选框样式
  2. Linux 解压命令
  3. 正整数 java_JAVA语言:正整数A+B(Java)PAT团体程序设计题解
  4. [MySQL基础]数据库的相关概念
  5. iphone彻底删除照片如何恢复_苹果手机删除的照片如何恢复
  6. python中time模块的时间戳和格式化日期_Python中的time模块与datetime模块
  7. 实时计算-多级订单金额,及下级人数
  8. [2018.03.29 T1] 异或
  9. 利用Java实现简单的日报管理
  10. 解决小牛电动自行车电池不能输出电压
  11. 怎样将音频变声?1分钟教你音频变声怎么弄!
  12. 概率统计·参数估计【矩估计、极大似然估计、无偏性、有效性、相合性】
  13. Oracle分区表管理
  14. Failed to execute ‘getRangeAt‘ on ‘Selection‘: 0 is not a valid index.“报错
  15. 微博短链接生成 php,新浪微博API生成短链接
  16. 中国移动手机话费查询号码1008611
  17. 2021高考成绩等位线查询四川,泸州医学院的麻醉专业收分请问下四川考生一 – 手机爱问...
  18. 在 C# CLR 中学习 C++ 之了解 namespace
  19. 20200211作业
  20. 微信开发者工具中使用scss

热门文章

  1. openg es egl笔记
  2. 测试技术-兼容性测试
  3. 微信小程序 转发功能实例讲解
  4. DSP之ICETEK-DM6437-B开发
  5. SQLserver中勒索病毒或严重损坏后的恢复数据方法
  6. 东莞 小学计算机编程大赛,小学生编程大赛【小学生大赛自我介绍】
  7. v中国瓶装水市场营销状况与销售动态分析报告2022-2027年
  8. python爬取文字和图片_Selenium_Chrome爬取文本和百度图片
  9. 我们的眼睛用得太狠了
  10. torch.nn.Module.buffers(recurse=True)