android学习笔记のAppWidget

Qt的三个基类QObject、QApplicationQWidget rollTech公司目前开发两种产品: Qt:跨平台的图形界面设计平台 Qtopia:嵌入式系统的应用程序开发平台GUI, 是 Graphical User Interface 的缩写QWidget的英文翻译为:子类化 ,部件 阅读详情

appwidget的功能非常有限 

如果你的widget里面有一个TextView的话,你甚至无法得到这个控件中的文字内容,不要想用getText()方法,因为appwidget只支持一种对其包含控件的访问方法: 

RemoteViews  rv = new RemoteViews(packageName, layoutId); 

rv中包含一些设置属性的方法 

比如:setTextViewText(viewId, text)等 

但是不支持一切getxxx方法 

因此,你只能将数据呈现到appwidget上面。但是,你或许会遇到这种情况:从一个activityservice中获取数据显示到appwidget,当用户进一步操作时(点击了appwidget上的一个按钮),appwidget将会启动另一个activity或者service,并将数据传输给它。例如:启动一个dialog对话框activity让用户输入搜索关键字,用户点击确定之后,关键字会出现在appwidget上,再点击appwidget上的搜索按键,appwidget会启动浏览器,跳转到搜索页面。 

如果以上情况,开发者不可能从appwidget中获取到关键字,因此,比较好的解决方法是利用sharedPreference,将关键字存储进sharedPreference,无论是appwidgetUI显示,还是浏览器activity获取关键字的操作,全部变成读取sharedPreference数据。当然,也可以用其存储方式。

什么是appwidget? 即application widget。 应用程序控件,就是在桌面显示的控件。AppWidget就是我们平常在桌面上见到的那种一个个的小控件,利用这个小控件可以给用户提供一些方便快捷的操作。

创建一个简单的appwidget

相关概念:

1AppWidgetProviderInfo对象:它是一个xml文件,为appWidget提供元数据,包括布局,更新频率等数据。这个对象定义在xml中。

2AppWidgetProvider: 定义了appwidget的基本生命周期函数。

代码:

1、在layout中新建一个appwidgetlayout.xml文件。

 

Java代码  

<?xml version="1.0" encoding="utf-8"?>  

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  

    android:orientation="vertical"  

    android:layout_width="fill_parent"  

    android:layout_height="fill_parent"  

    >  

<TextView    

    android:id="@+id/textview"  

    android:layout_width="fill_parent"   

    android:layout_height="wrap_content"   

    android:text="@string/hello"  

    />  

</LinearLayout  

只是一个textview。这个是应用程序在桌面的控件。

2、在res中新建一个xml包,在这个包中新建一个appwidget_info.xml文件。 

Java代码  

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"  

    android:minWidth="294dp"  

    android:minHeight="72dp"  

    android:updatePeriodMillis="86400000"  

    android:initialLayout="@layout/appwidgetlayout"  

    />  

这个xmlappwidget提供元数据,这个是在桌面的布局,而这个layoutappwidgetlayout)为在appwidget中控件的布局。

3、在包下新建我们的provider,他继承了AppWidgetProvider,只需要对它的生命周期进行处理就行了。

 

Java代码  

public class AppWidgetprovider extends AppWidgetProvider {  

  

    @Override  

    public void onDeleted(Context context, int[] appWidgetIds) {  

        // TODO Auto-generated method stub  

        System.out.println("onDeleted");  

        super.onDeleted(context, appWidgetIds);  

    }  

  

    @Override  

    public void onDisabled(Context context) {  

        // TODO Auto-generated method stub  

        System.out.println("onDisable");  

        super.onDisabled(context);  

    }  

  

    @Override  

    public void onEnabled(Context context) {  

        // TODO Auto-generated method stub  

        System.out.println("onEnable");  

        super.onEnabled(context);  

    }  

  

    @Override  

    public void onReceive(Context context, Intent intent) {  

        // TODO Auto-generated method stub  

        System.out.println("onreceive");  

        super.onReceive(context, intent);  

    }  

  

    @Override  

