[mobilesafe] 08_widget及其生命周期

Android 4.0

widget及其生命周期

widget的生命周期

widget步骤:
1、定义一个类实现AppWidgetProvider class implementation,
package cn.zengfansheng.widget;
import android.appwidget.AppWidgetProvider;
public class ExampleAppWidgetProvider extends AppWidgetProvider {
}
AppWidgetProvider 其实就是一个BroadCastReceiver
public class AppWidgetProvider extends BroadcastReceiver
2、然后在清单文件中配置,
<receiver android:name="ExampleAppWidgetProvider" >
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    </intent-filter>
    <meta-data
        android:name="android.appwidget.provider"
        android:resource="@xml/example_appwidget_info" />
</receiver>  
3、在/Widget/res/xml中创建example_appwidget_info.xml文件
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:initialLayout="@layout/activity_main"
    android:minHeight="40dp"
    android:minWidth="40dp"
    android:updatePeriodMillis="86400000" >
</appwidget-provider> 
4、然后在/res/layout/中创建activity_main.xml的布局文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="#ff0000" >
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="我是一个widget小装饰" />
</RelativeLayout>  
详细参数详解:
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    
    android:configure="com.example.android.ExampleAppWidgetConfigure" //指定一个Activity配置Widget
    android:initialKeyguardLayout="@layout/example_keyguard" //锁屏时出现的布局(如酷狗的上一首下一首)要手机支持才行
    android:initialLayout="@layout/example_appwidget" //widget显示的布局
    android:minHeight="40dp" //widget最小高度
    android:minWidth="40dp" //widget最小宽度
    android:previewImage="@drawable/preview" //widget的预览图片不写默认用应用程序图标
    android:resizeMode="horizontal|vertical" //widget是否支持缩放要android4.0以上才支持
    android:updatePeriodMillis="86400000" //widget更新的周期最小为半小时低于这个值都无效1800000
    android:widgetCategory="home_screen|keyguard" > //widget显示在home_screen,显示在keyguard(锁屏时),低版本不支持
</appwidget-provider>  
4、低版本长按桌面,高版本有个widgets选项卡,里面有该widget
widget生命周期
package cn.zengfansheng.widget;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
public class ExampleAppWidgetProvider extends AppWidgetProvider {

    @Override
    public void onReceive(Context context, Intent intent) {
        super.onReceive(context, intent);
        System.out.println("onReceive");
    }

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds) {
        super.onUpdate(context, appWidgetManager, appWidgetIds);
        System.out.println("onUpdate");
    }

    @Override
    public void onDeleted(Context context, int[] appWidgetIds) {
        super.onDeleted(context, appWidgetIds);
        System.out.println("onDeleted");
    }

    @Override
    public void onEnabled(Context context) {
        super.onEnabled(context);
        System.out.println("onEnabled");
    }

    @Override
    public void onDisabled(Context context) {
        super.onDisabled(context);
        System.out.println("onDisabled");
    }
}
widget生命周期结果和总结:
第一次创建widget
11-19 03:21:07.909: I/System.out(2251): onEnabled
11-19 03:21:07.909: I/System.out(2251): onReceive
11-19 03:21:07.909: I/System.out(2251): onUpdate
11-19 03:21:07.909: I/System.out(2251): onReceive
第二次创建widget
11-19 03:23:04.401: I/System.out(2251): onUpdate
11-19 03:23:04.401: I/System.out(2251): onReceive
第三次创建widget
11-19 03:23:32.361: I/System.out(2251): onUpdate
11-19 03:23:32.361: I/System.out(2251): onReceive
移除一个widget
11-19 03:24:07.662: I/System.out(2251): onDeleted
11-19 03:24:07.662: I/System.out(2251): onReceive
移除第二个widget
11-19 03:24:33.772: I/System.out(2251): onDeleted
11-19 03:24:33.772: I/System.out(2251): onReceive
移除最后一个widget
11-19 03:25:16.593: I/System.out(2251): onDeleted
11-19 03:25:16.593: I/System.out(2251): onReceive
11-19 03:25:16.593: I/System.out(2251): onDisabled
11-19 03:25:16.593: I/System.out(2251): onReceive

总结:
1、widget其实就是一个广播接收者,所有在任何情况下,创建/移除一个widget,因为是一个广播事件,都会执行onReceive()
2、当第一个widget被创建了,执行onEnabled()作用:初始化操作,数据库初始化,后台服务的初始化。
3、当最后一个widget被移除时,执行onDisabled()
作用:扫尾操作,擦屁股,删除临时文件,停止后台服务。
4、只要有新的widget被创建,就会执行onUpdate()方法
作用:更新界面

注意:
widget是显示在另外一个应用程序里面的,通常是桌面应用。

常见的市面上的桌面应用:
awt桌面,go桌面,360桌面,点心桌面,腾讯桌面,miui桌面
不同的桌面,实现的方式不一样,上面的4个方法调用的顺序也不一致,但方法的作用是一样的。
结果: