当前位置:  编程技术>移动开发
本页文章导读:
    ▪关于AppWidget的深入懂得1        关于AppWidget的深入理解1 App Widgets是小型views,可以嵌入到其他应用程序并且接收定期更新。这些views被称为Widgets组件,您可以通过App Widget provider去发布Widgets,能够容纳其他App Widgets称为App.........
    ▪ Animation 手机动画片_TranslateAnimation        Animation 手机动画_TranslateAnimation   Animation a = new TranslateAnimation(caipiao_clicked_btn.getLeft(), btn .getLeft(), caipiao_clicked_btn.getTop(), btn.getTop());// 构造一个水平移动动画的实例 a.setDuration(300);// 设置.........
    ▪ 关于AppWidget的深入懂得2       关于AppWidget的深入理解2 上一篇是对Dev  Guide中关于SDK的翻译,这篇文章的目的就是对AppWidget有一个深入的介绍。一、首先介绍一下在开机过程中系统对AppWidget做了什么当SystemServer.java运行.........

[1]关于AppWidget的深入懂得1
    来源: 互联网  发布时间: 2014-02-18
关于AppWidget的深入理解1
App Widgets是小型views,可以嵌入到其他应用程序并且接收定期更新。这些views被称为Widgets组件,您可以通过App Widget provider去发布Widgets,能够容纳其他App Widgets称为App  Widget  host。

创建一个Widget ,你需要:
AppWidgetProviderInfo object

描述一个App Widget,如App Widget的布局,更新频率,以及AppWidgetProvider类的metadata。这在XML中定义。
AppWidgetProvider class implementation

在代码层次实现能与基于广播机制事件的App Widget进行交互的基本方法。通过它,当App Widget更新,启用,禁用和删除的时候就能收到广播。
View layout

通过XML定义的App Widget初始化布局。
另外,可以实现一个配置App Widget的Activity 。 这个可选的Activity 是当用户添加App Widget的时候打开 ,允许用户在创建时候去对App Widget 配置。
下面介绍一下怎么去使用这些组件:

一、在AndroidManifest.xml中声明App Widget

<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>

<receiver>需要android:name属性,它指定App Widget所使用的AppWidgetProvider。
<intent-filter>需要含android:name 属性的<action>,这个属性指定AppWidgetProvider接收ACTION_APPWIDGET_UPDATE广播,这是唯一一个需要明确声明的广播。当需要时,AppWidgetManager自动给所有App Widget发送广播。
<meta-data>指定了AppWidgetProviderInfo资源,需要以下属性:
android:name – 指定metadata的名字。使用android.appwidget.provider将其作为AppWidgetProviderInfo的描述性数据。
android:resource - 指定AppWidgetProviderInfo资源的位置。
二、增加AppWidgetProviderInfo Metadata
一个App Widget的基本属性是通过AppWidgetProviderInfo去定义的,例如它的最小尺寸的布局,它的初始layout,多久更新App Widget,还有(可选)在创建时期的一个配置Activity。在XML资源中定义一个AppWidgetProviderInfo是通过<appwidget-provider>标签,并保存在工程的res/xml/文件夹底下。例如    

<appwidget-provider   xmlns:android="http://schemas.android.com/apk/res/android"

    android:minWidth="294dp"

    android:minHeight="72dp"

    android:updatePeriodMillis="86400000"

    android:initialLayout="@layout/example_appwidget"

    android:configure="com.example.android.ExampleAppWidgetConfigure" > </appwidget-provider>



updatePeriodMillis 属性定义了App Widget应该多久向AppWidgetProvider请求更新。实际更新的时间未必能保证及时更新,并且建议尽量不要频繁更新---比如一小时一次去更新电量。也可以容许用户去自定义更新的时间。
configure 属性是当用户添加一个App Widget前启动的Activity,这个Activity的作用就是配置App Widget的属性。(Optional)

三、为App Widget定义Layout

只要你熟悉用xml怎么去定义layout的话,为App Widget定义一个layout还是很简单的。但是由于App Widget的布局是基于RemoteViews,所以只能使用RemoteViews所支持的layout或者view。
RemoteViews支持的layout和view如下:
Layout – FrameLayout LinearLayout RelativeLayou

View -- AnalogClock Button Chronometer ImageButton ImageView ProgressBar TextView