    public void onUpdate(Context context, AppWidgetManager appWidgetManager,  

            int[] appWidgetIds) {  

        // TODO Auto-generated method stub  

        System.out.println("onUpdate");  

        super.onUpdate(context, appWidgetManager, appWidgetIds);  

    }  

      

}  

   

4、在AndroidManifest.xml中进行配置,由于这个appwidget使用的是广播机制,我们需要在AndroidManifest.xml中进行如下配置:

Java代码  

<receiver android:name="AppWidgetprovider">  

    <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>  

通过过滤器截取APPWIDGET_UPDATE这个action,然后对provider进行资源配置,对应的刚刚那个xml中的文件。

androidappwidget(二)启动新activity

appwidget的周期函数对应的事件:

onUpdate:到达指定时间之后或者用户向桌面添加appwidget时候会调用这个方法。

onDelete:当appwidget被删除时,会调用这个方法。

onEnable:当一个appwidget第一次被创建,会调用这个方法。

onDisable:当最后一个appwidget实例被删除后,会调用这个方法。

onReveice:接受广播事件。

appwidget交互:

功能:创建一个appwidget(为一个button),点击后,启动一个activity

1appwidget与对应的activity不是同一个进程,appwidgethomescreen中的一个进程。所以,不能直接对某一个控件进行事件监听,而是通过RemoteViews进行处理,而且我们也不能直接用intent进行启动activity,用pendingintent

2pendingintent:顾名思义,是还未确定的Intent。可以看做是对intent的一个包装,目的是对RemoteViews进行设置。形象点讲就是进程A中的intent想要在进程B中执行,需要pendingintent进行包装,然后添加到进程B中,进程B中遇到某个事件,然后执行intent

创建pendingintent有三个方法:getActivity(context,requestCode,intent,flags)getService()getBroadcast()

3RemoteViews:即远程的views它的作用是它所表示的对象运行在另外的进程中。

代码:

1appwidget.xml中(即桌面控件上加上一个Button)代码:

Java代码  

<span style="font-size: x-small;">    <Button   

        android:id="@+id/button"  

        android:layout_width="wrap_content"   

        android:layout_height="wrap_content"   

        android:text="测试按钮"  

    /></span>  

 2、在provider中的onUpdate方法中进行处理:

Java代码  

<span style="font-size: x-small;">for(int i= 0;i<appWidgetIds.length;i++){  

            System.out.println(appWidgetIds[i]);  

            //intent  

            Intent intent = new Intent(context,Appwidget2Activity.class);  

            //创建一个pendingIntent。  

            PendingIntent pendingIntent = PendingIntent.getActivity(  

                    context, 0, intent, 0);  

            //创建一个remoteViews。  

            RemoteViews remoteViews  = new RemoteViews(  

                    context.getPackageName(), R.layout.appwidget);  

            //绑定处理器,表示控件单击后,会启动pendingIntent。  

            remoteViews.setOnClickPendingIntent(R.id.button, pendingIntent);  

            appWidgetManager.updateAppWidget(appWidgetIds[i], remoteViews);  

        }</span>  

因为可能有多个appwidget,所以要遍历。创建一个intent,与要启动的activity关联起来,然后根据该intent创建一个pendingintent。然后根据appwidget.xml创建一个remoteViews,然后对该views中的一个控件进行pendingintent绑定。

androidappwidget(三)自定义action广播

根据一个action而启动一个广播,从而完成需要的操作。

首先appwidget根本是基于广播事件的,这个从需要在AndroidManifest.xml配置receiver可以看出,既然是这样,那么也可以自己定义我们自己的action以及在provider中的onReceive中进行处理。

其次,需要知道appwidgetprovider的运行机制就更容易理解了,当appwidget有事件时就会发送一个广播(一个intent对象)到appwidgetprovider它首先会启动onReceive方法来接收action,然后根据action的值来决定调用onUpdateonDeleteonDisableonEnable中的一个方法,它的这些方法都与一个action对应。

下面的实例实现的是自己定义一个action,然后在appwidgetprovider中的onReceiver中截取,然后输出一句话。

代码如下:

1、首先在AndroidManifest.xml加入

Java代码  

<receiver android:name = "AppwidgetProvider">  

    <intent-filter>  

        <action  

