利用widget实现一个时钟功能小插件
一般来说 widget 程序由以下部分组成:
a. AppWidgetProvider 的实现
b. widget外观布局定义文件
c. widget 参数配置文件
d.服务的实现
e.androidManifest.xml文件配置
a.写一个类继承AppWidgetProvider
public class TonyAppWidgetProvider extends AppWidgetProvider {
private final static String TAG = "TonyAppWidgetProvider";
/**
* 1:在xml文件中android:updatePeriodMillis="86400000"只能精确到分 不满足我们的要
*:2:当我们用户每添加一个appwidget就会调用一次
*/
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
Log.e(TAG, "onUpdate");
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
/**
* 在没有 appwidget 当用户初次添加appwidget的时候调用
* 1:做一些初始化的工作
* 2:打开数据库
* 3:启动服务
*
*/
public void onEnabled(Context context) {
super.onEnabled(context);
Log.e(TAG, "onEnabled");
Intent intent = new Intent(context, TonyAppWidgetService.class);
context.startService(intent);
}
/**
* 用户每删除一个appwidget就会调用一次
*/
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
Log.e(TAG, "onDeleted");
super.onDeleted(context, appWidgetIds);
}
/**
* 最后一个appwidget删除时调用
*/
@Override
public void onDisabled(Context context) {
super.onDisabled(context);
Log.e(TAG, "onDisabled");
}
}
=================================================================
b.widget外观布局定义文件,添加一个布局文件,文件取名为:tony_appwidget
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
android:id="@+id/tv_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/holo_red_light"
android:text="TextView" />
=========================================================================
c. widget 参数配置文件
建一个名为xml的文件夹,并且在此文件夹建一个.xml文件取名为tony_appwidget_info
android:minWidth="294dp"
android:minHeight="72dp"
android:previewImage="@mipmap/ic_launcher"
android:initialLayout="@layout/tony_appwidget"
android:resizeMode="horizontal|vertical">
android:minWidth="294dp" appwidget最小的宽度
android:minHeight="72dp" appwidget最小的高度
android:updatePeriodMillis="86400000" appwidget 更新的时间 不能精确到秒 一般最小的精度是分
问题:怎么控制更新的时间 ,代码中控制
android:previewImage="@drawable/ic_launcher" 预览图片
android:initialLayout="@layout/example_appwidget" 当我们添加一个appwidget时的布局
当我们添加一个appwidget自动启动的Activity的名字
android:configure="com.example.android.ExampleAppWidgetConfigure"
重置appwidget的大小时的模式:表示可以水平 垂直拉伸
android:resizeMode="horizontal|vertical">
-->
======================================================================================================
d.服务的实现
创建一个文件TonyAppWidgetService继承Service
public class TonyAppWidgetService extends Service {
private AppWidgetManager am;
//方式1:Handler + Runnable
private Handler handler=new Handler();
private Runnable runnable=new Runnable() {
@Override
public void run() {
//获取系统的时间,并更新appwidget视图
//RemoteView :不是当前应用的视图 属于其他的应用程序
RemoteViews remoteViews=new RemoteViews(getPackageName(),R.layout.tony_appwidget);
//获取当前时间
String time=new Date().toLocaleString();
//设置显示
remoteViews.setTextViewText(R.id.tv_time,time);
//随机改变字体的颜色
Random rd = new Random();
remoteViews.setTextColor(R.id.tv_time, Color.rgb(255, 255, rd.nextInt(256)));
ComponentName componentName=new ComponentName(getApplicationContext(),TonyAppWidgetProvider.class);
am.updateAppWidget(componentName,remoteViews);
//点击 发送一个意图 PendingIntent 延迟意图
Intent intent = new Intent(getApplicationContext(), MyNote.class);
PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 100, intent, 0);
remoteViews.setOnClickPendingIntent(R.id.tv_time, pendingIntent);
handler.postDelayed(runnable,1000);
}
};
public IBinder onBind(Intent intent) {
return null;
}
public int onStartCommand(Intent intent, int flags, int startId) {
am = AppWidgetManager.getInstance(this);
handler.post(runnable);
//启动定时器
return super.onStartCommand(intent, flags, startId);
}
}
=======================================================================================================
e.配置androidManifest.xml文件
android:name="android.appwidget.provider"
android:resource="@xml/tony_appwidget_info" />