- 浏览: 622947 次
文章分类
最新评论
-
q781253433:
qin ~.求demo看看~
Android之Widget -
zhongyuanceshi:
博主,没看到你的例子的Demo,共享下
Android之Widget
Android之Widget
1 Android widget
2 AppWidget Framework
实际是写一个事件监听类即一个BroadcastReceiver子类,当然框架已经提供了一个辅助类AppWidgetProvider,实现的类只要实现其方法即可,其中必须实现的方法是onUpdate ,其实就是一个定时事件,widget监听此事件
另外就是规划好视图(layout),将此widget打包安装。
2. 当android系统启动时,AppWidgetService 就将负责检查所有的安装包,将检查
AndroidManifest.xml(不要告诉我不知道,如果不知道可要看看基本开发知识了)
文件中有<metadata android:name="android.appwidget.provider" android:resource="@xml/appwidget_info" />
信息的程序包记录下来
4. AppWidgetService将根据widget配置中的updatePeriodMillis属性来定时发送 ACTION_APPWIDGET_UPDATE事件,此事件将激活widget的事件监听方法onUpdate,此方法将通过 AppWidgetManager完成widget内容的更新和其他操作。
3 AppWidgetHost
Host的实现者
4 AppWidgetHostView
AppWidgetHostView是真正的View,但它只是一个容器,用来容纳实际的AppWidget的View。这个AppWidget的View是根据RemoteViews的描述来创建。
5 AppWidgetProvider
AppWidgetProvider是AppWidget提供者需要实现的接口,它实际上是一个BroadcastReceiver。只不过子类要实现的不再是onReceive,而是转换成了几个新的函数:
2 public void onDeleted(Context context, int [] appWidgetIds)
3 public void onEnabled(Context context)
4 public void onDisabled(Context context)
这几个函数用来响应AppWidgetService发出的相应的广播消息。
AppWidgetProvider的实现者
o 调用AppWidgetManager的updateAppWidget去更新widget.
6 RemoteViews
1 AppWidgetProviderInfo
2 AppWidgetProvider
AppWidgetProvider是BroadcastReceiver的子类,这个类处理App
Widget广播。AppWidgetProvider只接收于App Widget有关系的广播,比如App Widget在updated,
deleted, enabled, and disabled。当这些广播发生的时候,AppWidgetProvider会调用一下回调方法:
onUpdate(Context, AppWidgetManager, int[])
间隔调用此方法去更新App
Widget,间隔时间的设置是在AppWidgetProviderInfo下的updatePeriodMillis属性,同样当用户添加App
Widget的时候也被调用。如果你已经声明了一个configuration Activity,用户添加App
Widget的时候就不会调用onUpdate,但是在随后的更新中依然会被调用。
onDeleted(Context, int[])
当App Widget 从App Widget host 中删除的时候调用。
onEnabled(Context)
当App Widget第一次创建的时候调用。比如,当用户增加两个同样的App
Widget时候,这个方法只在第一次去调用。如果你需要打开一个新的数据库或者其他的设置,而这在所有的App
Widgets只需要设置一次的情况下,这个是最好的地方去实现它们。
onDisabled(Context)
当App Widget的最后一个实例从App Widget host中被删除的时候调用。这里可以做一些在onEnabled(Context)中相反的操作,比如删除临时数据库。
onReceive(Context, Intent)
每一个广播的产生都会调用此方法,而且是在上面方法之前被调用。通常不需要实现此方法。
在AppWidgetProvider中最重要的callback就是onUpdated(),如果你的App Widget接收用户交互事件,就需要在这个callback里面进行处理。
ApiDemo中的例子,ExampleAppWidgetProvider.java文件
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.example.android.apis.appwidget;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.SystemClock;
import android.util.Log;
import android.widget.RemoteViews;
// Need the following import to get access to the app resources, since this
// class is in a sub-package.
import com.example.android.apis.R;
/**
* A widget provider. We have a string that we pull from a preference in order to show
* the configuration settings and the current time when the widget was updated. We also
* register a BroadcastReceiver for time-changed and timezone-changed broadcasts, and
* update then too.
*
* <p>See also the following files:
* <ul>
* <li>ExampleAppWidgetConfigure.java</li>
* <li>ExampleBroadcastReceiver.java</li>
* <li>res/layout/appwidget_configure.xml</li>
* <li>res/layout/appwidget_provider.xml</li>
* <li>res/xml/appwidget_provider.xml</li>
* </ul>
*/
public class ExampleAppWidgetProvider extends AppWidgetProvider {
// log tag
private static final String TAG = "ExampleAppWidgetProvider" ;
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int [] appWidgetIds) {
Log.d(TAG, "onUpdate" );
// For each widget that needs an update, get the text that we should display:
// - Create a RemoteViews object for it
// - Set the text in the RemoteViews object
// - Tell the AppWidgetManager to show that views object for the widget.
final int N = appWidgetIds.length;
for (int i= 0 ; i< N; i++ ) {
int appWidgetId = appWidgetIds[i];
String titlePrefix = ExampleAppWidgetConfigure.loadTitlePref(context, appWidgetId);
updateAppWidget(context, appWidgetManager, appWidgetId, titlePrefix);
}
}
@Override
public void onDeleted(Context context, int [] appWidgetIds) {
Log.d(TAG, "onDeleted" );
// When the user deletes the widget, delete the preference associated with it.
final int N = appWidgetIds.length;
for (int i= 0 ; i< N; i++ ) {
ExampleAppWidgetConfigure.deleteTitlePref(context, appWidgetIds[i]);
}
}
@Override
public void onEnabled(Context context) {
Log.d(TAG, "onEnabled" );
// When the first widget is created, register for the TIMEZONE_CHANGED and TIME_CHANGED
// broadcasts. We don't want to be listening for these if nobody has our widget active.
// This setting is sticky across reboots, but that doesn't matter, because this will
// be called after boot if there is a widget instance for this provider.
PackageManager pm = context.getPackageManager();
pm.setComponentEnabledSetting(
new ComponentName("com.example.android.apis" , ".appwidget.ExampleBroadcastReceiver" ),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
}
@Override
public void onDisabled(Context context) {
// When the first widget is created, stop listening for the TIMEZONE_CHANGED and
// TIME_CHANGED broadcasts.
Log.d(TAG, "onDisabled" );
PackageManager pm = context.getPackageManager();
pm.setComponentEnabledSetting(
new ComponentName("com.example.android.apis" , ".appwidget.ExampleBroadcastReceiver" ),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
}
static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
int appWidgetId, String titlePrefix) {
Log.d(TAG, "updateAppWidget appWidgetId=" + appWidgetId + " titlePrefix=" + titlePrefix);
// Getting the string this way allows the string to be localized. The format
// string is filled in using java.util.Formatter-style format strings.
CharSequence text = context.getString(R.string.appwidget_text_format,
ExampleAppWidgetConfigure.loadTitlePref(context, appWidgetId),
"0x" + Long.toHexString(SystemClock.elapsedRealtime()));
// Construct the RemoteViews object. It takes the package name (in our case, it's our
// package, but it needs this because on the other side it's the widget host inflating
// the layout from our package).
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_provider);
views.setTextViewText(R.id.appwidget_text, text);
// Tell the widget manager
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}
public class ExampleAppWidgetProvider extends AppWidgetProvider {
public void onUpdate ( Context context , AppWidgetManager appWidgetManager , int [] appWidgetIds ) {
final int N = appWidgetIds . length ;
// Perform this loop procedure for each App Widget that belongs to this provider
for ( int i = 0 ; i < N ; i ++) {
int appWidgetId = appWidgetIds [ i ];
// Create an Intent to launch ExampleActivity
Intent intent = new Intent ( context , ExampleActivity . class );
PendingIntent pendingIntent = PendingIntent . getActivity ( context , 0 , intent , 0 );
// Get the layout for the App Widget and attach an on-click listener to the button
RemoteViews views = new RemoteViews ( context . getPackageName (), R . layout . appwidget_provider_layout );
views . setOnClickPendingIntent ( R . id . button , pendingIntent );
// Tell the AppWidgetManager to perform an update on the current App Widget
appWidgetManager . updateAppWidget ( appWidgetId , views );
}
}
}
3 View layout
只要你熟悉用 xml 怎么去定义 layout 的话,为 App Widget 定义一个 layout 还是很简单的。但是由于App Widget 的布局是基于 RemoteViews ,所以只能使用 RemoteViews 所支持的 layout 或者 view 。
RemoteViews 支持的 layout 和 view 如下:
Layout – FrameLayout 、LinearLayout、 RelativeLayou
View -- Analog、Clock、 Button、 Chronometer 、ImageButton、 ImageView、 ProgressBar 、TextView
注意:继承这些类的子类同样 不支持。
ApiDemo例子,appwidget_provider.xml文件。
这个 Activity 将通过 App Widget 自动启动,用户可以给 App Widget 设置有用的参数,比如 App Widget 的颜色、大小、更新时间或者其他的属性。
在 AndroidManifes.xml 中定义这个 Activity 和一般定义 Activity 基本没有区别, App Widget host 启动这个 Activity 需要一个 Action ,所以:
<activity android:name = ".ExampleAppWidgetConfigure" >
<intent-filter>
<action android:name = "android.appwidget.action.APPWIDGET_CONFIGURE" />
</intent-filter>
</ activity >
同样这个 Activity 必须在 AppWidgetProviderInfo XML 文件中定义 android:configure 。
值得注意的是
App Widget host
调用
configuration Activity
,
configuration Activity
必须要返回一个结果
(
必须包含
App Widget ID
)
saved in the Intent extras as
EXTRA_APPWIDGET_ID。
ApiDemo例子,ExampleAppWidgetConfigure.java文件:
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.example.android.apis.appwidget;
import android.app.Activity;
import android.appwidget.AppWidgetManager;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import java.util.ArrayList;
// Need the following import to get access to the app resources, since this
// class is in a sub-package.
import com.example.android.apis.R;
/**
* The configuration screen for the ExampleAppWidgetProvider widget sample.
*/
public class ExampleAppWidgetConfigure extends Activity {
static final String TAG = "ExampleAppWidgetConfigure" ;
private static final String PREFS_NAME
= "com.example.android.apis.appwidget.ExampleAppWidgetProvider" ;
private static final String PREF_PREFIX_KEY = "prefix_" ;
int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
EditText mAppWidgetPrefix;
public ExampleAppWidgetConfigure() {
super ();
}
@Override
public void onCreate(Bundle icicle) {
super .onCreate(icicle);
// Set the result to CANCELED. This will cause the widget host to cancel
// out of the widget placement if they press the back button.
setResult(RESULT_CANCELED);
// Set the view layout resource to use.
setContentView(R.layout.appwidget_configure);
// Find the EditText
mAppWidgetPrefix = (EditText)findViewById(R.id.appwidget_prefix);
// Bind the action for the save button.
findViewById(R.id.save_button).setOnClickListener(mOnClickListener);
// Find the widget id from the intent.
Intent intent = getIntent();
Bundle extras = intent.getExtras();
if (extras != null) {
mAppWidgetId = extras.getInt(
AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
}
// If they gave us an intent without the widget id, just bail.
if (mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {
finish();
}
mAppWidgetPrefix.setText(loadTitlePref(ExampleAppWidgetConfigure.this , mAppWidgetId));
}
View.OnClickListener mOnClickListener = new View.OnClickListener() {
public void onClick(View v) {
final Context context = ExampleAppWidgetConfigure.this ;
// When the button is clicked, save the string in our prefs and return that they
// clicked OK.
String titlePrefix = mAppWidgetPrefix.getText().toString();
saveTitlePref(context, mAppWidgetId, titlePrefix);
// Push widget update to surface with newly set prefix
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
ExampleAppWidgetProvider.updateAppWidget(context, appWidgetManager,
mAppWidgetId, titlePrefix);
// Make sure we pass back the original appWidgetId
Intent resultValue = new Intent();
resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
setResult(RESULT_OK, resultValue);
finish();
}
};
// Write the prefix to the SharedPreferences object for this widget
static void saveTitlePref(Context context, int appWidgetId, String text) {
SharedPreferences.Editor prefs = context.getSharedPreferences(PREFS_NAME, 0 ).edit();
prefs.putString(PREF_PREFIX_KEY + appWidgetId, text);
prefs.commit();
}
// Read the prefix from the SharedPreferences object for this widget.
// If there is no preference saved, get the default from a resource
static String loadTitlePref(Context context, int appWidgetId) {
SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, 0 );
String prefix = prefs.getString(PREF_PREFIX_KEY + appWidgetId, null);
if (prefix != null) {
return prefix;
} else {
return context.getString(R.string.appwidget_prefix_default);
}
}
static void deleteTitlePref(Context context, int appWidgetId) {
}
static void loadAllTitlePrefs(Context context, ArrayList< Integer> appWidgetIds,
ArrayList< String> texts) {
}
}
相关推荐
标题中的“android axure widget包”指的是一个专门为Android平台设计的Axure组件集合,包含了一系列Android应用中常见的小部件(Widget)模板,如按钮、滑块、开关、列表视图等。这些组件设计得与Android原生UI风格...
在Android开发中,Widget是应用在主屏幕上的小型UI组件,它们可以提供用户与应用程序的交互,无需打开应用本身。ListView是一种常用的布局管理器,它允许用户在一个滚动列表中显示大量数据。本教程将深入探讨如何在...
本主题聚焦于一个特定类型的Widget——时钟Widget,通过分析“android时钟widget小部件源代码”,我们可以深入了解Android Widget的开发及其与时间显示的集成。 Android时钟Widget通常包括以下几个核心组件和功能:...
Android App Widget是Android系统提供的一种轻量级的UI组件,允许开发者在用户的主屏幕上放置一些交互式的快捷方式或小部件,提供类似于桌面小工具的功能。这些小部件可以显示实时信息,如天气、日历事件、音乐播放...
在Android平台上,AppWidget是Android系统提供的一种小部件功能,允许开发者创建可以在用户主屏幕上显示的小应用程序。AppWidgets虽然小巧,但能为用户提供便捷的功能访问,例如天气预报、音乐播放控制等。本教程将...
在Android平台上,Widget是应用程序的一种轻量级交互方式,它可以直接在用户的主屏幕上显示和操作,为用户提供便捷的功能入口。本示例中的“android的widget桌面开关例子”着重于创建一个能够在桌面上显示并控制2G和...
Android AppWidget是Android系统提供的一种桌面小部件功能,允许开发者创建可以放置在用户主屏幕上的小型应用程序。这些小部件不需要用户直接启动,而是持续显示在屏幕上,为用户提供快速访问或控制应用的功能。在这...
在Android平台上,App Widget是一种可以在用户主屏幕上展示小型交互式UI元素的应用程序组件。它们提供了一种无需打开应用即可与应用交互的方式,提高了用户体验。现在,让我们深入探讨一下"android app widget demo...
在Android开发中,AppWidget是桌面小部件,它允许开发者将应用程序的功能直接集成到用户的主屏幕上,无需打开应用。在本案例中,我们探讨的是如何在AppWidget中使用ListView,这是一个增强用户交互的方式,使小部件...
在Android开发中,AppWidget是桌面小部件,它允许用户在主屏幕上与应用程序进行交互,而无需实际打开应用。在本篇博文中,我们将深入探讨如何在AppWidget中启动一个新的Activity,这通常是为了提供更丰富的用户体验...
在Android平台上,AppWidget是能够将小部件添加到用户主屏幕上的迷你应用程序,它们提供了一种无需打开完整应用即可展示信息或执行简单操作的方式。本文将深入探讨Android AppWidget的第四部分,主要关注如何更新App...
在Android开发中,Widget是应用程序在用户主屏幕上的一种表现形式,它允许开发者为用户提供轻量级的交互体验,即便在应用程序未打开时也能提供服务。本篇将详细讲解"android widget"这一主题,主要基于 mars 老师的 ...
在Android平台上,Widget是应用程序的一种特殊形式,它们可以在用户的主屏幕上显示实时信息,提供快捷操作,无需打开完整的应用。这个“android 源码 android Widget开发案例 eclipse项目 直接导入”是一个很好的...
Android AppWidget是Android系统提供的一种轻量级组件,允许开发者在用户的主屏幕上创建小型应用程序,通常称为小部件或快捷方式。这些小部件不需要用户启动应用,就能直接在主屏幕上显示和交互,为用户提供便捷的...
在Android平台上,Widgets是应用程序的一种扩展,它们提供了无需打开应用就能与之交互的功能。在这个“android时钟widget例子”中,开发者创建了一个自定义的时钟组件,以满足对透明时钟的需求。 首先,我们需要...
各种控件组件展示。 支持API10+ 水平滑动listView。 异步加载图片。 双指缩放,拖动。 项目链接:https://github.com/gqjjqg/android-widget-extend
这里包含了三个可以生产用的组件RollNavigationBar、PressNavigationBar、SlidePageView,各组件的具体使用请看我的博客: 仿“美丽说”滑动效果的底部导航栏... 仿“美丽说”按下效果的顶部导航栏 ... ...
根据给定的文件信息,我们可以总结出以下有关Android开发中的重要知识点,特别是聚焦于`android.widget`命名空间下的组件及API使用。 ### Android中文API合集背景 Android中文API合集是由一群热心的开发者组成的...
Android小部件(Widget)是Android系统提供的一种桌面组件,它可以让用户在主屏幕上直接与应用程序进行交互,无需打开应用本身。本教程将详细介绍如何在Android项目中创建和使用一个简单的Widget。 1. **理解...