android:name="android.appwidget.action.APPWIDGET_UPDATE"/>  

    </intent-filter>  

    <intent-filter >  

             <action android:name="hanl.UPDATE_ACTION"/>  

    </intent-filter>  

    <meta-data android:name="android.appwidget.provider"  

                android:resource="@xml/appwidget_info">  

    </meta-data>  

</receiver>  

增加了一个过滤器:action"hanl.UPDATE_ACTION"

2、在onUpdate函数内增加一个intent,为它设置actionhanl.UPDATE_ACTION,然后用pendingintent包装intent,然后进行事件绑定。这个在appwidget()有具体讲解。

Java代码  

<span>                 @Override  

    public void onUpdate(Context context, AppWidgetManager appWidgetManager,  

            int[] appWidgetIds) {  

        // TODO Auto-generated method stub  

            //intent  

            Intent intent = new Intent();  

//设置action,UPDATE_ACTION在上面定义的为static final String UPDATE_ACTION=hanl.UPDATE_ACTION;</span><span>  

            intent.setAction(UPDATE_ACTION);  

            //创建一个pendingIntent  

            PendingIntent pendingIntent = PendingIntent.getBroadcast(  

                    context, 0, intent, 0);  

            //创建一个remoteViews  

            RemoteViews remoteViews  = new RemoteViews(  

                    context.getPackageName(), R.layout.appwidget);  

            //绑定处理器,表示控件单击后,会启动pendingIntent  

            remoteViews.setOnClickPendingIntent(R.id.button, pendingIntent);  

            //更新  

            appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);  

        super.onUpdate(context, appWidgetManager, appWidgetIds);  

    }</span>  

3、然后在onReceive中进行拦截。 

Java代码  

   @Override  

ublic void onReceive(Context context, Intent intent) {  

// TODO Auto-generated method stub  

String action = intent.getAction();  

if(action.equals(UPDATE_ACTION))  

    System.out.println("onReceive-----"+action);  

super.onReceive(context, intent);  

androidappwidget(四)终 appwidget控件更新

RemoteViews:指的是appwidget中的所有的控件。

componentName:指的是appwidget整个这个对象。

由于appwidget与主进程不是同一个进程,所以不能像在主进程中那样的操作,先get一个控件,然后set一个控件。

 

目标:在appwidget中放入一个textview , 一个imageView,和一个button,我们点击这个button他的textview imageview都发生改变。

代码:

1、首先在appwidget.xml中放入控件:

Java代码  

<TextView    

    android:id="@+id/textview"  

    android:layout_width="fill_parent"   

    android:layout_height="wrap_content"   

    android:text="测试"  

    />  

   <Button   

        android:id="@+id/button"  

        android:layout_width="fill_parent"   

        android:layout_height="wrap_content"   

        android:text="测试按钮"  

    />  

    <ImageView   

        android:id="@+id/imageview"  

        android:layout_width="wrap_content"  

        android:layout_height="wrap_content"  

        android:src="@drawable/android_icon_125"  

    />  

2、然后在onReceive中进行操作:

    要对控件更新,需要几个要点:1、获得控件 2、改变过程 3、将结果显示出来。

获得控件与改变需要remoteView,而将结果update出来需要AppWidgetManagerComponentName。代码如下: 

Java代码  

@Override  

    public void onReceive(Context context, Intent intent) {  

        // TODO Auto-generated method stub  

        String action = intent.getAction();  

        if(action.equals(UPDATE_ACTION)){  

                System.out.println("onReceive-----"+action);      

                //新建一个remoteViews,对控件进行操作。  

                RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.appwidget);  

                //控件更新:  

                remoteViews.setImageViewResource(R.id.imageview, R.drawable.dialog_icon);  

                remoteViews.setTextViewText(R.id.textview, "XXXx!");  

                //更新桌面。  

                //获得appwidgetmanager  

                AppWidgetManager appwidgetManager = AppWidgetManager.getInstance(context);  

                //获得componentName。  

                ComponentName componentname = new ComponentName(context, AppwidgetProvider.class);  

                //更新:  

                appwidgetManager.updateAppWidget(componentname, remoteViews);  

        }  

        else  

            super.onReceive(context, intent);  

}

 

