android桌面小组件(时钟)--widget初体验
App Widget是应用程序窗口小部件(Widget)是微型的应用程序视图,它可以被嵌入到其它应用程序中(比如桌面)并接收周期性的更新。你可以通过一个App Widget Provider来发布一个Widget。
(1).创建一个新的工程
(2).创建窗口部件的布局layout.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:background="#ccc"
android:layout_height="match_parent">
<TextView
android:id="@+id/id_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/white"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true" />
</RelativeLayout>
(3).编辑WidgetProvider对应的资源文件widgetconfig.xml(文件夹:res/xml/widgetconfig.xml)
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:initialLayout="@layout/layout"
android:minHeight="35dp"
android:minWidth="120dp"
android:updatePeriodMillis="8640000">
</appwidget-provider>
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 : 加载到锁屏界面时对应的布局文件
(4).创建WidgetProvider类继承AppWidgetProvider
package com.czz.widgetdemo;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
/**
* Created by czz on 2016/3/30.
*/
public class WidgetProvider extends AppWidgetProvider {
private Intent mTimerIntent = null;
// 当 widget 更新时被执行。
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
// 当 widget 被删除时被触发。
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
super.onDeleted(context, appWidgetIds);
}
// 当第1个 widget 的实例被创建时触发。
@Override
public void onEnabled(Context context) {
super.onEnabled(context);
if (null == mTimerIntent){
mTimerIntent = new Intent(context,TimerService.class);
context.startService(mTimerIntent);
}
}
// 当最后1个 widget 的实例被删除时触发。
@Override
public void onDisabled(Context context) {
super.onDisabled(context);
if (null != mTimerIntent){
context.stopService(mTimerIntent);
mTimerIntent = null;
}
}
// 接收到任意广播时触发,并且会在上述的方法之前被调用。
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
}
}
(5).创建TimerService服务
public class TimerService extends Service {
private Timer mTimer;
private SimpleDateFormat mFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
public TimerService() {
}
@Override
public IBinder onBind(Intent intent) {
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public void onCreate() {
super.onCreate();
mTimer = new Timer();
mTimer.schedule(new TimerTask() {
@Override
public void run() {
upTimeView();
}
},0,1000);
}
private void upTimeView(){
String time = mFormat.format(new Date());
RemoteViews rvs = new RemoteViews(getPackageName(),R.layout.layout);
rvs.setTextViewText(R.id.id_time,time);
AppWidgetManager manager = AppWidgetManager.getInstance(getApplicationContext());
ComponentName cn = new ComponentName(getApplicationContext(),WidgetProvider.class);
manager.updateAppWidget(cn,rvs);
}
@Override
public void onDestroy() {
super.onDestroy();
mTimer = null;
}
}
(6).配置AndroidManifest.xml清单文件
1.android.appwidget.action.APPWIDGET_UPDATE,必须要显示声明的action!因为所有的widget的广播都是通过它来发送的;要接收widget的添加、删除等广播,就必须包含它。
2.android:name -- 指定metadata名,通过android.appwidget.provider来辨别data。
android:resource -- 指定 AppWidgetProviderInfo 对应的资源路径。即,@xml/widgetconfig。
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".WidgetProvider">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widgetconfig" />
</receiver>
<service android:name=".TimerService"></service>
</application>