Android 桌面小窗口开发

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Alin693/article/details/80347308

布局layout : widget_home.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:background="@drawable/widget_bg_fillet"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <RelativeLayout
        android:id="@+id/widget_time"
        android:layout_width="match_parent"
        android:layout_height="65dp"
        android:layout_alignParentTop="true"
        android:padding="5dp">

        <TextView
            android:id="@+id/widget_date"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentBottom="true"
            android:layout_marginLeft="15dp"
            android:textColor="#ff4a4a4a"
            android:textSize="36sp"
            android:text="4月5号" />

        <TextView
            android:id="@+id/widget_week"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_toRightOf="@+id/widget_date"
            android:text="周三下午"
            android:textColor="#ff4a4a4a"
            android:textSize="15sp"
            android:layout_marginLeft="10dp" />

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_alignParentBottom="true"
            android:layout_marginRight="15dp"
            android:orientation="vertical"
            android:gravity="center">

            <ImageView
                android:id="@+id/weather_image"
                android:layout_width="36dp"
                android:layout_height="36dp" />

            <TextView
                android:id="@+id/weather_txt"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="雷阵雨"
                android:textColor="#ff4a4a4a"
                android:textSize="12sp"/>
        </LinearLayout>
    </RelativeLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:layout_marginBottom="15dp">

        <RelativeLayout
            android:id="@+id/company_rank"
            android:layout_width="126dp"
            android:layout_height="112dp"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:layout_marginLeft="10dp"
            android:background="@drawable/widget_item_bg_fillet">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_above="@+id/company_rank_number"
                android:layout_marginBottom="10dp"
                android:layout_centerHorizontal="true"
                android:text="通话时长"
                android:textSize="12sp"
                android:textColor="#9B9B9B"/>

            <TextView
                android:id="@+id/company_rank_number"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:layout_centerVertical="true"
                android:text="3"
                android:textColor="#4A4A4A"
                android:textSize="32sp" />

            <TextView
                android:id="@+id/company_rank_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/company_rank_number"
                android:layout_centerHorizontal="true"
                android:layout_marginTop="5dp"
                android:text="公司排名"
                android:textColor="#606266"
                android:textSize="14sp" />
        </RelativeLayout>

        <RelativeLayout
            android:id="@+id/branch_rank"
            android:layout_width="126dp"
            android:layout_height="112dp"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:layout_marginRight="10dp"
            android:background="@drawable/widget_item_bg_fillet">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_above="@+id/branch_rank_number"
                android:layout_marginBottom="10dp"
                android:layout_centerHorizontal="true"
                android:text="通话时长"
                android:textSize="12sp"
                android:textColor="#9B9B9B"/>

            <TextView
                android:id="@+id/branch_rank_number"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:layout_centerVertical="true"
                android:text="1"
                android:textColor="#4A4A4A"
                android:textSize="32sp" />

            <TextView
                android:id="@+id/branch_rank_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/branch_rank_number"
                android:layout_centerHorizontal="true"
                android:layout_marginTop="5dp"
                android:text="部门排名"
                android:textColor="#606266" />
        </RelativeLayout>

        <RelativeLayout
            android:id="@+id/call_customer"
            android:layout_width="126dp"
            android:layout_height="112dp"
            android:layout_alignParentLeft="true"
            android:layout_centerVertical="true"
            android:layout_marginLeft="10dp"
            android:background="@drawable/widget_item_bg_fillet">

            <ImageView
                android:id="@+id/call_customer_path"
                android:layout_width="12dp"
                android:layout_height="7dp"
                android:layout_alignParentEnd="true"
                android:layout_alignTop="@+id/call_customer_number"
                android:layout_marginEnd="23dp"
                android:src="@drawable/down" />

            <TextView
                android:id="@+id/call_customer_number"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:layout_centerVertical="true"
                android:text="289"
                android:textColor="#4A4A4A"
                android:textSize="32sp" />

            <TextView
                android:id="@+id/call_customer_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/call_customer_number"
                android:layout_centerHorizontal="true"
                android:layout_marginTop="5dp"
                android:text="拨打客户数"
                android:textColor="#606266" />
        </RelativeLayout>

        <RelativeLayout
            android:id="@+id/answer_customer"
            android:layout_width="126dp"
            android:layout_height="112dp"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_marginRight="10dp"
            android:background="@drawable/widget_item_bg_fillet">

            <ImageView
                android:id="@+id/answer_customer_path"
                android:layout_width="12dp"
                android:layout_height="7dp"
                android:layout_alignParentEnd="true"
                android:layout_alignTop="@+id/answer_customer_number"
                android:layout_marginEnd="23dp"
                android:src="@drawable/up" />

            <TextView
                android:id="@+id/answer_customer_number"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:layout_centerVertical="true"
                android:text="175"
                android:textColor="#4A4A4A"
                android:textSize="32sp" />

            <TextView
                android:id="@+id/answer_customer_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/answer_customer_number"
                android:layout_centerHorizontal="true"
                android:layout_marginTop="5dp"
                android:text="接通客户数"
                android:textColor="#606266" />
        </RelativeLayout>

        <RelativeLayout
            android:id="@+id/intention_customer"
            android:layout_width="126dp"
            android:layout_height="112dp"
            android:layout_alignParentLeft="true"
            android:layout_alignParentBottom="true"
            android:layout_marginLeft="10dp"
            android:background="@drawable/widget_item_bg_fillet">

            <TextView
                android:id="@+id/intention_customer_number"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:layout_centerVertical="true"
                android:text="37"
                android:textColor="#4A4A4A"
                android:textSize="32sp" />

            <TextView
                android:id="@+id/intention_customer_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/intention_customer_number"
                android:layout_centerHorizontal="true"
                android:layout_marginTop="5dp"
                android:text="有意向客户"
                android:textColor="#606266" />
        </RelativeLayout>

        <RelativeLayout
            android:id="@+id/exchange_customer"
            android:layout_width="126dp"
            android:layout_height="112dp"
            android:layout_alignParentRight="true"
            android:layout_alignParentBottom="true"
            android:layout_marginRight="10dp"
            android:background="@drawable/widget_item_bg_fillet">

            <TextView
                android:id="@+id/exchange_customer_number"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:layout_centerVertical="true"
                android:text="54"
                android:textColor="#4A4A4A"
                android:textSize="32sp" />

            <TextView
                android:id="@+id/exchange_customer_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/exchange_customer_number"
                android:layout_centerHorizontal="true"
                android:layout_marginTop="5dp"
                android:text="待沟通客户"
                android:textColor="#606266" />
        </RelativeLayout>
    </RelativeLayout>

