安卓学习笔记之使用widget桌面小控件

安卓学习笔记之使用widget桌面小控件

使用步骤

创建所需要的Receiver,并在清单文件中配置

 <!-- 桌面小部件 -->
        <receiver android:name="com.yu.receiver.SaferAppWidgetProvider" >
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>

            <meta-data  android:name="android.appwidget.provider" android:resource="@xml/safer_appwidget_info" />
        </receiver>
package com.yu.receiver;

import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;

import com.yu.service.KillProcesWidgetService;

public class SaferAppWidgetProvider extends AppWidgetProvider {

    /** * 在每次操作的结束被调用 */
    @Override
    public void onReceive(Context context, Intent intent) {
        super.onReceive(context, intent);
    }

    /** * 只要有新的桌面小控件创建时就会调用 */
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds) {
        super.onUpdate(context, appWidgetManager, appWidgetIds);
        // 开启更新小部件的服务
        context.startService(new Intent(context,KillProcesWidgetService.class));
    }

    /** * 每次删除桌面小控件时调用 */
    @Override
    public void onDeleted(Context context, int[] appWidgetIds) {
        super.onDeleted(context, appWidgetIds);

    }

    /** * 第一次创建小控件时才会调用 */
    @Override
    public void onEnabled(Context context) {
        super.onEnabled(context);
    }

    /** * 当所有的桌面小控件都删除后调用 */
    @Override
    public void onDisabled(Context context) {
        super.onDisabled(context);
        // 关闭更新小部件的服务
        context.startService(new Intent(context,KillProcesWidgetService.class));
    }
    /** * Called in response to the AppWidgetManager.ACTION_APPWIDGET_RESTORED broadcast * when instances of this AppWidget provider have been restored from backup */
    @Override
    public void onRestored(Context context, int[] oldWidgetIds,
            int[] newWidgetIds) {
        super.onRestored(context, oldWidgetIds, newWidgetIds);
    }

}

在src的xml文件下创建safer_appwidget_info.xml,用以配置widget

<?xml version="1.0" encoding="utf-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:initialLayout="@layout/widget_process_safer" android:minHeight="75.0dip" <!-minHeight不宜过大,否则widget无法显示--> android:minWidth="294.0dip" android:updatePeriodMillis="0" /><!-设置为0,手动处理更新时间--> 

在layout目录下创建widget的布局文件widget_process_safer

<?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="wrap_content" android:background="@drawable/widget_bg_portrait" android:orientation="horizontal" >

    <LinearLayout  android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/widget_bg_portrait_child" android:gravity="center" android:orientation="vertical" >
        <TextView  android:id="@+id/tv_count_widget" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="运行的程序" />
        <TextView  android:id="@+id/tv_freeMem_widget" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="6dp" android:text="可用内存" />
    </LinearLayout>

    <LinearLayout  android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="center" android:padding="5dp" android:orientation="vertical" >
        <TextView  android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="安全卫士" />
        <Button  android:id="@+id/bt_clean" style="?android:attr/buttonStyleSmall" android:layout_width="wrap_content" android:layout_height="match_parent" android:background="@drawable/bt_selector" android:layout_marginTop="6dp" android:paddingLeft="3dp" android:paddingRight="3dp" android:textColor="#000" android:text="一键清理" />
    </LinearLayout>
</LinearLayout>

配置完成,开始使用widget。新建一个服务,用于更新widget

1、 通过AppWidgetManger的getInstance方法获得widget管理器
2、 实例化Timer对象,并用TimerTask创建一个线程,通过timer的schedule方法开启一个定时任务
3、在TimerTask的run方法中创建widget所需的RemoteViews,并设置相应的控件内容和事件监听
4、创建Component组件,将RemoteViews和ComponentName 设置给widget,并更新widget

package com.yu.service;

import java.util.Timer;
import java.util.TimerTask;

import com.yu.receiver.SaferAppWidgetProvider;
import com.yu.safer.R;
import com.yu.utils.SystemInfoUtils;

import android.app.PendingIntent;
import android.app.Service;
import android.appwidget.AppWidgetManager;
import android.content.ComponentName;
import android.content.Intent;
import android.os.IBinder;
import android.text.format.Formatter;
import android.widget.RemoteViews;

/** * 进程清理小控件 * @author Administrator * */
public class KillProcesWidgetService extends Service {
    AppWidgetManager awm;
    ComponentName appWidgetProvider;
    Timer timer;
    TimerTask task;
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        // 获得widget管理者
        awm = AppWidgetManager.getInstance(this);

        // 开启定时任务 每隔5秒更新widget
        timer = new Timer();
        task = new TimerTask() {

            @Override
            public void run() {
                // 初始化一个远程的view(RemoteViews)
                RemoteViews views = new RemoteViews(getPackageName(), R.layout.widget_process_safer);

                // 获取正在运行的进程数
                int count = SystemInfoUtils.getRunningAppCount(KillProcesWidgetService.this);
                // 获取可用的内存大小
                String freeMem = Formatter.formatFileSize(KillProcesWidgetService.this,
                        SystemInfoUtils.getFreeMemoryInfo(KillProcesWidgetService.this));

                // 设置views内容
                views.setTextViewText(R.id.tv_count_widget, "运行的程序:"+count+"个");
                views.setTextViewText(R.id.tv_freeMem_widget, "可用内存:"+freeMem);

                Intent i = new Intent();
                //设置一个隐式意图
                i.setAction("com.yu.safer.widget");
                // 通过PendingIntent 开启一个广播 用于清理进程
                PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, i, 0);
                // 设置点击事件
                views.setOnClickPendingIntent(R.id.bt_clean, pendingIntent );

                appWidgetProvider = new ComponentName(getApplicationContext(), SaferAppWidgetProvider.class);
                awm.updateAppWidget(appWidgetProvider, views);

            }
        };
        timer.schedule(task, 1000, 5000);
        return super.onStartCommand(intent, flags, startId);
    }

}

你可能感兴趣的:(android,widget)