当前位置: 移动技术网 > 移动技术>移动开发>Android > Android开发入门之Appwidget用法分析

Android开发入门之Appwidget用法分析

2019年07月24日  | 移动技术网移动技术  | 我要评论

本文实例讲述了android appwidget用法。分享给大家供大家参考,具体如下:

app widgets 是一个小型应用程序的view  他可以嵌入到其他应用程序中(如 桌面程序) 并且可以得到周期性刷新。

在创建app widget之前需要了解以下几个概念

appwidgetproviderinfo对象

它是对app widget 元数据的一个描述,譬如 appwidget的布局,刷新频率,以及   appwidgetprovider 类  这些元数据都是定义在xml中。

appwidgetprovider 类的实现

对于app widget定义了(回调接口)一些基本的方法,这些方法都是基于广播事件(broadcast events ),,通过它,当app widget更新,创建,无效,卸载时,你可以接收广播。

view layout

为app widget定义初始布局,用xml来布局

另外,你可以为app widget 实现一个配置的activity,这是一个可选择的activity,在用户添加你的app widget 准备创建时允许他修改或者配 置app widget 。

下面我们就开始创建一个app widget

① 在manifest声明app widget

首先,在androidmanifest.xml中声明  appwidgetprovider

<receiver android:name="exampleappwidgetprovider" >
      <intent-filter>
       <action android:name="android.appwidget.action.appwidget_update" />
      </intent-filter>
      <meta-data android:name="android.appwidget.provider"
        android:resource="@xml/example_appwidget_info" />
</receiver>

<receiver>元素需要android:name 属性,appwidgetprovider作为引用
<intent-filter>  元素务必要包含 <action>元素 然后action中要有android:name 属性,这个属性需要指定能接收 action_appwidget_update 广播的appwidgetprovider,也就是exampleappwidgetprovider 这个广播必须唯一 必须明确声明,因为appwidgetmanager会自动的发送所有其他应用程序的广播给appwidgetprovider,所以很重要。

<meta-data> 元素指定appwidgetproviderinfo资源需要以下属性
android:name -指定了元数据的名字,用android.appwidget.provider代表数据是appwidgetproviderinfo描述。
android:resource -引用appwidgetproviderinfo 资源的位置
总之一句话:在androidmanifest.xml主要声明概念中appwidgetprovider 和appwidgetproviderinfo

②添加appwidgetproviderinfo元数据

appwidgetproviderinfo为appwidgeet定义了一些最基本的数据,譬如布局的最小尺寸,初始化布局资源,怎样更新app widget,以及在创建app widget时的可配置activity(可选)

要定义一个appwidgetproviderinfo对象可以用xml资源文件定义,保存在res/xml/自己的文件名 ,xml文件中用一个单一的元素<appwidget-provider> 请看下面的例子:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
  android:minwidth="294dp"
  android:minheight="72dp"
  android:updateperiodmillis="86400000"
  android:previewimage="@drawable/preview"
  android:initiallayout="@layout/example_appwidget"
  android:configure="com.example.android.exampleappwidgetconfigure"
  android:resizemode="horizontal|vertical">
</appwidget-provider>

initiallayout:指定app widget布局资源文件
configure:在创建app widget时为他配置属性的activity
updateperiodmillis: appwidget更新频率

③ 创建app widget 布局

你必须为你的app widget定义个初始化布局文件,可以将布局文件放在 res/layout/directory。 你可以设计你的app widget用下面列出来
的view对象,但是在你设计开始之前,请你熟读app widget design guidelines.

如果你熟悉xml layouts ,那么创建一个app widget将会是简单的, 然而,你必须意识到app widget布局是基于 remoteviews ,它并不是支持每一种layout和view widget。

一个remoteview对象只能支持下面几种layout布局类:
framelayout  linearlayout   relativelayout

支持下面几种widget 类:
analogclock   button  chronometer  imagebutton  imageview  progressbar  textview  viewflipper  listview  gridview
stackview  adapterviewflipper

ps:这些类的继承类也是不被支持的。

下面是我本次写的demo中的appwidget

功能很简单只为初步理解appwidget ,响应appwidget上按钮事件

package com.manymorere.appwidget;
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;
public class exampleappwidgetprovider extends appwidgetprovider{
  private static final string action = "com.manymore.appwidget";
  private int id;
  @override
  public void ondeleted(context context, int[] appwidgetids) {
    system.out.println("ondeleted");
    super.ondeleted(context, appwidgetids);
  }
  @override
  public void ondisabled(context context) {
    // todo auto-generated method stub
    system.out.println("ondisabled");
    super.ondisabled(context);
  }
  @override
  public void onenabled(context context) {
    // todo auto-generated method stub
    system.out.println("onenabled");
    super.onenabled(context);
  }
  @override
  public void onreceive(context context, intent intent) {
    system.out.println("onreceive");
    // 自己定义的action
    if(intent.getaction().equals(action))
    {
      remoteviews remoteview = new remoteviews(context.getpackagename(),r.layout.appwidget_layout);
      remoteview.setcharsequence(r.id.button, "settext", "22222222222222");
      appwidgetmanager appwidgetmanager = appwidgetmanager.getinstance(context);
      componentname componentname = new componentname(context, exampleappwidgetprovider.class);
      appwidgetmanager.updateappwidget(componentname , remoteview);
      system.out.println("收到自定义action");
    }else{
      super.onreceive(context, intent);
    }
  }
  @override
  public void onupdate(context context, appwidgetmanager appwidgetmanager,
      int[] appwidgetids) {
    int n = appwidgetids.length;
    for(int i = 0; i<n; i++)
    {
      int appwidgetid = appwidgetids[i];
      intent intent = new intent(action);
      pendingintent pendingintent = pendingintent.getbroadcast(context, 0, intent, 0);
      remoteviews remoteviews = new remoteviews(context.getpackagename(),r.layout.appwidget_layout);
      remoteviews.setonclickpendingintent(r.id.button, pendingintent);
      appwidgetmanager.updateappwidget(appwidgetid, remoteviews);
      system.out.println(appwidgetid);
    }
    super.onupdate(context, appwidgetmanager, appwidgetids);
  }
}

每次添加appwidget实例 都会调用onupdate()方法 然后会注册里面的button onclick事件,当你点击该按钮时会发送一个broadcast,这个broadcast是自己定义的,然后onreceive方法会收到该broadcast,然后再做出一些反应,我这里是把修改了textview上的text。

由于appwidget和本身的应用,虽然是在一个程序中,但运行时,它们并不是在一个进程中,所以在在调用方法和修改界面上多少会有点限制,没有普通的(activity上对view的一些操作)那么自由,所以想对appwidget上的view做一些操作,或者更新appwidget,一般需要用到remoteviews,appwidgetmanager 同时可能还会用到componentname

个人理解:remoteviews在创建时主要代表一个appwidget实例中view的一个集合 ,而componentname则代表一个整个appwidget实例

完整实例代码点击此处

更多关于android相关内容感兴趣的读者可查看本站专题:《android编程之activity操作技巧总结》、《android资源操作技巧汇总》、《android文件操作技巧汇总》、《android操作sqlite数据库技巧总结》、《android操作json格式数据技巧总结》、《android数据库操作技巧总结》、《android编程开发之sd卡操作方法汇总》、《android开发入门与进阶教程》、《android视图view技巧总结》及《android控件用法总结

希望本文所述对大家android程序设计有所帮助。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网