Android Widget开发代码示例详细说明

news2024/11/27 16:25:10

因为AppWidgetProvider扩展自BroadcastReceiver, 所以你不能保证回调函数完成调用后,AppWidgetProvider还在继续运行。

a. AppWidgetProvider 的实现

/**
 * Copyright(C):教育电子有限公司 
 * Project Name: NineSync
 * Filename: SynWidgetProvider.java 
 * Author(S): Rjdeng
 * Created Date: 2013-4-23 下午8:55:42 
 * Version: V1.00
 * Description: 九科同步挂件
 */

package com.eebbk.synstudy.widget;

import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.widget.RemoteViews;

import com.eebbk.synstudy.R;

public class SynWidgetProvider extends AppWidgetProvider
{
	public static final String SUBJECT_MARK = "subject";
	private static final int CHINESE_CONSTANT = -1;
	private final String NINESYNC_PKG = "com.eebbk.synstudy";
	private final String NINESYNC_CLS = "com.eebbk.synstudy.welcome.WelcomActivity";
	private final String STUDYCARS_PKG = "com.eebbk.readingcard.readingcard";
	private final String STUDYCARS_CLS = "com.eebbk.readingcard.readingcard.MenuManagerActivity";
	private final int widgetViewId[] = { R.id.syn_widget_notes, R.id.syn_widget_chinese, R.id.syn_widget_math,
			R.id.syn_widget_english, R.id.syn_widget_physics, R.id.syn_widget_chemistry, R.id.syn_widget_organisms,
			R.id.syn_widget_history, R.id.syn_widget_geography, R.id.syn_widget_political };
	
	@Override
	public void onUpdate( Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds )
	{
		// TODO Auto-generated method stub
		
		System.out.printf( "###九科同步挂件创建\n" );
		final RemoteViews views = new RemoteViews( context.getPackageName( ), R.layout.main_syn_widget );
		
		setViewOnClick( context, views );
		pushUpdate( context, appWidgetIds, views );
		
		super.onUpdate( context, appWidgetManager, appWidgetIds );
	}
	
	@Override
	public void onDeleted( Context context, int[] appWidgetIds )
	{
		// TODO Auto-generated method stub
		
		System.out.printf( "###九科同步挂件删除\n" );
		super.onDeleted( context, appWidgetIds );
	}
	
	@Override
	public void onEnabled( Context context )
	{
		// TODO Auto-generated method stub
		
		System.out.printf( "###当该Widget第一次添加到桌面是调用该方法,可添加多次但只第一次调用\n" );
		super.onEnabled( context );
	}
	
	private void setViewOnClick( Context context, RemoteViews views )
	{
		Intent intent;
		PendingIntent pendingIntent;
		ComponentName componentName;
		
		//九科同步
		componentName = new ComponentName( NINESYNC_PKG, NINESYNC_CLS );
		
		for ( int i = 1; i < widgetViewId.length; i++ )
		{
			intent = new Intent( );
			intent.setComponent( componentName );
			intent.putExtra( SUBJECT_MARK, CHINESE_CONSTANT + i );
			//for putExtra
			intent.setAction( String.valueOf( System.currentTimeMillis( ) ) );
			pendingIntent = PendingIntent.getActivity( context, 0 /* no requestCode */, intent, 0 /* no flags */);
			views.setOnClickPendingIntent( widgetViewId[i], pendingIntent );
		}
		
		//读书卡片
		intent = new Intent( );
		componentName = new ComponentName( STUDYCARS_PKG, STUDYCARS_CLS );
		intent.setComponent( componentName );
		pendingIntent = PendingIntent.getActivity( context, 0 /* no requestCode */, intent, 0 /* no flags */);
		views.setOnClickPendingIntent( widgetViewId[0], pendingIntent );
	}
	
	private void pushUpdate( Context context, int[] appWidgetIds, RemoteViews views )
	{
		// Update specific list of appWidgetIds if given, otherwise default to all
		final AppWidgetManager gm = AppWidgetManager.getInstance( context );
		
		if( appWidgetIds != null )
		{
			gm.updateAppWidget( appWidgetIds, views );
		}
		else
		{
			gm.updateAppWidget( new ComponentName( context, this.getClass( ) ), views );
		}
	}
	
}

