什么是AppWidget?(桌面小部件)
如何编写一个桌面小部件?
1> 编写AppWidget的XML布局文件。
2> 编写AppWidget的元数据配置文件。(XML)
该配置文件中定义了AppWidget的基本信息。
XML的resource Type是AppWidget Provider,根标签是appwidget-provider
xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="250dp"
android:minHeight="40dp"
android:initialLayout="@layout/appwidget_main">
----------------------------------
宽高的计算公式
70*n-30
n 就是宽高的比 如果是4:1
宽就是70*4-30;
高就是70*1-30;
----------------------------------
3> 编写一个控制器类,继承自AppWidgetProvider。
AppWidgetProvider是四大组件之一。
在该类中控制AppWidget的所有动态操作。
AppWidget是BroadcastReceiver的子类。
4> 在清单文件中注册该AppWidgetProvider。
android:name="cn.tedu.android_day13_appwidget.MyAppWidget">
android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
android:resource="@xml/appwidget_meta"/>
AppWidget的生命周期
onEnabled
当第一次创建AppWidget实例时执行
onUpdate
每当创建AppWidget实例时 执行
当自动更新时长到达时,也会自动调用onUpdate方法
onDeleted
每当删除AppWidget实例时 执行
onDesabled
当第一次移除AppWidget实例时执行
AppWidget可以通过隐式意图 启动别人家的APP
-----------------------------------------------------------------------------------------------------
如何更新AppWidget中的界面?
1>获取AppWidgetManager对象。
2>构建remoteViews对象,并且调用remoteViews
对象的方法更新视图内容。
3>调用manager.updateAppWidget(remoteViews);
如何点击按钮,打开Activity?
1>获取AppWidgetManager.
2>构建remoteViews对象,并且调用remoteViews
对象的onClickPendingIntent方法,给按钮
添加点击意图,点击后启动Activity。
3>调用manager.updateAppWidget(remoteViews);
如何点击按钮,修改AppWidget的UI?
1>给按钮添加点击意图,当点击按钮时发送自定义
广播。
2>编写广播接收器,接收自定义广播。
3>在onReceive方法中执行后续业务。
---------------------------------------------------------------------
具体案例实现上面的要求:
1,编写layout 布局文件
<
RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="5dp"
android:text="@string/hello_world"
android:textSize="16sp" />
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/textView1" >
android:id="@+id/button1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Button1" />
android:id="@+id/button2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Button2" />
-------------------------------------------------------
2 ,
编写AppWidget的元数据配置文件。(XML)
android:minWidth="250dp"
android:minHeight="40dp"
android:initialLayout="@layout/appwidget_main">
-----------------------------------------------------------
3,
import java.util.Arrays;
import java.util.Random;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.util.Log;
import android.widget.RemoteViews;
/**
* AppWidget的控制器
*/
public class MyAppWidget extends AppWidgetProvider {
// AppWidget是BroadcastReceiver的子类。不用注册 重写onReceive()方法即可
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
String action = intent.getAction();
if (action.equals("BUTTON2_CLICKED")) {
// 用户点击了第二个按钮
//更新AppWidget上面的TextView
//1. AppWidgetManager
AppWidgetManager 将负责将视图发送到桌面显示出来,并将此widget记录到系统文件中
AppWidgetManager manager = AppWidgetManager.getInstance(context);
//2. RemoteViews 远程视图
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_main);
int[] colors = {Color.RED, Color.BLACK, Color.BLUE, Color.CYAN, Color.GREEN,Color.YELLOW};
int color = colors[new Random().nextInt(colors.length)];
views.setTextColor(R.id.textView1, color);
//3. manager.updateAppWidget
// ComponentName 组件名称
ComponentName name = new ComponentName(context, MyAppWidget.class);
manager.updateAppWidget(name, views);
}
}
/**
* 每当创建AppWidget实例时 执行 当自动更新时长到达时,也会自动调用onUpdate方法
*/
public void onUpdate(Context context, AppWidgetManager manager,
int[] appWidgetIds) {
Log.i("info", "onUpdate...." + Arrays.toString(appWidgetIds));
// 更新AppWidget的UI
// 构建RemoteViews
RemoteViews views = new RemoteViews(context.getPackageName(),
R.layout.appwidget_main);
// 调用views的方法 更新UI
views.setTextColor(R.id.textView1, Color.RED);
views.setTextViewText(R.id.textView1, "Hello Android.");
// 给button1添加点击意图 点击button1后
// 启动MainActivity
Intent i1 = new Intent(context, MainActivity.class);
PendingIntent pi1 = PendingIntent.getActivity(context, 0, i1,
PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.button1, pi1);
// 给button2添加点击意图 点击button2后
// 发送自定义的普通广播,在我们的应用
// 程序中编写广播接收器接收该广播。
Intent i2 = new Intent("BUTTON2_CLICKED");
PendingIntent pi2 = PendingIntent.getBroadcast(context, 0, i2,
PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.button2, pi2);
manager.updateAppWidget(appWidgetIds, views);
}
/**
* 每当删除AppWidget实例时 执行
*/
public void onDeleted(Context context, int[] appWidgetIds) {
Log.i("info", "onDeleted...." + Arrays.toString(appWidgetIds));
}
/**
* 当第一次创建AppWidget实例时执行
*/
public void onEnabled(Context context) {
Log.i("info", "onEnabled....");
}
/**
* 当最后一次移除AppWidget实例时执行
*/
public void onDisabled(Context context) {
Log.i("info", "onDisabled....");
}