注意:继承这些类的子类同样不支持。

四、使用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里面进行处理。
如果你需要一个带有Button的App Widget,点击Button去启动一个Activity,下面就是AppWidgetProvider的实现方法:
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);

    }

  }
}

五、创建App Widget Configuration Activity

这个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
六、通过configuration Activity去更新App Widget

1.  获取App Widget ID

Intent intent = getIntent();
Bundle extras = intent.getExtras();
if (extras != null) {
mAppWidgetId = extras.getInt(
AppWidgetManager.EXTRA_APPWIDGET_ID, 
AppWidgetManager.INVALID_APPWIDGET_ID);
}


2.  设置 App Widget 参数
3.  当设置完成,通过getInstance(Context)获取AppWidgetManager实例AppWidgetManager  appWidgetManager=AppWidgetManager.getInstance(context);
4.  通过调用updateAppWidget(int, RemoteViews)去更新App Widget

RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.example_appwidget);
appWidgetManager.updateAppWidget(mAppWidgetId, views);

5.  创建一个返回的Intent,结束Activity

Intent resultValue = new Intent();

resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);

setResult(RESULT_OK, resultValue);
finish();

    
[2] Animation 手机动画片_TranslateAnimation
    来源: 互联网  发布时间: 2014-02-18
Animation 手机动画_TranslateAnimation

 

Animation a = new TranslateAnimation(caipiao_clicked_btn.getLeft(), btn
				.getLeft(), caipiao_clicked_btn.getTop(), btn.getTop());// 构造一个水平移动动画的实例
		a.setDuration(300);// 设置时间持续时间为300毫秒
		a.setStartOffset(0);// 以毫秒为单位的动画运行前的延迟,一旦开始时间就达到了
		a.setFillAfter(true);// fillAfter 属性 当设置为true 该动画转化在动画结束后被应用
		a.setRepeatCount(0);// 定义动画重复的时间 0
		a.setInterpolator(AnimationUtils.loadInterpolator(this,
				android.R.anim.decelerate_interpolator));// 定义用于平滑动画运动的时间内插
		shadow_imageView.startAnimation(a);// 启动动画效果

 

 其中caipiao_clicked_btn为移动前的Button, btn为移动后的目标Button. shadow_imageView为ImageView(动画的作用对象)

 


    
[3] 关于AppWidget的深入懂得2
    来源: 互联网  发布时间: 2014-02-18
关于AppWidget的深入理解2
上一篇是对Dev  Guide中关于SDK的翻译,这篇文章的目的就是对AppWidget有一个深入的介绍。

一、首先介绍一下在开机过程中系统对AppWidget做了什么

当SystemServer.java运行到init2()的时候,通过SystemManager.addService(Context.AppWidget_Service,appWidget)将AppWidgetService服务加到服务队列里面,当所有服务加载完毕后会调用appWidgetF.systemReady(safeMode)进入到AppWidgetService.java,在这个方法中做了三件事:

1、遍历所有的安装包,找到符合条件的ACTION:ACTION_APPWIDGET_UPDATE和<meta-data android:name="android.appwidget.provider"/>的receiver,解析相关信息,保存到本地数据成员中。

2、读取本地文件数据:/data/system/appwidgets.xml,所有已安装到桌面的widget的信息都保存在这个文件里。读出来,也保存到本地数据成员里。

3、注册了三个消息:ACTION_BOOT_COMPLETED(系统启动到桌面就会发送此消息),ACTION_PACKAGE_ADDED(有新 APK包安装到系统),ACTION_PACKAGE_REMOVED(有APK包被删除)。当系统启动到桌面后,AppWidgetService接收 到了ACTION_BOOT_COMPLETED消息,它会去检查本地数据成员,如果有已经安装到桌面的widget,它会上发 ACTION_APPWIDGET_ENABLED和ACTION_APPWIDGET_UPDATE消息。如果有widget设置了updatePeriodMillis的属性,它就会开始计时(这个是通过AlarmManager来实现的),到时间时,就会再次发送ACTION_APPWIDGET_UPDATE消息。



二、与AppWidget相关的类有:

RemoteViews.java   

* A class that describes a view hierarchy that can be displayed in
* another process. The hierarchy is inflated from a layout resource
* file, and this class provides some basic operations for modifying
* the content of the inflated hierarchy

