Android 桌面小部件(AppWidgetProvider)的应用

根据应用的需要,有的APP中内嵌了桌面小部件代码,以至于我们可以通过长按手机屏幕-->小部件-->选择你需要添加的应用小部件。这样可以给用户提过了较好的、快捷的使用体验方式,这边是Android桌面小部件的实际意义。

下图是有道词典的一个桌面小部件的实例(另外红日的icon便是红日APP的一个简单的桌面小部件):

AppWidgetProvider是Android提供的用于实现桌面小部件的类,其本质是一个广播。另外也用到了RemoteViews这个类,这是一个跨进程的远程类,使用场景有两种:通知栏和小部件。

小部件的开发步骤:

1、定义小部件界面

res/layout目录下新建一个xml布局文件,这里是widget.xml,布局很简单只是一张红日的icon

<?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="vertical">

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:src="@drawable/sun" />

</LinearLayout>

2、定义小部件配置信息:

res/xml目录下新建一个xml布局文件,这里是new_app_widget_info.xml
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:initialKeyguardLayout="@layout/widget"
    android:initialLayout="@layout/widget"
    android:minHeight="40dp"
    android:minWidth="40dp"
    android:previewImage="@drawable/example_appwidget_preview"
    android:resizeMode="horizontal|vertical"
    android:updatePeriodMillis="86400000"
    android:widgetCategory="home_screen">
</appwidget-provider>

其中initialLayout引用到了前面定义的小部件的布局文件widget.


3、定义小部件的实现类:
package xml;

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.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.os.SystemClock;
import android.widget.RemoteViews;

import com.hongri.recyclerview.R;
import com.hongri.recyclerview.utils.Logger;

/**
 * 桌面小部件实现类.
 */
public class NewAppWidget extends AppWidgetProvider {
    private static final String CLICK_ACTION = "android.appwidget.action.click";
    private static RemoteViews remoteViews;
    public NewAppWidget(){
        super();
    }

    /**
     * 桌面小部件更新
     * @param context
     * @param appWidgetManager
     * @param appWidgetId
     */
    static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
                                int appWidgetId) {
        Logger.d("updateAppWidget");

        sendPendingIntentCast(context);

        appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
    }

    @Override
    public void onReceive(final Context context, Intent intent) {
        super.onReceive(context, intent);
        if (intent.getAction().equals(CLICK_ACTION)){
            Logger.d("onReceive--CLICK_ACTION");
            new Thread(new Runnable() {
                @Override
                public void run() {
                    Bitmap srcbBitmap = BitmapFactory.decodeResource(context.getResources(),R.drawable.sun);
                    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
                    for (int i = 0; i < 37; i++) {
                        float degree = (i*10) % 360;

                        sendPendingIntentCast(context);

                        remoteViews.setImageViewBitmap(R.id.imageView1,rotateBitmap(context,srcbBitmap,degree));

                        appWidgetManager.updateAppWidget(new ComponentName(context,NewAppWidget.class),remoteViews);
                        SystemClock.sleep(30);
                    }
                }
            }).start();
        };
    }

    /** 设置旋转动画 */
    private Bitmap rotateBitmap(Context context, Bitmap srcbBitmap, float degree) {
        Matrix matrix = new Matrix();
        matrix.reset();
        matrix.setRotate(degree);
        Bitmap tmpBitmap = Bitmap.createBitmap(srcbBitmap,0,0,srcbBitmap.getWidth(),srcbBitmap.getHeight(),matrix,true);
        return tmpBitmap;
    }

    /**
     * "桌面小部件"点击发送的Intent广播
     * @param context
     */
    private static void sendPendingIntentCast(Context context) {
        remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget);
        Intent intentClick = new Intent();
        intentClick.setAction(CLICK_ACTION);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context,0,intentClick,0);
        remoteViews.setOnClickPendingIntent(R.id.imageView1,pendingIntent);

    }

    /**
     * 每次桌面小部件更新时都会调用该方法
     * @param context
     * @param appWidgetManager
     * @param appWidgetIds
     */
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        Logger.d("onUpdate");
        for (int appWidgetId : appWidgetIds) {
            updateAppWidget(context, appWidgetManager, appWidgetId);
        }
    }
}

4、AndroidManifest.xml文件中声明小部件(小部件的机制就是广播,所以必须声明):

