• android AppWidget的使用以及利用TimerTask实现widget的定时更新


    第一步:首先是Widget的定义声明:

    在资源文件下的xml目录中建立文件example_appwidget_info.xml:

    <?xml version="1.0" encoding="utf-8"?

    > <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:initialLayout="@layout/process_widget" android:minHeight="72.0dip" android:minWidth="294.0dip" android:updatePeriodMillis="0" />


    第二步:编写MyWidget类实现AppWidgetProvider

    package cn.itcast.testwidget;
    
    import cn.itcast.mobilesafe.service.UpdateWidgetService;
    import android.appwidget.AppWidgetManager;
    import android.appwidget.AppWidgetProvider;
    import android.content.Context;
    import android.content.Intent;
    
    /**
     * 依据配置文件 每隔固定的时间 更新一下界面 最小值 半个小时 1800000毫秒 onRecevie - > onUpdate 注意
     * widget这个组件不是现实在我们的应用程序里面 显示在桌面的应用程序 不同的桌面 他们的widget的创建和销毁相应的 回调的事件可能会有不能
     * android luncher / htc sence / 米ui / 360桌面/awt /qq桌面/....
     */
    public class MyWidget extends AppWidgetProvider {   //AppWidgetProvider继承自BroadcastReceiver
    
    	@Override
    	public void onReceive(Context context, Intent intent) {
    		// TODO Auto-generated method stub
    		super.onReceive(context, intent);
    		System.out.println("onReceive");
    	}
    
    	@Override
    	public void onUpdate(Context context, AppWidgetManager appWidgetManager,
    			int[] appWidgetIds) {
    		System.out.println("onUpdate");
    		super.onUpdate(context, appWidgetManager, appWidgetIds);
    	}
    
    	@Override
    	public void onDeleted(Context context, int[] appWidgetIds) {
    		super.onDeleted(context, appWidgetIds);
    		// 当某一个widget被删除的时候 会运行ondelete方法
    		intent = new Intent(context, UpdateWidgetService.class);
    		context.stopService(intent);
    	}
    
    	@Override
    	public void onEnabled(Context context) {
    		super.onEnabled(context);
    		// widget第一次创建的时候 运行的方法
    		// 初始化widget数据的操作,开启后台服务等
    		intent = new Intent(context, UpdateWidgetService.class);
    		context.startService(intent);
    	}
    
    	@Override
    	public void onDisabled(Context context) {
    		super.onDisabled(context);
    		System.out.println("onDisabled");
    		// 当全部的widget都被删除的时候 运行 ondisable()。
    		// 停止我们开启的服务
    		// 删除垃圾文件 暂时文件
    	}
    }
    第三步:在清单文件里注冊activity:

    <receiver android:name="MyWidget" >
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        </intent-filter>
    
        <meta-data
            android:name="android.appwidget.provider"
            android:resource="@xml/example_appwidget_info" />
    </receiver>

    第四部:为Widget建立视图资源文件:

    以下为金山手机卫士所相应的Widget视图,仅供參考:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:src="@drawable/widget_bg_portrait" >
    
        <LinearLayout
            android:id="@+id/pw_ll"
            android:layout_width="0.0dip"
            android:layout_height="fill_parent"
            android:layout_marginLeft="5.0dip"
            android:layout_weight="1.0"
            android:background="@drawable/widget_bg_portrait_child"
            android:gravity="center_vertical"
            android:orientation="vertical"
            android:paddingBottom="3.0dip"
            android:paddingTop="3.0dip" >
    
            <TextView
                android:id="@+id/process_count"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10.0dip" />
    
            <ImageView
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="1.0dip"
                android:layout_marginTop="1.0dip"
                android:background="@drawable/widget_bg_portrait_child_divider" />
    
            <TextView
                android:id="@+id/process_memory"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10.0dip" />
        </LinearLayout>
    
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:orientation="vertical" >
    
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center_vertical" >
    
                <ImageView
                    android:layout_width="20.0dip"
                    android:layout_height="20.0dip"
                    android:background="@drawable/notification" />
    
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="@string/app_name" />
            </LinearLayout>
    
            <Button
                android:id="@+id/btn_clear"
                android:layout_width="90.0dip"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_marginTop="5.0dip"
                android:background="@drawable/button_background_selected"
                android:text="一键清理" />
        </LinearLayout>
    
    </LinearLayout>
    效果:

    第五部:利用UpdateWidgetService服务定期更新视图:

    package cn.itcast.mobilesafe.service;
    
    import java.util.Timer;
    import java.util.TimerTask;
    
    import cn.itcast.mobilesafe.R;
    import cn.itcast.mobilesafe.receiver.LockScreenReceiver;
    import cn.itcast.mobilesafe.ui.TaskManagerActivity;
    import cn.itcast.mobilesafe.util.TaskUtil;
    
    import android.app.PendingIntent;
    import android.app.Service;
    import android.appwidget.AppWidgetManager;
    import android.content.ComponentName;
    import android.content.Intent;
    import android.graphics.Color;
    import android.os.IBinder;
    import android.widget.RemoteViews;
    
    public class UpdateWidgetService extends Service {
    	private Timer timer;
    	private TimerTask task;
    	private AppWidgetManager widgetmanager;
    
    	@Override
    	public IBinder onBind(Intent intent) {
    		return null;
    	}
    
    	@Override
    	public void onCreate() {
    		timer = new Timer();
    		widgetmanager = AppWidgetManager.getInstance(getApplicationContext());
    		task = new TimerTask() {
    			@Override
    			public void run() {
    				// 更新widget的界面
    				ComponentName name = new ComponentName("cn.itcast.mobilesafe",
    						"cn.itcast.mobilesafe.receiver.ProcessWidget");// 获取前面參数包下的后參数的Widget
    				RemoteViews views = new RemoteViews("cn.itcast.mobilesafe",
    						R.layout.process_widget);// 获取Widget的布局
    				views.setTextViewText(R.id.process_count, "XXXX");//给process_count设置文本
    				views.setTextColor(R.id.process_count, Color.RED);//给process_count设置文本颜色
    				views.setTextViewText(R.id.process_memory, "XXXX");
    				views.setTextColor(R.id.process_memory, Color.RED);
    				Intent intent = new Intent(UpdateWidgetService.this, XXXX.class);
    				PendingIntent pendingIntent = PendingIntent.getBroadcast(
    						getApplicationContext(), 0, intent, 0);
    				views.setOnClickPendingIntent(R.id.btn_clear, pendingIntent);// 给布局文件里的btn_clear设置点击事件
    				widgetmanager.updateAppWidget(name, views);//更新Widget
    			}
    		};
    		timer.scheduleAtFixedRate(task, 1000, 2000);//延迟一秒      更新频率2秒
    		super.onCreate();
    	}
    
    	@Override
    	public void onDestroy() {
    		timer.cancel();
    		timer = null;
    		task = null;
    		super.onDestroy();
    	}
    }
  • 相关阅读:
    Httpclient5工具类
    temp
    《On Java 8》笔记 2
    《On Java 8》笔记
    《Effective Java》笔记 4~5
    Oracle数据库对比MySQL
    《Effective Java》笔记
    [BUAA2021软工]结对第一阶段博客作业小结
    Spring Boot入门
    MyBatis入门
  • 原文地址:https://www.cnblogs.com/llguanli/p/8452677.html
Copyright © 2020-2023  润新知