您的位置:首页 > 移动开发

appWidget 简单入门学习笔记

2011-09-24 15:19 323 查看

1,让桌面能够添加你的appWidget

1,一个类,和2个xml

//一个实现AppWidgetProvider的类
public class TomAppWidgetProvider extends
AppWidgetProvider {   }

<!--放在 res/xml 文件夹中命名为tom_appwidget_info.xml-->
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="294dp"
android:minHeight="72dp"
android:updatePeriodMillis="86400000"
android:initialLayout="@layout/tom_appwidget"
android:configure="kg.tom.AppWidgetConfigure"     > </appwidget-provider>
<!-- android:initialLayout: 初始化你的appWidget布局 -->

<!--放置在res/layout/tom_appwidget_provider.xml-->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="294dp"
android:layout_height="72dp"
android:orientation="vertical"    > <TextView
android:id="@+id/appwidget_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#ff000000"/>     <Button
android:id="@+id/appwidget_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@android:string/ok"    />
</LinearLayout>

在AndroidManifest.xml中声明你的appWidget

<receiver android:name="TomAppWidgetProvider" >
<intent-filter>
<!--让系统能够设别到你的appWidgetProvider的动作-->        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<!--设置你的appWidget的布局-->
<meta-data android:name="android.appwidget.provider"               android:resource="@xml/tom_appwidget_info" />
</receiver>

长按你的Home 界面,你就会看到你的widget已经在列表当中





但是,现在点击是会出错的,这时候我们需要设置我们的AppWidgetConfigure

在activity中增加一个Intent-filter

<intent-filter>
<!-- 让系统能够设别到你的appWidgetProvider的动作 -->
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>

public class AppWidgetConfigure extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设置widgetId
int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
//1,将setResult 设置为 取消,用于取消widget host         setResult(RESULT_CANCELED);
//2,从Intent 中找到widget 的id
Intent intent = getIntent();
Bundle extras = intent.getExtras();
if(extras != null){
mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,AppWidgetManager.INVALID_APPWIDGET_ID);         }
//3,如果获取不到 appWidget id 我们就结束
if(mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID){
Log.d("app", "获取失败退出!!!");
finish();         }
final Context context = AppWidgetConfigure.this;
//4,实例化你的 appWidget
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
//5,更新widget
Intent resultValue = new Intent();         resultValue.putExtra(appWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
setResult(RESULT_OK, resultValue);
finish();                         } }

2,然后写provider的代码

public class TomAppWidgetProvider extends AppWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
// TODO Auto-generated method stub
super.onUpdate(context, appWidgetManager, appWidgetIds);
final int N = appWidgetIds.length;
Log.d("app", "onUpdate--->Ids==="+String.valueOf(N) );
for(int i=0; i < N; i++){
int appWidgetId = appWidgetIds[i];
updateAppWidget(context, appWidgetManager, appWidgetId);         }               }
static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,int appWidgetId){
Log.d("app", "update---->id" + appWidgetId);
//1,widget中的的标题
CharSequence text = "这是我第一个widget";
//2,widget显示用布局,并设置text显示的值
RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.tom_appwidget_provider);         views.setTextViewText(R.id.appwidget_text, text);
//3,通知widget manager 更新         appWidgetManager.updateAppWidget(appWidgetId, views);               }
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
// TODO Auto-generated method stub         super.onDeleted(context, appWidgetIds);
//删除的时候调用的方法
int appids = appWidgetIds.length;
Log.d("app", "onDelete--->" + appids);     } }

然后就可以运行了:





顺便附上一张简单原理图:..





2,小小的进阶为widget实现运行activity

只要在加上几行代码的appwidget 就能实现挑战到Activity的功能

1,新建一个HelloAppWidget的activity

static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,int appWidgetId){
Log.d("app", "update---->id" + appWidgetId);
//1,设置显示用标题
CharSequence text = "这是我第一个widget";
//1.1,增加跳转用activity相关 intent
Intent intent = new Intent(context, HelloAppWidget.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
//2,如果,没有在xml中声明RemoteViews布局,这里就必须要让其他布局基于RemoteViews
RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.tom_appwidget_provider);         views.setTextViewText(R.id.appwidget_text, text);
//2.1将需要跳转的intent绑定到appWidget button中         views.setOnClickPendingIntent(R.id.appwidget_button, pendingIntent);
//3,通知widget manager 更新         appWidgetManager.updateAppWidget(appWidgetId, views);               }





跳转到特定activity…ps:使用activity记得在AndroidManifest.xml中注册
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息