Android--桌面组件AppWidget

AppWidget通常被称为桌面插件,是Android系统应用开发层上的重要部分,是把一个进程的控件嵌入到别外一个进程的窗口里的一种方法,是与客户端程序交互的组件程序

先看看效果图:

下面进行实例记录如何创建AppWidget,它是如何与客户端程序进行交互:

第一步:在res目录下新建xml文件夹并创建

ywx_appwidget_info.xml

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" 
    android:minWidth="100dp"
    android:minHeight="30dp"
    android:updatePeriodMillis="86400000"
    android:initialLayout="@layout/ywx_appwidget">

</appwidget-provider>

第二步:新建布局文件ywx_appwidget.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <TextView 
        android:id="@+id/widgetText"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/appwidget"
        android:background="#000000"/>
      
     <ImageView 
          android:id="@+id/imageId"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:src="@drawable/load"
          android:contentDescription="@id/imageId"/>
     <Button
          android:id="@+id/widgetBut"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="@string/widgetText"/>
      
</LinearLayout>

第三步:新建一个ExampleAppWidgetProvider.java,实现AppWidgetProvider中的方法

package com.ywx.appwidget_04;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.widget.RemoteViews;
public class ExampleAppWidgetProvider extends AppWidgetProvider{
	private static final String UPDATE_ACTION = "com.ywx.appwidget_04.UPDATE_APP_WIDGET";
	//接收广播事件
	@Override
	public void onReceive(Context context, Intent intent) {
		super.onReceive(context, intent);
	}

	//在到达指定的更新时间之后或者当用户向桌面添加App Widget时会调用该方法
	@Override
	public void onUpdate(Context context, AppWidgetManager appWidgetManager,
			int[] appWidgetIds) {
		super.onUpdate(context, appWidgetManager, appWidgetIds);
	}
	
   	//当AppWidget被删除时,会调用该方法
	@Override
	public void onDeleted(Context context, int[] appWidgetIds) {
		super.onDeleted(context, appWidgetIds);
	}

	//当一个AppWidget的实例第一次被创建时会调用该方法
	@Override
	public void onEnabled(Context context) {
		super.onEnabled(context);
	}

	//当最后一个AppWidget实例被删除后调用该方法
	@Override
	public void onDisabled(Context context) {
		super.onDisabled(context);
	}
}


第四步:在AndroidManifest.xml中声明:这里有两个actiong,一个是系统的,一个是自定义的,只要满足任何一个action就会触发事件

<receiver android:name="ExampleAppWidgetProvider">
            <intent-filter >
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
            </intent-filter>
            <intent-filter >
                <action android:name="com.ywx.appwidget_04.UPDATE_APP_WIDGET"/>
            </intent-filter>
            <meta-data android:name="android.appwidget.provider"
                android:resource="@xml/ywx_appwidget_info"/>
        </receiver>

完成以上四步就能够完成简单的AppWidget示例。
在AppWidget开发过程中主要运用到了PendingIntent和RemoteViews,下面将用法记录如下:
PendingIntent主要的三个方法:
 1.getActivity(Context context,int requestCode,Intent intent,int flags)
2.getBroadcast(Context context,int requestCode,Intent intent,int flags)
3.getService(Context context,int requestCode,Intent intent,int flags)
RemoteViews的作用:表示一系列的view对象及所表示的对象运行在另外的进程当中。
appwidget组件程序并不是处在当前的进程当中,所以对于监听器的绑定事件与原来的有所区别:
在onUpdate()方法中添加

Intent intent = new Intent();
		intent.setAction(UPDATE_ACTION);
		//使用getBroadcast生成PendingIntent,当对象执行时,发送广播
		PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
		RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.ywx_appwidget);
		remoteViews.setOnClickPendingIntent(R.id.widgetBut, pendingIntent);
		appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);

在onRecive()方法中添加
		String action = intent.getAction();
		if(UPDATE_ACTION.equals(action)){
			RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.ywx_appwidget);
			remoteViews.setImageViewResource(R.id.imageId, R.drawable.upload);
			remoteViews.setTextViewText(R.id.widgetText, "娃哈哈");
			AppWidgetManager appWidgeManager = AppWidgetManager.getInstance(context);
			ComponentName componentName = new ComponentName(context,ExampleAppWidgetProvider.class);
			appWidgeManager.updateAppWidget(componentName, remoteViews);
		}else{
			super.onReceive(context, intent);
		}


你可能感兴趣的:(android,布局,pendingintent,widget,RemotViews)