【pprof】简要学习教程 基本介绍 pprof 是在做性能优化前的性能分析工具。 安装: go get -u github.com/google/pprof 分析工具 go tool pprof 是命令行指令,用于分析 Profiling 数据,源数据可以是 http 地址,也可以是已经 dump 下当 profile 文件;查看模式可以命令行交互模式,也可以是浏览器模式(-http 参数)。 两种应用 服务型应用 _ "net/http/pprof" 包,专用于采集 web 服务 运行数据的分析。即在运行的服务中通过 API . 阅读详情

相关推荐

树莓派34/100 - Pico读取MPU6050加速度陀螺仪传感器数据

树莓派Pico连接MPU-6050模块(三轴陀螺仪+三轴加速度),读取运动姿态数据。

申龙斌的程序人生 5043

Android Widget点击跳转Activity完整实现方案

尽管允许使用标准布局文件(XML),但它对可嵌套的View类型有严格限制。任何继承自ViewGroup的非标准容器(如虽受支持但功能有限)、自定义View(Custom View)、或是需要运行时绑定数据的复合控件(如WebView)均不可用。根本原因在于的更新机制基于“反射+预注册操作集合”的模式。系统内部维护了一个白名单(Whitelist),只有被列入其中的类方法才能被远程调用。例如,可以被执行,是因为系统知道如何通过反射调用这个方法;而你的自定义View中的。

weixin_42388898的博客 1340

Qt入门之Widget Application

1.创建项目 1.1 选择模板 由于要创建一个Widget项目,所以选择 Qt Widgets Application 模板 1.2 项目路径 输入项目所在父目录项目名称 1.3 构建系统 可以选择CMake、Qbsqmake 1.4 主类名 设置窗口主类名、文件名 1.5 翻译文件 设置翻译文件,这里不需要 1.6 选择工具集 可以选择MSVCMinGW的工具集,要考虑交叉编译 1.7 配置...

蛐蛐的博客 2686

App Wiget(Android窗体挂件)

App Widget 了解AppWidget前可以先看几个不错的Blog: 传送门: 1. Google App Widget介绍 2. App Widget初探每个AppWidget都有一个AppWidgetProviderInfo对象,该对象描述了每个AppWidget的基本数据(meta-data)信息 ,其定义在<appwidget-provider

细心程度决定你的成败 2365

AppWidget详解

最近一直专研Android开发,希望得到大家的支持与帮助!这是最近学AppWidget做的笔记,希望帮到需要的人!让大家更快的进步!(一下只标注了核心代码,相信大家一定可以看懂的,若需要源码,可以回复说明,也希望大家顶顶贴!至于奖品吧。。。。当然期待哦!) 一、核心功能介绍(一)appwidget介绍: 我们的appwidget与我们对应的activity不是同一个进程appwidget是h

qianguming的专栏 1886

关于Widget中列表item点击跳转activity踩坑记录

Widget中列表item点击跳转activity

nice_gaga的博客 575

说说Android桌面(Launcher应用)背后的故事(大结局)——让Widget拥有Application同等的待遇...

博客搬家啦——为了更好地经营博客,本人已经将博客迁移至www.ijavaboy.com。这里已经不再更新,给您带来的不便,深感抱歉!这篇文章的新地址:点击我 前一篇中,演示了如何开发一个Widget以及如何开发一个WidgetHost应用。有了这个基础,我们就知道,要想在桌面上添加Widget,那么需要完成两件事情: 1、将桌面应用实现为一个WidgetHost应用 2、CellLayo...

dowhathowtodo 274

App Widget(Application Widget)第一讲(Android学习随笔十)

AppWidget(ApplicationWidget)的实现步骤: a、创建AppWidgetProvider对象,通过使用XML(appwidgetinfo.xml)来定义: &lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;appwidget-provider xmlns:android="http://schemas.andro...

soboer 216

Intent中的四个重要属性

Intent作为联系各Activity之间的纽带,其作用并不仅仅只限于简单的数据传递。通过其自带的属性,其实可以方便的完成很多较为复杂的操作。例如直接调用拨号功能、直接自动调用合适的程序打开不同类型的文件等等。诸如此类,都可以通过设置Intent属性来完成。    Intent主要有以下四个重要属性,它们分别为:      ActionAction属性的值为一个字符串,它代表了系统中已经定义

