今天开发中用到了桌面小组件,可以说安卓中的小组件用起来是非常的方便和实用的,比如显示日期时间,手电筒,日历,天气预报这些小组件。
下面就告诉大家如何创建你的小组件!
1.首先你要创建一个类似广播一样的东西,这个类可以帮你监视你的组件。这里面什么逻辑都没有写,只是重写了一些重要的生命周期方法
public class WightProvider extends AppWidgetProvider
{
//每当组件从屏幕上移除
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
// TODO Auto-generated method stub
super.onDeleted(context, appWidgetIds);
}
//当最后一个该Widget删除是调用该方法,注意是最后一个
@Override
public void onDisabled(Context context) {
super.onDisabled(context);
}
// 当该Widget第一次添加到桌面是调用该方法,可添加多次但只第一次调用
@Override
public void onEnabled(Context context) {
super.onEnabled(context);
}
// 每接收一次广播消息就调用一次
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
super.onReceive(context, intent);
}
//每次更新都调用一次该方法
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
// TODO Auto-generated method stub
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
}
2.组件的监视器都有了,还没有组件?创建一个!
你还要在layout文件夹下创建一个wight.xml文件,用于显示组件里面的内容,这里我用的TextView简单的显示一下了
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView_show"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="我的桌面小组件" />
LinearLayout>
你还要配置这个小组件的一些属性信息,比如宽高,刷新时间等
这里我在res下创建了一个xml文件夹,在xml文件夹下创建了widget_config.xml,布局引用的是刚刚创建的widget.xml
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:initialLayout="@layout/wight"
android:minHeight="40dp"
android:minWidth="100dp"
android:updatePeriodMillis="40000" >
appwidget-provider>
3.创建完了广播和布局,接下来就需要显示了,显示的话就需要在清单文件中配置一下就完成了!
<receiver android:name="com.example.mydemo.WightProvider">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/wight_config" >
meta-data>
receiver>
你以为这就完事了吗?没错!当然可以显示,但是开发中的桌面小组件不会只显示一个文字或者一张图片,如果需要有更多的逻辑参与,多了一些判断或者请求网络等等复杂步骤怎么办?那就需要Service来帮忙~
这里创建一个Service来控制小组件内容的显示逻辑
/**
* 当组件被开启时候,就需要开启当前Service设置视图
* @author AdministratorLi
*
*/
public class TimerService extends Service
{
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
updateViews();
}
/**
* 设置显示视图
*/
private void updateViews() {
RemoteViews rv = new RemoteViews(getPackageName(),R.layout.wight);
rv.setTextViewText(R.id.textView_show, "具体的逻辑交给当前Service就好!");
AppWidgetManager manager = AppWidgetManager.getInstance(getApplicationContext());
ComponentName cn = new ComponentName(getApplicationContext(),WightProvider.class);
manager.updateAppWidget(cn, rv);
}
}
创建完就配置一下清单文件,这是我的习惯!
<service android:name="com.example.mydemo.TimerService">service>
这里只是创建了Service,你创建了没开启显然是没用的。还需要在组件添加到桌面的时候开启,那就需要修改WightProvider这个类,当onEnabled(添加到桌面)时开启服务,当onDisabled(移除到桌面)时,停止服务!
//当最后一个该Widget删除是调用该方法,注意是最后一个
@Override
public void onDisabled(Context context) {
context.stopService(new Intent(context,TimerService.class));
super.onDisabled(context);
}
// 当该Widget第一次添加到桌面是调用该方法,可添加多次但只第一次调用
@Override
public void onEnabled(Context context) {
context.startService(new Intent(context,TimerService.class));
super.onEnabled(context);
}
到这,你的桌面小组件就出来了!如果有什么疑问和建议,欢迎QQ骚扰:997797281!