Widget---桌面小控件
使用步骤:
1.自定义AppWidgetProvider的子类,实现onReceive方法(该方法在桌面控件被创建的时候调用,我们在这里开始我们的逻辑处理)(其它方法如onUpdate根据需要实现)
2.定义Widget的布局文件,控制Widget的显示
3.定义元数据配置文件,配置文件中指定第2步中的Widget布局,指定Widget的大小,更新时间等
4.在AndroidManifest.xml声明我们的Widget,其实是一个receiver,关联第1步中的自定义类和第3步中元数据配置文件
代码示例:
第1步,自定义AppWidgetProvider的子类,我们在Widget创建的时候启动一个服务
public class MyAppWidgetProvider extends AppWidgetProvider{ //控件创建的时候调用(其它函数自行查阅官方文档) public void onReceive(Context context, Intent intent) { super.onReceive(context, intent); Intent mProcessServiceIntent = new Intent(context, ProcessService.class); context.startService(mProcessServiceIntent); } }
第2步,Widget布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout android:gravity="center_vertical" android:background="@drawable/widget_bg_portrait" android:layout_width="fill_parent" android:layout_height="wrap_content" xmlns:android="http://schemas.android.com/apk/res/android"> <LinearLayout android:gravity="center_vertical" android:orientation="vertical" android:background="@drawable/widget_bg_portrait_child" android:paddingTop="3.0dip" android:paddingBottom="3.0dip" android:layout_width="0.0dip" android:layout_height="fill_parent" android:layout_marginLeft="5.0dip" android:layout_weight="1.0"> <TextView android:text="正在运行的软件:8" android:textAppearance="@style/widget_text" android:id="@+id/process_count" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10.0dip" /> <ImageView android:background="@drawable/widget_bg_portrait_child_divider" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="1.0dip" android:layout_marginBottom="1.0dip" /> <TextView android:textAppearance="@style/widget_text" android:id="@+id/process_memory" android:text="可用内存:353MB" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10.0dip" /> </LinearLayout> <LinearLayout android:gravity="center_horizontal" android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content"> <LinearLayout android:gravity="center_vertical" android:layout_width="wrap_content" android:layout_height="wrap_content"> <ImageView android:layout_width="20.0dip" android:layout_height="20.0dip" android:src="@drawable/main_icon" /> <TextView android:textColor="@color/textColorPrimary" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/app_name" /> </LinearLayout> <Button android:textColor="@color/function_greenbutton_textcolor_selector" android:id="@+id/btn_clear" android:background="@drawable/function_greenbutton_selector" android:layout_width="90.0dip" android:layout_height="wrap_content" android:layout_marginTop="5.0dip" android:text="一键清理" android:layout_centerVertical="true" /> </LinearLayout> </LinearLayout>
第3步,元数据文件
<?xml version="1.0" encoding="utf-8"?> <appwidget-provider android:minWidth="294.0dip" android:minHeight="72.0dip" android:updatePeriodMillis="0" android:initialLayout="@layout/appwidget" xmlns:android="http://schemas.android.com/apk/res/android" />
第4步,清单文件中声明
<receiver android:name=".widget.MyAppWidgetProvider" > <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/appwidget_info" /> </receiver>
补充:
我们在创建Widget的逻辑代码中,启动了一个服务,在服务中定时执行刷新Widget显示
public class ProcessService extends Service { private AppWidgetManager appWidgetManager; public ProcessService() { } @Override public IBinder onBind(Intent intent) { // TODO: Return the communication channel to the service. throw new UnsupportedOperationException("Not yet implemented"); } @Override public void onCreate() { super.onCreate(); // AppWidgetManager // AppWidgetManager appWidgetManager = (AppWidgetManager) getSystemService(APPWIDGET_SERVICE); //获取到桌面小控件的对象 appWidgetManager = AppWidgetManager.getInstance(this); Timer timer = new Timer(); TimerTask timerTask = new TimerTask() { @Override public void run() { // LogUtils.i(ProcessService.this,"updateWidget"); //初始化桌面控件的名字 ComponentName componentName = new ComponentName(getApplicationContext(), MyAppWidgetProvider.class); //初始化一个远程的view 由于当前的桌面小控件并不在自己身上。是放到桌面上面在 RemoteViews views = new RemoteViews(getPackageName(), R.layout.appwidget); int processCount = SystemUtils.getProcessCount(getApplicationContext()); //修改R.id.process_count的显示 views.setTextViewText(R.id.process_count, "正在运行软件:"+processCount); long processAvailMem = SystemUtils.getProcessAvailMem(getApplicationContext()); views.setTextViewText(R.id.process_memory, "可用内存:" + Formatter. formatFileSize(getApplicationContext(),processAvailMem)); Intent intent = new Intent(); intent.setAction("aaa.bbb.ccc");//在另一个自定义广播中处理该逻辑 //延期意图 PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, 0); //设置button的点击事件(按钮点击后发送pendingIntent意图) views.setOnClickPendingIntent(R.id.btn_clear,pendingIntent); appWidgetManager.updateAppWidget(componentName, views); } }; //每隔5秒钟调用当前的这个类 timer.schedule(timerTask,0,5000); } @Override public void onDestroy() { super.onDestroy(); } }