上面是Google给的关于RemoteViews的解释,大家不要被它的名字给欺骗了,说白了它就是作为一个描述view信息的载体,通过它可以在进程间传递,在另一个进程中由AppWidgetHostView去获取RemoteViews所承载的信息并且显示出来。

AppWidgetProvider.java

这个类继承BroadcastReceiver,并且重写了它里面的方法,里面通常使用的是onUpdate()方法对AppWidget更新

AppWidgetManager.java

* Updates AppWidget state; gets information about installed AppWidget providers and other
* AppWidget related state.



AppWidgetHost.java

* AppWidgetHost provides the interaction with the AppWidget service for apps,
* like the home screen, that want to embed AppWidgets in their UI.

AppWidgetHostView.java

* Provides the glue to show AppWidget views. This class offers    automatic animation
* between updates, and will try recycling old views for each incoming
* {@link RemoteViews}.

AppWidgetService.java

具体实现AppWidgetHost和AppWidgetManager中的方法。





对上图的一个解释:

当我们把一个AppWidget放在桌面的时候其实这个AppWidget是停靠在Launcher的一个View上面,被停靠的这个Activity我理解为“宿主”,而AppWidget是运行在一个独立的进程中,所以AppWidget要与这个“宿主”通信的话就需要IPC。

当RemoteViews把AppWidget的View信息传递“宿主”的时候,通过AppWidgetHost获得AppWidgetHostView的实例,这样 按照RemoteViews中的信息将AppWidget的View绘制到“宿主”中来。至此,我们的Widget就显示在“宿主”上了。

下图是对AppWidgetManager和AppWidgetHost做的解释,作为管理类,各自完成不同的管理任务。





在网上看到这么一段关于AppWidget的比喻,贴来大家看看

Android AppWidget框架妄析: Android中的借尸还魂




Android, AppWidget, 借尸还魂
由于初识Android不久,所以一切分析皆可有误,故而只能为之妄析。 题目起的比较恐怖,然非我本意。 只是实在找不到更加贴切的,可以对AppWidget框架一针而见血的比喻了。 闲话少说,且看如何个借尸还魂。

首看魂者何来。 大家都知道Widget的宗旨,就是要在同一屏幕(界面上)运行多个具有独立功能的小插件,从而丰富功能的同时简化操作。那么,在Android的4大组件中,何人可以充当该角色,抑或需要再独立设计一个组件? Activity? 非也!! Activity是UI呈现和用户交互的一个组件,具有独特的Task管理机制,同一时刻,框架只允许一个Activity与用户交互并呈现。 而Widget的特点是,多实例的并发交互性。 所以,Activity不能满足,不能满足同时多个Widget的并发交互和呈现。 既然不能前台,那么只能在后台Running, Service or BroadCastReceiver? 由于Widget需要处理众多的事件交互,所以,BroadCastReceiver更加合适。 既然找到了合适的,那么也就没有必要再创造新的。 够用就可以,不是越多越好,这也是软件设计的准则。 OK, AppWidget的魂已经找到,BroadCastReceive也, 所以,Android中的AppWidget其本质就是一个BroadCastReceive组件。

再看尸者何来。 尸者,阳间之物也。 虽已死(本身无用),却能见光(呈现)也。 任何一个期望在其之上运行Widget的前台的应用(Activity),其实就是一个Widget宿主。 其本身而言,无任何Widget功能,但却可以和用户交互并呈现,从此点而言,可谓尸也。 Android中的AppHost即为尸也。

最后我们看如何还魂。 AppWidget为魂,功能强大,为所欲为,但却始终位于阴间(后台运行),无法见日,故而众人不可观之。 AppHost为尸,虽见天日,却已无所可为。 我们何不将此二者互补那?? 但是,阴阳两隔,必须使用特殊的方式, 此即为还魂术。 通过还魂术,可使得魂寄于尸而见天日。 还魂术就是阴间通往阳间的大道。 Android中的还魂术即为RemoteView。 在Android中,由于进程边界的存在,使得AppWidget与AppHost也阴阳两隔,默认是无法直接沟通的。 采用RemoteView,让AppWidget将一切需要呈现的描述构建到RemoteView中,AppHost中再基于该描述,重新创建于属于自己进程中的View进而显示。

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3