<receiver android:name="xml.NewAppWidget">
            <intent-filter>
                <action android:name="android.appwidget.action.click"></action>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>

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

最后运行程序没问题时,可以将小部件添加到桌面:

长按桌面-->进入小部件-->红日app-->店家该app下的此小部件
时间: 2024-08-11 05:44:46

Android 桌面小部件(AppWidgetProvider)的应用的相关文章

桌面小部件AppWidgetProvider简单分析

1.一般桌面小部件涉及到的类 AppWidgetProvider :BroadcastRecevier子类,用于接收更新,删除通知 AppWidgetProvderInfo:AppWidget相关信息(大小,更新频率等),xml形式 AppWidgetManger:AppWidget管理类,用于向provider发送消息 RemoteViews:可以在其他进程中运行的类,用于向provider发送通知. RemoteViewsService : 是一个远程的服务适配器 可以请求RemoteVie

Android桌面小部件AppWidget开发

什么是AppWidget AppWidget 即桌面小部件,也叫桌面控件,就是能直接显示在Android系统桌面上的小程序,先看图: 图中我用×××箭头指示的即为AppWidget,一些用户使用比较频繁的程序,可以做成AppWidget,这样能方便地使用.典型的程序有时钟.天气.音乐播放器等.AppWidget 是Android 系统应用开发层面的一部分,有着特殊用途,使用得当的化,的确会为app 增色不少,它的工作原理是把一个进程的控件嵌入到别外一个进程的窗口里的一种方法.长按桌面空白处,会出

Android开发中实现桌面小部件

在Android开发中,有时候我们的App设计的功能比较多的时候,需要根据需要更简洁的为用户提供清晰已用的某些功能的时候,用桌面小部件就是一个很好的选择,即App Widget,下面我们就用Android studio来创建一个简单的桌面小部件: 选择New->Widget->App Wight                                                                 接下来设置App Widget的一些信息               

Android Widget 小部件(四---完结) 使用ListView、GridView、StackView、ViewFlipper展示Widget

官方有话这样说: A RemoteViews object (and, consequently, an App Widget) can support the following layout classes: FrameLayout LinearLayout RelativeLayout And the following widget classes: AnalogClock Button Chronometer ImageButton ImageView ProgressBar Text

Android Widget 小部件(二) 使用configure

在添加Widget之前需要做一些处理操作,可以使用 配置活动 在上一篇的实现基础上,加上配置活动(configure=activity).这时添加Widget时,会先打开一个Activity,进行配置操作, <appwidget-provider .... android:configure="com.stone.ui.AppWidgetConfigureActivity" > </appwidget-provider> 配置活动的实现: package com

Android Widget 小部件(一) 简单实现

在屏幕上添加Widget:或长按屏幕空白处,或找到WidgetPreview App选择.原生系统4.0以下使用长按方式,4.0及以上 打开WIDGETS 创建Widget的一般步骤: 在menifest中 <receiver android:name="com.stone.ui.TimerWidgetProvider"> <intent-filter> <action android:name="android.appwidget.action

Android Widget 小部件(三) 在Activity中添加Widget

package com.stone.ui; import static android.util.Log.d; import android.app.Activity; import android.appwidget.AppWidgetHost; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProviderInfo; import android.content.Intent; imp

解决 三星Note3 桌面小部件不实时更新/不刷新 的问题

机型及问题描述:我的是三星note3 (国行 SM-N9008V),已ROOT,安装了LBE安全大师.在桌面小部件中,有些不会实时更新.比如有 滴答清单(办过的事项无法勾选),百度云音乐(歌曲播放更新不及时),系统自带健走计步器(走路数量不更新)等. 问题原因:经测试,原因应该出在LBE安全大师会自动清理RAM,导致负责桌面小部件的进行被杀掉了,致使无法顺利更新小部件. 解决方法:打开LBE安全大师--"手机加速"--"任务管理"--上方的"白名单任务&q

【Android】AppWidget桌面小部件

什么是App Widget? AppWidget是应用程序窗口小部件,是微型的应用程序视图,它可以被嵌入到桌面应用程序中,并接收周期的更新. 如何实现AppWidget? 1. 新建一个AppWidget类继承AppWidgetProvider(AppWidgetProvider继承BroadcastReceiver),并实现相关生命周期方法. onUpdate() 当widget更新时被执行. 注意:用户首次添加widget时,onUpdate()也会被调用.但是如果定义了widget的con