android_he的专栏 1334

初涉Android笔记

UI设计 Activity的生命周期 打开A(page)调用的方法 onCreate(); onStart(); onResume(); 在A(page)的基础上再打开B(page)时 A->onPause(); B->onCreate(); B->onStart(); B->onResume(); A->onStop();(当A被完全遮盖是会调用该方法) 由B返回A时

android_he的专栏 952

android学习笔记数据存储

SharedPreference SharedPreference主要是保存一些常用的配置比如窗口状态,一般在Activity中 重载窗口状态onSaveInstanceState保存一般使用SharedPreferences完成。 类似过去Windows系统上的ini配置文件,但是它分为多种权限,可以全局共享访问。 例子: 工程1: Java代码 SharedPreference

android_he的专栏 669

android学习笔记广播与服务

广播 发送广播 Intent intent = new Intent(ACTION_INTENT_TEST);//创建Intent对象并设置动作为ACTION_INTENT_TEST sendBroadcast(intent);//发送广播 接受广播(两种) 一、通过AndroidManifest.xml文件中使用标签来接受我们需要的广播(配置xml文件、定义继承BroadcastRec

android_he的专栏 636

Now in Android:安卓官方架构学习

这篇文件介绍了Now in Android项目。这是一个严格遵循安卓推荐架构,用KotlinJetpack Compose构建的Android应用。

Meteors.的博客 87

企业知识库如何实现多端统一使用:浏览器、AndroidiOS客户端介绍

企业知识库不能只在办公室电脑上好用,实施人员到了客户现场要查部署记录,工厂员工站在设备旁要看操作手册,出差的人也可能临时确认一份制度或项目资料。zyplayer-doc支持电脑手机浏览器,也提供Android、iOS原生客户端,企业部署一套服务即可,账号、权限文档都在服务端统一管理,不需要为移动端另建一套知识库。

u010047583的专栏 240

android PhoneWindow, DecorView 详解

android PhoneWindow, DecorView 详解

maoning20080808的专栏 166

Android Memory Profiler:堆内存指标、内存抖动与泄漏定位

Android Memory Profiler:堆内存指标、内存抖动与泄漏定位

OuO-1 的博客 292

【阅读源码-Android】GLSurfaceView

SurfaceView + EGL 环境 + 专用渲染线程 + 渲染循环状态机。它解决的核心问题:OpenGL ES 是状态机 API,绑定是线程私有的,GL 命令没有线程安全保护——因此必须有一个独占 EGL 环境的渲染线程,并处理该线程与 UI 线程、Surface 生命周期之间的全部同步问题。。复杂性高度集中在:约 20 个共享状态变量、单一全局锁、生产者-消费者模型、决策与执行分离的主循环。本文第 5-8 章对其进行分层拆解。思想体现1决策与执行分离。

凉水的博客 304

Androidiot开发之猫脸识别

Android IoT猫脸识别功能,深度结合物联网设备通信能力与阿里云云端服务能力,通过标准化的设备指令交互、精准的正则数据解析、规范的云端事件拉取与本地化资源处理,稳定实现了猫咪人脸录入、删除、识别监测、事件图片留存、状态实时反馈等核心业务。整套方案逻辑清晰、异常适配完善、交互体验良好,代码可复用性与扩展性强,完整满足智能宠物IoT设备的猫脸识别业务需求,实现了移动端、设备端、云端三方的数据高效协同。目前只是简单测试阶段,没有处理多只猫咪的情况,是硬件部门联调后固定放一只猫,当然在手机上把猫咪头像对着

u012556114的博客 48

NetWorker_19.2_Installation_Guide_安装指南.pdf

DELL DD 备份软件networker 操作手册 19.2 最新版,拥有WINDOWS LINUX unix 3中环境 控制端 与客户端 安装细则,以及安装中出现的问题解决方法。

上一篇: Android:AppWidget,PendingIntent,RemoteViews用法
下一篇: html5 游戏
android_he
博客等级 码龄15年 3粉丝 10原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值