关闭

Android-AppWidget

标签: androidAppWidget
344人阅读 评论(0) 收藏 举报
分类:

Android-AppWidget
一 AppWidget
1,界面小组件:模型
这里写图片描述

2,特点:
界面显示复杂,必须用到ViewGroup
事件不再单一
用到进程间通讯-不断的通讯和刷新

二 设计AppWidget的思路
1,Binder-service和AppWigetManager
2,序列化的复杂界面传输
3,刷新,使用广播

三 AppWidget主要使用的类和框架
与界面相关的两个类:
AppWidgetHost
AppWidgetHostView

AppWigetManager:用于AppWidget和Launcher之间的通讯
AppWigetService:发送广播消息
AppWidgetProvider:receiver类
AppWIdgetProviderInfo:组件信息类

Meta-Data介绍:
四大组件中与并列的属性
android:name
android:value
android:resource
manifest文件中注册

<receiver android:name=".MyAppWidget"> 
            <intent-filter >
                //定义的系统action
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/> 
            </intent-filter>
            <meta-data 
                android:name="android:appwidget.provider"
        //xml定义的provider
                android:resource="@xml/my_appwidget_provider"> 
            </meta-data>  
        </receiver>

在xml中的定义provider:
1,MinWidth,minHeight:
Widget是按照单元格划分的,每个单元格大小是74dp,每个widget嗨需要减去两边的1dp
所以你的真实的宽和高是:单元格的数量*74-2
另外,我们约定整个workspace:收集有4*4个单元格,平板有8*7个,
并且都有自动补齐机制

2,updatePeiodMillis:
更新频率,一般不推荐30分钟以上的事件更新一次,没有意义,也不推荐小于5分钟的,太耗电

3,initLayout:
初始化布局,就是小组件的布局文件

4,confingure:
设置添加AppWidget时候启动的设置Activity(过度的Activity),因为有些组件,点击后会进入Activity设置
一些属性

5,previewImage:
设置AppWidget添加后的预览图

四 AppWidgetProvider类的使用

package com.chengzhi.androidappwidget;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.widget.RemoteViews;


/**
appwidget类的实现

*/
public class MyAppWidget extends AppWidgetProvider
{


   //删除一个AppWidget的消息
    @Override
    public void onDeleted(Context context, int[] appWidgetIds)
    {
        // TODO Auto-generated method stub
        super.onDeleted(context, appWidgetIds);

    }

   //最后一个AppWidget被删除的消息
    @Override
    public void onDisabled(Context context)
    {
        // TODO Auto-generated method stub
        super.onDisabled(context);
    }

     //第一addAppWidget接收的消息
    @Override
    public void onEnabled(Context context)
    {
        // TODO Auto-generated method stub
        super.onEnabled(context);
    }

    //默认的消息接收重载
    @Override
    public void onReceive(Context context, Intent intent)
    {
        // TODO Auto-generated method stub
        super.onReceive(context, intent);
    }

    //到了时间间隔的时候接收到的消息,appwidgetreceiver发来的消息
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds)
    {
        // TODO Auto-generated method stub
        super.onUpdate(context, appWidgetManager, appWidgetIds);
        //更新所有的AppWidgetId的集合


        for (int i = 0; i < appWidgetIds.length; i++)
        {
            RemoteViews _remotView = new RemoteViews(context.getPackageName(), R.layout.my_appwidget_lauout);
            //改变组件名称
            _remotView.setTextViewText(R.id.imageButton, "chengzhi Button");
            //事件机制
            _remotView.setOnClickPendingIntent(R.id.imageButton, PendingIntent
                                               .getActivity(context, 0, new Intent(context, MainActivity.class), 0));

            appWidgetManager.updateAppWidget(appWidgetIds[i], _remotView);
        }


    }

}

注意:AppWidget-Updata
用到的类:
RemoteView远程视图的映射控制
RemoteViews _remotView = new RemoteViews(context.getPackageName(), R.layout.my_appwidget_lauout);

appWidgetManager管理类
appWidgetManager.updateAppWidget(appWidgetIds[i], _remotView);

两个重要的过程
update的实现机制:
1,Launcher 启动host listening
2,services send broadcast
3,应用程序接收到onUpdate
4,回传了RemoteView->Service
5,Service 改变Host,updateAppWidget
6,launcher监听到后呈现

init的过程就是添加小组件的过程,如下图UML:
图片UML
这里写图片描述

五 配置configuration Activity
注册Activity

<activity android:name=".MyAppWidgetConfigActivity">
            <intent-filter >
                <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE"/>
            </intent-filter> 
        </activity>  

在xml中加上配置信息

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider 
    xmlns:android="http://schemas.android.com/apk/res/android"  
    上面有属性的介绍
    android:minWidth="146dp"
    android:minHeight="72dp"
    android:updatePeriodMillis="3000"
    android:initialLayout="@layout/my_appwidget_lauout" android:configure="com.chengzhi.androidappwidget.MyAppWidgetActivity" 
    > 
</appwidget-provider> 

六 我在Widget要去触发我的app里面的事件
向自己的appsendMessage

总结面试题:
1 Widget实际上是什么?
HostView

2 Widget界面大小?
就是单元格的相关概念

3 meta-data?
meta-data就像其名一样,主要用来定义一些组件相关的配置值。
按照官方定义,metadata是一组供父组件使用的名值对(name-value pair),
因此相应的meta-data元素应该定义在相应的组件中。即如果想在activity中使用metadata,
那么meta-data必须定义在AndroidManifest.xml的activity声明中

name必须是android.appwidget.provider

4 appWidgetProvider实际上是什么类
BroadcastReceiver类

5 AppWidget是如何实现的?
manifest文件中注册receiver
定义Appwidget的布局文件和xml中的配置文件
实现继承AppWidget的类的on…等方法

6 如何让软件自动添加Shortcut到HomeScreen
在manifest文件中注册并且加上权限
注册

<activity android:name="com.chengzhi.shortcut.MyShortCutActivity">
            <intent-filter>
                <action android:name="android.intent.action.CREATE_SHORTCUT"/> 
            </intent-filter>  
        </activity>

权限

<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"></uses-permission>

7 补充
Binder在通讯中的作用:
server(stub app1应用程序)远程代理模式
client(app2,Launcher)
client->Binder->server
<- <-
Binder(Driver内核驱动,linux进程机制-内存共享)

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:146113次
    • 积分:3180
    • 等级:
    • 排名:第12239名
    • 原创:209篇
    • 转载:0篇
    • 译文:0篇
    • 评论:5条
    博客专栏
    最新评论