Android中的AppWidget

什么是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....");
}

你可能感兴趣的:(android,通信类)