App Widget

 

和App Widget相关的基本概念

1、             AppWidgetProviderInfo对象:为App Widget提供元数据,包括布局,更新频率等数据。这个对象被定义在XML文件当中

2、             AppWidgetProvider:定义了App Widget的基本生命周期函数。

 

 

创建第一个AppWidget的步骤:

1、定义AppWidgetProviderInfo:

在res/xml文件夹当中定义一个名为example_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/example_appwidget"

</appwidget-provider>

2、为App Widget指定样式和布局:

定义一个新的布局文件example_appwidget.xml

3、实现AppWidgetProvider

a)        onUpdate:在到达指定的更新时间之后或者当用户向桌面添加AppWidget时会调用该方法。

b)       onDeleted:当App Widget被删除时

c)       onEnabled:第一个App Widget的实例第一次被创建时

d)       onDisabled:当最后一个App Widget实例被删除后

e)        onReveice:接收广播事件

 

 

PendingIntent “锦囊”

创建PendingIntent的方法:

1、getActivity(Contextcontext, int requestCode, Intent intent, int flags)为了启动Activity

2、getBroadcast(Contextcontext, int requestCode, Intent intent, int flags)为了发送广播

3、getService(Contextcontext, int requestCode, Intent intent, int flags)为了启动服务

 

 

RemoteViews的作用:

1、RemoteViews对象表示了一系列的View对象

2、RemoteViews所表示的对象运行在另外的进程当中

通过RemoteViews来对App Widget进行操作,包括绑定处理器、更新控件等

 

 

 

 

 

App Widget的响应

 

1、向App Widget中添加Button

example_appwidget.xml

……..

<Button android:id="@+id/widgetButtonId"

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:text="测试用按钮"

    />

2、为Button绑定处理器

       由于App Widget和我们的应用程序运行在不同的进程当中(App Widget当中的View运行在Home Screen进程当中),所以无法按照之前惯用的方法绑定监听器

public void onUpdate(Context context, AppWidgetManagerappWidgetManager,

           int[] appWidgetIds) {

       // TODO Auto-generatedmethod stub

       for(int i = 0; i< appWidgetIds.length; i ++){

           System.out.println(appWidgetIds[i]);

           //创建一个Intent对象

           Intent intent = new Intent(context, TargetActivity.class);

           //创建一个PendingIntent

           PendingIntent pendingIntent = PendingIntent.getActivity(context,0, intent, 0);

           RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.example_appwidget);

           //为按钮绑定事件处理器

           //第一个参数用来指定被绑定处理器的控件的ID

           //第二个参数用来指定当事件发生时,哪个PendingIntent将会被执行

           remoteViews.setOnClickPendingIntent(R.id.widgetButtonId, pendingIntent);    //点击按钮时,调用pendingIntent,即启动TargetActivity

           //更新AppWidget

           //第一个参数用于指定被更新AppWidget的ID

           appWidgetManager.updateAppWidget(appWidgetIds[i],remoteViews);

       }

       super.onUpdate(context, appWidgetManager, appWidgetIds);

    }

 

 

 

 

 

 

 

接收来自AppWidget的广播

1、在AndroidManifest.xml当中为AppWidgetProvider注册新的intent-filter

2、使用getBroadcast()方法创建一个PendingIntent

3、为AppWidget当中的控件注册处理器

4、在onReceive方法当中接收广播消息

 

AppWidgetProvider的运行机制

 

当用来更新控件时,使用getBroadcast发送广播,当点击按钮时开始发送

Intent intent = new Intent();

       intent.setAction(UPDATE_ACTION);

       PendingIntent pendingIntent = PendingIntent.getBroadcast(context,0, intent, 0);

       RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.example_appwidget);

       remoteViews.setOnClickPendingIntent(R.id.widgetButtonId, pendingIntent);

       appWidgetManager.updateAppWidget(appWidgetIds,remoteViews);

 

                 

在onReceive方法中进行更新

public void onReceive(Context context, Intent intent) {

       // TODO Auto-generatedmethod stub

       String action = intent.getAction();

       if(UPDATE_ACTION.equals(action)){

           System.out.println("onReceive-->" + UPDATE_ACTION);

           RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.example_appwidget);

           remoteViews.setTextViewText(R.id.widgetButtonId, "textChange");

           AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);

           ComponentName componentName = new ComponentName(context,ExampleAppWidgetProvider.class);

           appWidgetManager.updateAppWidget(componentName, remoteViews);

       }else

       {

           super.onReceive(context, intent);   //其他广播的接收响应,如onDeleted、onEnabled等

       }

      

    }

你可能感兴趣的:(App Widget)