夜深模拟器怎么设置添加widget

1.概述widget宿主端进程(比如Launcher) :AppWidgetService AppWidgetManager& AppWidgetHostView&& AppWidgetHost&widget进程:RmoteViews& AppWidgetProviderInfo & AppWidgetProvider(extends BroadcastReceiver)2.相关类介绍2.1.AppWidgetService. 这是widget framework的核心类,是系统service之一,它承担着所有widget的管理工作。Widget安装,删除,更新等等都需要经过AppWidgetService.它是开机就启动的.在开机过程中,java层进程 Server启动后(这个进程管理着所有的系统service, 例如activity manager service,
manager service, power manager service等),会创建AppWdigetService的实例,并调用它的SystemReady()方法,在这个方法里,它做了三件事: 1)遍历所有的安装包,找到符合条件ACTION=ACTION_APPWIDGET_和&meta-data :name=&.appwidget.provider&/&的intent receiver,解析相关信息,保存到本地数据成员中。2)读取本地文件数据:/data/system/appwidgets.xml,所有已安装到的widget的信息都保存在这个文件里。读出来,也保存到本地数据成员里。3)注册了三个消息:ACTION_BOOT_COMPLETED(系统启动到桌面就会发送此消息),ACTION__ADDED(有新APK包安装到系统),ACTION_PACKAGE_REMOVED(有APK包被删除)。当系统启动到桌面后,AppWidgetService接收到了ACTION_BOOT_COMPLETED消息,它会去检查本地数据成员,如果有已经安装到桌面的widget,它会上发ACTION_APPWIDGET_ENABLED和ACTION_APPWIDGET_UPDATE消息。如果有widget设置了updatePeriodMillis的属性,它就会开始计时(这个是通过AlarmManager来实现的),到时间时,就会再次上发ACTION_APPWIDGET_UPDATE消息。2.2AppWidgetManager& 是AppWidgetService的客户端代理,是标准的AIDL通讯。IAppWidgetService.java &2.3.RemoteViews并不是一个真正的View,它没有实现View的,而只是一个用于描述View的实体。比如:创建View需要的资源ID和各个控件的事件响应方法。RemoteViews会通过进程间通信机制传递给AppWidgetHost。2.4.AppWidgetHostView是真正的View,但它只是一个容器,用来容纳实际的AppWidget的View。这个AppWidget的View是根据RemoteViews的描述来创建。这是在updateAppWidget里做的:remoteViews.apply创建了实际的View2.5.AppWidgetHost是真正容纳AppWidget的地方,它的主要功能有两个:o 监听来自AppWidgetService的事件:o 另外一个功能就是创建AppWidgetHostView。3.在自己的中添加appWidget如何创建一个AppWidget网上有大量的资料和,我这里就不赘述了。下面来看看如何在自己的程序中添加appWidget(仿Launcher)一共有三个 LauncherAppWidgetHostView扩展了AppWidgetHostView,实现了对长按事件的处理。public class LauncherAppWidgetHostView extends AppWidgetHostView {
private LayoutInflater mI
private Context mC
private int mPreviousO
public LauncherAppWidgetHostView(Context context) {
super(context);
mContext =
mLongPressHelper = new CheckLongPressHelper(this);
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
protected View getErrorView() {
return mInflater.inflate(R.layout.appwidget_error, this, false);
public void updateAppWidget(RemoteViews remoteViews) {
mPreviousOrientation = mContext.getResources().getConfiguration().
super.updateAppWidget(remoteViews);
public boolean orientationChangedSincedInflation() {
int orientation = mContext.getResources().getConfiguration().
if (mPreviousOrientation != orientation) {
public boolean class="java">public class LauncherAppWidgetHost extends AppWidgetHost {
public LauncherAppWidgetHost(Context context, int hostId) {
super(context, hostId);
protected AppWidgetHostView class="java">public class HelloActivity extends Activity {
private ArrayList&AppWidgetProviderInfo& mWidgets = new ArrayList&AppWidgetProviderInfo&();
private LauncherAppWidgetHost mAppWidgetH
private PackageManager mPackageM
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Get the list of widgets
updatePackages();
mPackageManager = this.getPackageManager();
mAppWidgetHost = new LauncherAppWidgetHost(this, 1001);
//startListening AppWidgetChanged
mAppWidgetHost.startListening();
int appWidgetId = mAppWidgetHost.allocateAppWidgetId();
final AppWidgetProviderInfo widgetInfo = mWidgets.get(4);
//获取RemoteView描述的对应的View
LauncherAppWidgetHostView hostView = (LauncherAppWidgetHostView) mAppWidgetHost.createView(
this, appWidgetId, widgetInfo);
final LinearLayout layout2 = new LinearLayout(this);
layout2.setOrientation(LinearLayout.VERTICAL);
layout2.addView(hostView);
setContentView(layout2);
// 取自 AppsCustomizePagedView
public void updatePackages() {
mWidgets.clear();
List&AppWidgetProviderInfo& widgets =
AppWidgetManager.getInstance(this).getInstalledProviders();
// Intent shortcutsIntent = new Intent(Intent.ACTION_CREATE_SHORTCUT);
// List&ResolveInfo& shortcuts =
// mPackageManager.queryIntentActivities(shortcutsIntent, 0);
(AppWidgetProviderInfo widget : widgets) {
if (widget.minWidth & 0 && widget.minHeight & 0) {
Log.d(&yzy&, widget.label);
mWidgets.add(widget);
// mWidgets.addAll(shortcuts);3654人阅读
Android(14)
Android系统提供了一个Widget机制,可以让信息直接在主屏中显示,这样对于一些经常访问的信息不需要打开应用程序即可获取到,方便了用户。iOS5也抄袭了这种方式。Android系统的Widget可以在配置文件中通过updatePeriodMillis属性来控制该Widget数据的更新周期,时间到后系统会发送一个更新请求告诉该Widget需要更新数据了。
但是出于节约用户电量的考虑,Android系统默认最小更新周期是30分钟,也就是说:如果您的程序需要实时更新数据,设置这个更新周期是2秒,那么您的程序是不会每隔两秒就收到更新通知的,而是要等到30分钟以上才可以。
为了处理这种情况,可以把updatePeriodMillis这个值设置为0。这样的话,Android系统就不会触发更新通知,而是有应用程序自己来处理更新逻辑。
但是如果网络数据频繁更新,既浪费用户网络流量也耗费用户设备电池使用时间。如何才能做到按需更新呢?
由于Widget是在一个RemoteViews中显示的,而目前无法判断该Widget是否对用户可见。因此目前只能通过如下两个方法来实现按需更新:
判断当前用户是否在操作Launcher(Android系统的主屏),如果是且该主屏上添加有该Widget则更新数据;
判断是否有有效数据需要更新,如果没有则停止更新,使用缓存数据。 这个典型情况就是股市行情软件,股市在交易时间内每秒钟都有变化,而在闭市后是没有变化的。 所以在闭市情况下就无需频繁更新数据了。 这种情况和具体的业务逻辑有关系, 就不再详细讨论了。
由于Android系统是一个开放的平台,用户可以安装多个Launcher程序,然后在每个Launcher中都添加上您的Widget。 所以就要尽量做到 当用户在使用哪个Launcher的时候就只更新该Launcher中的Widget即可。
在Widget添加到主屏后,会调用如下函数来更新Widget内容:
android.appwidget.AppWidgetProvider.onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
而一般而言,用户在添加Widget时,都是在需要显示Widget的那个程序中操作, 所以可以在上面的函数中,获取当前用户正在操作的程序的包名称。获取当前正在运行的程序包名称的代码如下:
currentRunningPackageName = ((ActivityManager.RunningTaskInfo)
((ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE)).
getRunningTasks(1).get(0)).baseActivity.getPackageName();
同时 在onUpdate函数中还包含了刚添加的Widget ID:appWidgetIds
对于添加Widget操作来说,该ID数组的长度应该为1.
然后把这Widget ID和获取到的该Widget添加到的程序的包名保存起来,也就是记录下在哪个主屏(程序)中添加了哪个Widget(通过ID来标示)。
这里需要注意的是:需要判断该ID是否已经存在,如果已经保存过了, 说明不是刚刚添加的Widget,而是一个已经存在的Widget,这个时候按照正常流程更新数据。
有了上面保存的每个Widget(通过ID标示)添加到哪个主屏中的信息,然后即可以根据当前运行的程序包名来更新对应的Widget了。 如果用户安装了新的主屏程序,但是没有在该主屏程序中添加Widget,经过上面的判断,就可以不用更新数据了。
这样就可以做到尽可能的按需更新数据了。 最大限度的节约用户的网络流量和设备电池寿命。
原文转载自 云在千峰:&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:63565次
排名:千里之外
原创:15篇
转载:41篇
(2)(4)(4)(2)(43)(1)为什么我的安卓模拟器长按没出来AppWidget
[问题点数:40分]
为什么我的安卓模拟器长按没出来AppWidget
[问题点数:40分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。Android中AppWidget加载流程(2) - Android当前位置:& &&&Android中AppWidget加载流程(2)Android中AppWidget加载流程(2)&&网友分享于:&&浏览:15次Android中AppWidget加载流程(二)
1. 用户长按Launcher弹出添快捷组件的Dialog,选择添加AppWidget,这时会打开一个Activity(AppWidgetPickActivity)显示系统中全部
AppWidget,单击某一个AppWidget后会做以下操作:
(1) 通过AppWidgetService获取一个最新的appWidgetId值。
(2) 根据获取的appWidgetId值,向单击的AppWidget组件发出APPWIDGET_ENABLED和APPWIDGET_UPDATE更新广播。并向
/data/system/appwidgets.xml中添加此AppWidget的基本信息。
2. 启动AppWidgetPickActivity(第1步中提到)时使用的是startActivityForResult()方法,所以在向所单击的AppWidget组件发出
APPWIDGET_ENABLED和APPWIDGET_UPDATE更新广播后会执行onActivityResult()方法,做以下准备工作:
(1) 将需要被添加到Launcher的AppWidget基本信息保存到数据库中。
(2) 根据查找到的appWidgetId值(整型值)创建LauncherAppWidgetHostView布局对象。
(3) 根据查找到的appWidgetId值(整型值)从AppWidgetService中获取RemoteViews对象(因为是第一次启动所以RemoteViews对象
(4) 将获取到的RemoteViews对象的布局解析并设置到第(2)步中创建的LauncherAppWidgetHostView布局对象中。
(5) 将LauncherAppWidgetHostView布局对象添加到Launcher的WorkSpace中(因为RemoteViews对象为空,所以只在Launcher的
WorkSpace中占了一个位置)。
3. 在第1步中已经向需要添加到Launcher中的AppWidget发出了更新消息(注意:第一步和第二步是异步执行的),继续做以下事情:
(1) 每个AppWidget接收到广播后都会调用onEnabled()方法和onUpdate()方法,在onEnabled()方法中进行一些初始化操作,在
onUpdate()方法中创建RemoteViews布局对象并通过AppWidgetManager的updateAppWidget(int appWidgetId, RemoteViews
remoteViews)方法通知AppWidgetService对象用RemoteViews对象更新appWidgetId所对应的AppWidget.
(2) AppWidgetService接收到了appWidgetId和RemoteViews后,通过appWidgetId查找已经被添加到Launcher的
LauncherAppWidgetHostView布局对象,并将RemoteViews中的布局更新到LauncherAppWidgetHostView布局对象中。
AppWidget显示在Launcher中。
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有}

我要回帖

更多关于 夜深模拟器怎么用 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信