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进程机制-内存共享)
版权声明:欢迎交流,QQ872785786
原文地址:http://blog.csdn.net/qq_22075977/article/details/46779075