b. widget外观布局定义文件(文件位置:res\layout)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/syn_widget_bg"
    android:orientation="horizontal" >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginLeft="20dip" >

        <Button
            android:id="@+id/syn_widget_notes"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:background="@drawable/readnotes_selector" />
    </RelativeLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginLeft="50dip"
        android:layout_marginTop="100dip"
        android:orientation="vertical" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="0dip"
            android:layout_weight="1"
            android:orientation="horizontal" >

            <ImageButton
                android:id="@+id/syn_widget_chinese"
                android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@drawable/chinese_selector"
                android:clickable="true" />

            <ImageButton
                android:id="@+id/syn_widget_math"
                android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@drawable/math_selector" />

            <ImageButton
                android:id="@+id/syn_widget_english"
                android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@drawable/english_selector" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="0dip"
            android:layout_weight="1"
            android:orientation="horizontal" >

            <ImageButton
                android:id="@+id/syn_widget_physics"
                android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@drawable/physics_selector" />

            <ImageButton
                android:id="@+id/syn_widget_chemistry"
                android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@drawable/chemistry_selector" />

            <ImageButton
                android:id="@+id/syn_widget_organisms"
                android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@drawable/organisms_selector" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="0dip"
            android:layout_weight="1"
            android:orientation="horizontal" >

            <ImageButton
                android:id="@+id/syn_widget_history"
                android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@drawable/history_selector" />

            <ImageButton
                android:id="@+id/syn_widget_geography"
                android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@drawable/geography_selector" />

            <ImageButton
                android:id="@+id/syn_widget_political"
                android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@drawable/political_selector" />
        </LinearLayout>
    </LinearLayout>

</LinearLayout>

c. 新增widget时的配置Activity的实现(可选)本介绍没有选择这种方式

d. widget 参数配置文件(文件位置:res\xml)

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:initialLayout="@layout/main_syn_widget"
    android:minHeight="505dip"
    android:minWidth="729dip"
    android:previewImage="@drawable/sync_launcher"
    android:updatePeriodMillis="0" >

</appwidget-provider>

e. AndroidManifest.xml 声明

<receiver
    android:name=".widget.SynWidgetProvider"
    android:permission="android.permission.BIND_APPWIDGET" >
    <intent-filter>
	<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    </intent-filter>

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

