盒子
盒子

Android桌面小部件

小部件创建步骤

  • 小部件布局
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?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">
    <Button
    android:id="@+id/butt_click"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="小部件"/>
    </LinearLayout>

  • 小部件配置文件
  • 在res-xml资源目录下创建配置文件widget_app.xml:

    1
    2
    3
    4
    5
    6
    7
    <?xml version="1.0" encoding="utf-8"?>
    <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:initialKeyguardLayout="@layout/widget"
    android:minHeight="84dp"
    android:minWidth="84dp"
    android:updatePeriodMillis="86400000">
    </appwidget-provider>

  • 小部件实现类
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    package io.github.grooters.fifth;
    import android.app.PendingIntent;
    import android.appwidget.AppWidgetManager;
    import android.content.Context;
    import android.content.Intent;
    import android.util.Log;
    import android.widget.RemoteViews;
    import android.widget.Toast;
    /**
    * Create by 李林浪 in 2018/12/16
    * Elegant Code...
    */
    public class AppWidgetProvider extends android.appwidget.AppWidgetProvider {
    private final String CLICK_ACTION="click";
    private final String TAG="AppWidgetProvider_debug";
    @Override
    public void onReceive(Context context, Intent intent) {
    super.onReceive(context, intent);
    Log.d(TAG,"onReceive");
    if(intent.getAction().equals(CLICK_ACTION)){
    Log.d(TAG,"intent.getAction().equals(CLICK_ACTION)");
    Toast.makeText(context,"你点击了小部件",Toast.LENGTH_SHORT).show();
    }
    }
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    super.onUpdate(context, appWidgetManager, appWidgetIds);
    Log.d(TAG,"onUpdate");
    for (int appWidgetId:appWidgetIds){
    updateWidget(context,appWidgetManager,appWidgetId);
    }
    }
    private void updateWidget(Context context,AppWidgetManager manager,int appWidgetId){
    Log.d(TAG,"updateWidget");
    RemoteViews remoteViews=new RemoteViews(context.getPackageName(),R.layout.widget);
    Intent intent=new Intent();
    intent.setAction(CLICK_ACTION);
    intent.setClass(context,AppWidgetProvider.class);
    PendingIntent pendingIntent=PendingIntent.getBroadcast(context,0,intent,0);
    remoteViews.setOnClickPendingIntent(R.id.butt_click,pendingIntent);
    manager.updateAppWidget(appWidgetId,remoteViews);
    }
    }

    intent.setClass(context,AppWidgetProvider.class);必须要有,否则无法接收到该广播

  • 声明小部件
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    <receiver android:name=".AppWidgetProvider">
    <meta-data
    android:name="android.appwidget.provider"
    android:resource="@xml/widget_app"/>
    <intent-filter>
    <action android:name="click" />
    <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    </intent-filter>
    </receiver>

    action android:name=”click” 是自己定义的点击动作
    action android:name=”android.appwidget.action.APPWIDGET_UPDATE”是指定该receiver为小部件

    AppWidgetProvider

  • onEnable
  • 当小部件第一次添加到桌面时会调用该方法

  • onUpdate
  • 小部件被添加时或者每次更新时都会调用该方法

  • onDeleted
  • 每删除一次桌面小部件就调用一次该方法

  • onDisabled
  • 最后一个该类型的桌面小部件被删除时调用该方法

    支持一下
    扫一扫,支持Grooter
    • 微信扫一扫
    • 支付宝扫一扫