`
he91_com
  • 浏览: 410800 次
文章分类
社区版块
存档分类
最新评论

主程序与widget

 
阅读更多

Android开发应用除了程序应用,还有App Widget应用。好多人会开发程序应用而不会开发App Widget应用。本帖子就是帮助大家学习如何开发App Widget应用的。
先简单说说App Widget的原理。App Widget是在桌面上的一块显示信息的东西,通过单击App Widget跳转到程序入口类。而系统自带的程序,典型的App Widget是music,这个Android内置的音乐播放小程序。这个是典型的App Widget+app应用。就是一个程序既可以通过App Widget启动,也可以通过App启动。App Widget就是一个AppWidgetProvider+一个UI界面显示(预先绑定了好多Intent),界面上的信息可以通过程序控制而改变,单击Widget上的控件只能激发发送一个Intent,或发出一个Service的启动通知。而AppWidgetProvider可以拦截这个Intent,而进行相应的处理(比如显示新的信息)。

以下模拟一下App Widget的应用

通过两种方式启动应用程序

1、App Widget启动

长按空白的桌面主屏幕会弹出“添加到主屏幕”,然后选择“窗口小部件”选项进入“选择窗口小部件”,最后选择想要的小部件就会添加到桌面主屏幕,当点击刚才添加的桌面控件就会进入到程序主入口。

1、2、3、

2、App启动:跟普通的Activity一样

以下为实现代码

main.xml布局文件,程序入口类的界面

<?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:layout_width="fill_parent"
        android:layout_height="wrap_content" 
        android:text="程序入口" />
</LinearLayout>
my_layout.xml布局文件:带一个图片的按钮

<?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">
    <!-- <ImageView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/imageView" 
        android:gravity="center"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" /> -->
    <Button android:id="@+id/btn"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:background="@drawable/png1"/>
</LinearLayout>

类MainActivity程序入口类

package com.ljq.activity;
import android.app.Activity;
import android.os.Bundle;

/**
 * 主程序入口类
 * 
 * @author jiqinlin
 *
 */
public class MainActivity extends Activity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

下面的代码才是开发AppWidget用到的代码

my_appwidget.xml布局文件:

<?xml version="1.0" encoding="utf-8"?>
<!-- 
AppWidgetProvderInfo: 描述AppWidget的大小、更新频率和初始界面等信息,以XML文件形式存在于应用的res/xml/目录下。
注意:SDK1.5之后此android:updatePeriodMillis就失效了,要自己创建service更新
 -->
<appwidget-provider
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="75dip"
    android:minHeight="45dip"
    android:updatePeriodMillis="1000"
    android:initialLayout="@layout/my_layout"/>
TestActivity类

package com.ljq.activity;

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;

/**
 * 为手机添加桌面控件,当点击桌面控件时则进入主程序
 * 
 * AppWidgetProvider:继承自BroadcastRecevier,在AppWidget应用update、enable、disable和delete时接收通知。
 * 其中,onUpdate、onReceive是最常用到的方法,它们接收更新通知
 * 
 * @author jiqinlin
 *
 */
public class TestActivity extends AppWidgetProvider {
    /**
     * 用来间隔的更新App Widget,间隔时间用AppWidgetProviderInfo里的updatePeriodMillis属性定义(单位为毫秒)。
     * 注意:SDK1.5之后此android:updatePeriodMillis就失效了,要自己创建service更新。
     * 这个方法也会在用户添加App Widget时被调用,因此它应该执行基础的设置,比如为视图定义事件处理器并启动一个临时的服务Service,如果需要的话。
     * 但是,如果你已经声明了一个配置活动,这个方法在用户添加App Widget时将不会被调用,
     * 而只在后续更新时被调用。配置活动应该在配置完成时负责执行第一次更新。
     */
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        System.out.println("onUpdate");
        //点击桌面组件时进入主程序入口
        Intent intent=new Intent(context, MainActivity.class);
        PendingIntent pendingIntent=PendingIntent.getActivity(context, 0, intent, 0);
        //RemoteViews类描述了一个View对象能够显示在其他进程中,可以融合layout资源文件实现布局。
        //虽然该类在android.widget.RemoteViews而不是appWidget下面,但在Android Widgets开发中会经常用到它,
        //主要是可以跨进程调用(appWidget由一个服务宿主来统一运行的)。
        RemoteViews myRemoteViews = new RemoteViews(context.getPackageName(), R.layout.my_layout);
        //myRemoteViews.setImageViewResource(R.id.imageView, R.drawable.png1);//设置布局控件的属性(要特别注意)
        myRemoteViews.setOnClickPendingIntent(R.id.btn, pendingIntent);
        ComponentName myComponentName = new ComponentName(context, TestActivity.class);
        //负责管理AppWidget,向AppwidgetProvider发送通知。提供了更新AppWidget状态,获取已经安装的Appwidget提供信息和其他的相关状态
        AppWidgetManager myAppWidgetManager = AppWidgetManager.getInstance(context);
        myAppWidgetManager.updateAppWidget(myComponentName, myRemoteViews);
    }
    
    /**
     * 当App Widget从宿主中删除时被调用。
     */
    @Override
    public void onDeleted(Context context, int[] appWidgetIds) {
        System.out.println("onDeleted");
        super.onDeleted(context, appWidgetIds);
    }
    
    /**
     * 当一个App Widget实例第一次创建时被调用。
     * 比如,如果用户添加两个App Widget实例,只在第一次被调用。
     * 如果你需要打开一个新的数据库或者执行其他对于所有的App Widget实例只需要发生一次的设置,
     * 那么这里是完成这个工作的好地方。
     */
    @Override
    public void onEnabled(Context context) {
        System.out.println("onEnabled");
        super.onEnabled(context);
    }
    
    /**
     * 当你的App Widget的最后一个实例被从宿主中删除时被调用。你应该在onEnabled(Context)中做一些清理工作,比如删除一个临时的数据库
     */
    @Override
    public void onDisabled(Context context) {
        System.out.println("onDisabled");
        super.onDisabled(context);
    }
    
    /**
     * 接收到每个广播时都会被调用,而且在上面的回调函数之前。
     * 你通常不需要实现这个方法,因为缺省的AppWidgetProvider实现过滤所有App Widget广播并恰当的调用上述方法。
     * 注意: 在Android 1.5中,有一个已知问题,onDeleted()方法在调用时不被调用。
     * 为了规避这个问题,你可以像Group post中描述的那样实现onReceive()来接收这个onDeleted()回调。
     */
    @Override
    public void onReceive(Context context, Intent intent) {
        System.out.println("onReceive");
        super.onReceive(context, intent);
    }
    
}
清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.ljq.activity" android:versionCode="1"
    android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".MainActivity" android:label="主程序">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!-- TestActivity类为一个广播接收器,因为TestActivity继承自AppWidgetProvider -->
        <receiver  android:name=".TestActivity"    android:label="添加桌面控件">
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>
            <meta-data android:name="android.appwidget.provider"
                android:resource="@xml/my_appwidget"/>
        </receiver>
    </application>
    <uses-sdk android:minSdkVersion="7" />

</manifest>


分享到:
评论

相关推荐

    appWidget启动Activity

    在Android开发中,`appWidget` 是一种可以在用户主屏幕上显示的小部件,它提供了一种无需打开应用程序就能与用户交互的方式。本篇文章将深入探讨如何使用`appWidget`来启动一个`Activity`。 首先,我们需要了解`app...

    appWidget启动Service

    将AppWidget与Service结合使用,可以实现从桌面小部件触发后台服务进行特定任务,如定时更新、远程控制等功能。 **AppWidget启动Service** 1. **创建AppWidget**: 首先,你需要创建一个AppWidget,定义其布局和...

    widget 介绍:比较全面介绍widget由来的资料

    Widget,这个词源自英语,是一个通用术语,用来描述各种小型应用程序或组件,它们可以在不同平台上以小窗口或小框的形式呈现,为用户提供便捷的功能或信息展示。Widget广泛应用于网页、系统桌面、移动设备以及社交...

    安卓Widget小组件相关-androidWidget小组件开发.zip

    - 当用户与Widget交互(如点击)时,`AppWidgetProvider`会接收到对应的Broadcast,并在`onReceive()`方法中处理相应的逻辑。 8. **Widget更新策略** - 更新策略包括定时更新和事件驱动更新。定时更新通常通过`...

    android appwidget全面解析

    AppWidget,即桌面小部件,是Android系统提供的一种允许应用程序在主屏幕放置动态更新的组件,用户无需打开完整应用即可查看信息或进行简单交互。本文将全面解析AppWidget的工作原理、生命周期、启动运行过程以及...

    android appwidget使用说明及示例程序

    Android AppWidget是Android系统提供的一种轻量级组件,允许开发者在用户的主屏幕上创建小型应用程序,通常称为小部件或快捷方式。这些小部件不需要用户启动应用,就能直接在主屏幕上显示和交互,为用户提供便捷的...

    安卓Widget小组件相关-WidgetTest.zip

    Android Widget可以通过Intent和PendingIntent与应用程序的其他部分进行交互。例如,点击Widget上的按钮可以启动一个Activity或发送广播,从而执行更复杂的任务。 6. **权限和生命周期** 虽然Widget没有明确的...

    Widget 闹钟android实现

    在Android平台上,Widget是应用程序的一种轻量级交互方式,它可以在主屏幕上显示实时信息并提供简单操作,无需打开完整的应用程序。本教程将深入探讨如何在Android中实现一个Widget闹钟功能,这对于Android开发者来...

    android Launcher添加widget源码

    在Android中,Widget是一种轻量级的应用组件,可以在用户的主屏幕上显示实时更新的信息,如天气预报、音乐播放控制等。添加Widget到Launcher涉及到以下几个关键步骤: 1. **定义Widget元数据**:在AndroidManifest....

    android app widget demo

    在Android平台上,App Widget是一种可以在用户主屏幕上展示小型交互式UI元素的应用程序组件。它们提供了一种无需打开应用即可与应用交互的方式,提高了用户体验。现在,让我们深入探讨一下"android app widget demo...

    Android的widget使用listview布局

    在Android开发中,Widget是应用在主屏幕上的小型UI组件,它们可以提供用户与应用程序的交互,无需打开应用本身。ListView是一种常用的布局管理器,它允许用户在一个滚动列表中显示大量数据。本教程将深入探讨如何在...

    时间widget的Demo

    在Android中,Widget是用户界面的一种扩展,允许应用程序在主屏幕上提供快捷操作或者实时信息,而无需打开应用程序本身。在这个Demo中,开发者通过`TimeWidget`类展示了如何与系统交互,更新并展示时间。 首先,...

    android widget

    在Android开发中,Widget是应用程序在用户主屏幕上的一种表现形式,它允许开发者为用户提供轻量级的交互体验,即便在应用程序未打开时也能提供服务。本篇将详细讲解"android widget"这一主题,主要基于 mars 老师的 ...

    android之appwidget(四)终 appwidget控件更新

    在Android平台上,AppWidget是能够将小部件添加到用户主屏幕上的迷你应用程序,它们提供了一种无需打开完整应用即可展示信息或执行简单操作的方式。本文将深入探讨Android AppWidget的第四部分,主要关注如何更新App...

    widget实现

    Android Widget是Android应用程序的一种轻量级界面,它可以是时钟、天气预报、音乐播放控制等,直接在主屏幕上显示和交互。它们通常通过App Widget Provider(应用Widget提供者)来定义,并在AndroidManifest.xml...

    应用创建AppWidget的小demo

    AppWidget是Android系统提供的一种可以在主屏幕上展示小型应用程序组件的功能,它允许用户在主屏幕上添加类似于小部件的快捷方式,而无需打开完整的应用程序。在Android开发中,AppWidget的使用可以提升用户体验,让...

    安卓Widget小组件相关-AppWidge不用通过点击直接添加到应用程序中.rar

    在安卓平台上,Widget小组件是应用提供的一种便捷方式,让用户可以在主屏幕上快速访问或操作应用的功能,无需打开应用本身。这个压缩包文件“安卓Widget小组件相关-AppWidge不用通过点击直接添加到应用程序中.rar”...

    android时钟widget例子

    在Android平台上,Widgets是应用程序的一种扩展,它们提供了无需打开应用就能与之交互的功能。在这个“android时钟widget例子”中,开发者创建了一个自定义的时钟组件,以满足对透明时钟的需求。 首先,我们需要...

    Pro Android学习:widget小例子

    在Android开发中,Widget是应用程序在用户主屏幕上的一个组件,它可以提供实时更新的信息和快捷操作,无需打开应用即可与之交互。本教程基于“Pro Android学习”系列,重点讲解如何创建一个简单的Home Screen Widget...

Global site tag (gtag.js) - Google Analytics