f. 效果图(九科同步挂件Rjdeng 于2013-4-24
在这里插入图片描述

觉得本文对你有用,麻烦点赞或关注或收藏,你的肯定是我创作的无限动力,谢谢!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1631771.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Node.js工程师养成计划】之原生node开发web服务器

一、使用node创建http服务器 var http require(http);// 获取到服务器实例对象 var server http.createServer() server.listen(8080, function() {console.log(http://127.0.0.1:8080); })server.on(request, function(req, res){console.log(request);res.write(6666666688…

VitePress 构建的博客如何部署到 github 平台?

VitePress 构建的博客如何部署到 github 平台&#xff1f; 1. 新建 github 项目 2. 构建 VitePress 项目 2.1. 设置 config 中的 base 由于我们的项目名称为 vite-press-demo&#xff0c;所以我们把 base 设置为 /vite-press-demo/&#xff0c;需注意前后 / export default…

【数据结构与算法(C语言)】1. 线性表的顺序存储

文章目录 前言一. 线性表插入和删除1. 元素的插入2. 元素的删除 二. 代码三. 优缺点 前言 线性表的顺序存储结构&#xff0c;指的是用一段地址连续的存储单元依次存储线性表的数据结构 一. 线性表插入和删除 1. 元素的插入 插入位置之后的数据都向后移一位&#xff0c;上图中元…

chrome 安装devtools

chrome 安装devtools 下载安装 链接&#xff1a;https://github.com/vuejs/devtools 选择对应版本&#xff1a; 安装yarn 下载 npm install -g yarn --registryhttps://registry.npmmirror.com进入下载的目录安装依赖 yarn install --registryhttps://registry.npmmirror.…

ASP.NET汽车销售管理系统的设计与开发

摘 要 随着人们生活水平的不断提高&#xff0c;人们对汽车的消费和需求也越来越旺盛。很多汽车销售公司的业务环节仍然运用人工记账的传统方法&#xff0c;既容易出错又会导致账目混乱&#xff0c;查询和统计起来也非常不方便&#xff0c;费时又费力&#xff0c;严重时会给公…

stm32单片机开发二、定时器-内部时钟中断和外部时钟中断、编码器

定时器本质就是一个计数器 案例&#xff1a;定时器定时中断 内部时钟中断 Timer_Init(); //定时中断初始化 /*** 函 数&#xff1a;定时中断初始化* 参 数&#xff1a;无* 返 回 值&#xff1a;无*/ void Timer_Init(void) {/*开启时钟*/RCC_APB1PeriphClockCmd(RCC…

CSS-复合选择器

作用&#xff1a; 后代选择器&#xff1a; 子代选择器 并集选择器 用逗号隔开&#xff0c;在style里面写的时候&#xff0c;每一个标签空一行。 <title>Document</title><style>p,div,span{color: aqua;}</style> </head> <body><p>…

在Linux操作系统中关于磁盘(硬盘)管理的操作

电脑中数据存储设备&#xff1a;硬盘&#xff08;实现数据的持久化存储&#xff09;&#xff0c;内存 在Linux操作系统中一切皆文件的思想&#xff0c;所有的设备在Linux操作系统中都是通过文件来标识的&#xff0c;所以每一个硬盘都对应一个块设备文件。 在Linux操作系统中所…

Golang | Leetcode Golang题解之第55题跳跃游戏

题目&#xff1a; 题解&#xff1a; // 贪心算法 func canJump(nums []int) bool {cover : 0n : len(nums)-1for i : 0; i < cover; i { // 每次与覆盖值比较cover max(inums[i], cover) //每走一步都将 cover 更新为最大值if cover > n {return true}}return false } …

YOLov5 + Gradio搭建简单的Web GUI

写在前面&#xff1a;当我们将模型训练出来了&#xff0c;此时就需要做UI界面给别人展示了。python提供的Gradio可以快速的搭建web页面。生成本地网址和公网网址&#xff0c;方面自己测试和用户测试。 一、安装 Gradio介绍 Gradio是一个开源的python库&#xff0c;用于构建机…

深度学习模型Deep Learning Model

什么是深度学习&#xff1f;&#xff1f; 深度学习模型是一种基于人工神经网络&#xff08;Artificial Neural Networks, ANN&#xff09;的机器学习模型&#xff0c;其核心思想是通过多层次的神经网络结构来学习数据的特征表示和模式。这些模型通常由多个层次&#xff08;深度…

WPS的JS宏如何设置Word文档的表格的单元格文字重新编号

希望对Word文档中的表格进行统一处理&#xff0c;表格内的编号&#xff0c;有时候会出现紊乱&#xff0c;下一个表格的编号承接了上一个表格的编号&#xff0c;实际需要重新编号。 当表格比较多时&#xff0c;手动更改非常麻烦&#xff0c;而且更改一遍并不能完成&#xff0c;…

测算sample gpt

测算代码 import pandas as pd import matplotlib.pyplot as pltlosspd.read_pickle("loss_8.pkl") plt.plot(loss) losspd.read_pickle("loss_16.pkl") plt.plot(loss) losspd.read_pickle("loss_4_8.pkl") plt.plot(loss) losspd.read_pickle(…

第5篇:创建Nios II工程之Hello_World<四>

Q&#xff1a;最后我们在DE2-115开发板上演示运行Hello_World程序。 A&#xff1a;先烧录编译Quartus硬件工程时生成的.sof文件&#xff0c;在FPGA上成功配置Nios II系统&#xff1b;然后在Nios II Eclipse窗口右键点击工程名hello_world&#xff0c;选择Run As-->Nios II …

低代码+定制物资管理:创新解决方案探析

引言 在当今快速变化的商业环境中&#xff0c;企业面临着不断增长的挑战&#xff0c;如提高效率、降低成本、满足客户需求等。为了应对这些挑战&#xff0c;企业需要不断创新并采用先进的技术解决方案。在这样的背景下&#xff0c;低代码开发和定制化物资管理成为了引领企业变…

03.Kafka 基本使用

Kafka 提供了一系列脚本用于命令行来操作 kafka。 1 Topic 操作 1.1 创建 Topic 创建一个名为 oldersix-topic 的 topic&#xff0c;副本数设置为3&#xff0c;分区数设置为2&#xff1a; bin/kafka-topics.sh \ --create \ --zookeeper 192.168.31.162:2181 \ --replication…

Blender曲线操作

1.几种常见建模方式 -多边形建模&#xff1a;Blender&#xff0c;C4D&#xff0c;3DsMax&#xff0c;MaYa -曲线&#xff1a; -曲面&#xff1a;Rhino&#xff08;Nurbs&#xff09; -雕刻&#xff1a;Blender&#xff0c;ZBrush -蜡笔&#xff1a;Blender 1&#xff09;新…

编译报错 - Missing trailing comma comma-dangle or Missing semicolon semi

一、comma-dangle规则&#xff1a; 这种错误通常出现在使用代码格式检查工具&#xff08;如ESLint&#xff09;时&#xff0c;具体是在JSON或者JavaScript对象、数组的最后一个元素后面缺少了逗号&#xff08;trailing comma&#xff09;。在某些编码标准中&#xff0c;要求在…

spring cloud eureka 初始化报错(A bean with that name has already been defined)

报错内容 The bean ‘eurekaRegistration’, defined in class path resource [org/springframework/cloud/netflix/eureka/EurekaClientAutoConfiguration E u r e k a C l i e n t C o n f i g u r a t i o n . c l a s s ] , c o u l d n o t b e r e g i s t e r e d . A …

MySQL:飞腾2000+Centos7.6 aarch64 部署MySQL8.0.36

目录 1.硬件环境 2.MySQL选择 Bundle版本【全部文件】​编辑 3.下载并安装 4.安装完成后检查mysql 5.初始化MySQL 6.那就问了&#xff0c;都初始化了啥&#xff1f; 7.尝试启动MySQL 8.给mysql文件授权 9.再次尝试启动正常 10.mysql初始化目录出现了mysql.sock 11.找…