</LinearLayout>

 布局xml:desktop_widget.xml

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="240dp"
    android:minHeight="500dp"
    android:updatePeriodMillis="86400000"
    android:previewImage="@mipmap/ic_launcher"
    android:initialLayout="@layout/widget_home"
    android:initialKeyguardLayout="@layout/widget_home"
    android:widgetCategory="home_screen|keyguard">

    <!--
   android:minWidth : 最小宽度
   android:minHeight : 最小高度
   android:updatePeriodMillis : 更新widget的时间间隔(ms),"86400000"为1个小时
   android:previewImage : 预览图片
   android:initialLayout : 加载到桌面时对应的布局文件
   android:resizeMode : widget可以被拉伸的方向。horizontal表示可以水平拉伸,vertical表示可以竖直拉伸
   android:widgetCategory : widget可以被显示的位置。home_screen表示可以将widget添加到桌面,keyguard表示widget可以被添加到锁屏界面。
   android:initialKeyguardLayout : 加载到锁屏界面时对应的布局文件
    -->
</appwidget-provider>

AndroidManifest.xml 配置:

<receiver android:name=".widget.DesktopWidgetProvider" >
    <intent-filter >
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        <action android:name="com.worken.micro.widget.UPDATE_ALL" />
        <action android:name="com.worken.micro.widget.WEATHER" />
    </intent-filter>

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

小窗口DesktopWidgetProvider.class代码:

public class DesktopWidgetProvider extends AppWidgetProvider {

    // 每次删除该类型的窗口小部件(AppWidget)时都会触发 ,同时发送ACTION_APPWIDGET_DELETED广播,
    //     该广播可被onReceive()方法接受到.
    @Override
    public void onDeleted(Context context, int[] appWidgetIds) {
        super.onDeleted(context, appWidgetIds);
    }
    // 最后删除该类型的窗口小部件(AppWidget)时触发
    @Override
    public void onDisabled(Context context) {
        super.onDisabled(context);
        Intent startUpdateIntent = new Intent(context, UpdateWidgetService.class);
        context.startService(startUpdateIntent);
    }

    //第一次添加该类型的窗口小部件窗口小部件(AppWidget)时触发
    @Override
    public void onEnabled(Context context) {
        super.onEnabled(context);
        Intent startUpdateIntent = new Intent(context, UpdateWidgetService.class);
        context.startService(startUpdateIntent);
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        super.onReceive(context, intent);
        Intent startUpdateIntent = new Intent(context, UpdateWidgetService.class);
        context.startService(startUpdateIntent);
    }

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        super.onUpdate(context, appWidgetManager, appWidgetIds);
        RemoteViews remoteViews = UpdateWidgetService.updateWidgetView(context);
        int N = appWidgetIds.length;
        for(int i = 0 ; i < N ; i++){
            appWidgetManager.updateAppWidget(appWidgetIds[i], remoteViews);
        }
    }
}

小窗口数据刷新UpdateWidgetService.class代码:

public class UpdateWidgetService extends Service {

    private Timer timer;
    private TimerTask task;

    private static RemoteViews remoteViews = null ;

    public UpdateWidgetService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Override
    public void onCreate() {
        timer = new Timer();
        task = new TimerTask() {
            @Override
            public void run() {
                ComponentName componentName = new ComponentName(UpdateWidgetService.this, DesktopWidgetProvider.class);
                RemoteViews remoteViews = updateWidgetView(getApplicationContext());
                //由AppWidgetManager处理Wiget.
                AppWidgetManager awm = AppWidgetManager.getInstance(getApplicationContext());
                awm.updateAppWidget(componentName, remoteViews);
            }
        };
        timer.schedule(task, 0, 30 * 60 * 1000);
        super.onCreate();
    }

    public static RemoteViews updateWidgetView(Context context){
        NowWeather.showWeather();
        obtainRankData(context, null);
        if(remoteViews == null) {
            //初始化remoteView对象
            remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_home);
        }
        //设置相应属性
        setTimeAttributes(remoteViews);
        setWeather(remoteViews);
        setRankData(remoteViews);
        return remoteViews ;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        timer.cancel();
        task.cancel();
        timer = null;
        task = null;
    }

期待下次更新...

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页