Android的桌面组件App Widget的使用方法 AppWidgetProvider RemoteViews

What is App Widget?

在手机桌面上放置的控件,即Android的桌面组件

AppWidgetProviderInfo
public class
AppWidgetProviderInfo
extends Object
implements Parcelable

Describes the meta data for an installed AppWidget provider. The fields in this class correspond to the fields in the <appwidget-provider> xml tag.


AppWidgetProvider

public class
AppWidgetProvider
extends BroadcastReceiver

A convenience class to aid in implementing an AppWidget provider. Everything you can do with AppWidgetProvider, you can do with a regularBroadcastReceiver. AppWidgetProvider merely parses the relevant fields out of the Intent that is received in onReceive(Context,Intent), and calls hook methods with the received extras.

创建一个简单的App Widget的基本步骤:


① 在res文件夹下创建一个xml文件夹,里面创建一个xml文件(这里创建了一个test_appwidget_info.xml文件)用于提供元数据:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="200dp"
    android:minHeight="80dp"
    android:updatePeriodMillis="10000"
    android:initialLayout="@layout/test_appwidget"
 >
</appwidget-provider>

其中的test_appwidget为App Widget的布局文件,在第二步创建。

② 创建App Widget的布局文件test_appwidget.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView
	android:id="@+id/widgetId"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="This is an AppWidget"
    android:background="#000"
    />
</LinearLayout>


③ 创建一个类继承AppWidgetProvider并覆盖里面的几个常用的方法:

onDeleted(Context context, int[] appWidgetIds) 删除App Widget是调用此方法
onDisabled(Context context) 最后一个App Widget实例删除后调用此方法
onEnabled(Context context) App WIdget实例第一次被创建是调用此方法
onReceive(Context context, Intent intent) 接收广播事件
onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) 到达指定更新时间或用户向桌面添加了App Widget时调用此方法
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;

public class TestAppWidgetProvider extends AppWidgetProvider{

	@Override
	public void onUpdate(Context context, AppWidgetManager appWidgetManager,
			int[] appWidgetIds) {
		System.out.println("onUpdate");
		super.onUpdate(context, appWidgetManager, appWidgetIds);
	}
	@Override
	public void onDeleted(Context context, int[] appWidgetIds) {
		System.out.println("onDeleted");
		super.onDeleted(context, appWidgetIds);
	}
	@Override
	public void onDisabled(Context context) {
		System.out.println("onDisabled");
		super.onDisabled(context);
	}
	@Override
	public void onEnabled(Context context) {
		System.out.println("onEnabled");
		super.onEnabled(context);
	}
}


④ 在AndroidManifest.xml文件中声明一个receiver,注意intent和meta-data子标签的设置:

<receiver android:name=".TestAppWidgetProvider">
	<intent-filter>
		<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
	</intent-filter>
	<meta-data android:name="android.appwidget.provider"
		android:resource="@xml/test_appwidget_info" />
</receiver>

PendingIntent

public final class
PendingIntent
extends Object
implements Parcelable

A description of an Intent and target action to perform with it. Instances of this class are created with getActivity(Context, int, Intent, int),getBroadcast(Context, int, Intent, int), getService(Context, int, Intent, int); the returned object can be handed to other applications so that they can perform the action you described on your behalf at a later time.

RemoteViews

public class
RemoteViews
extends Object
implements Parcelable LayoutInflater.Filter

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.

使用PendingIntent和RemoteViews对App Widget绑定监听器:

创建PendingIntent的基本方法:

getActivity(Context context, int requestCode, Intent intent, int flags)
getBroadcast(Context context, int requestCode, Intent intent, int flags)
getService(Context context, int requestCode, Intent intent, int flags)

在创建一个简单的App Widget的基本步骤基础之上进行一下操作:

① 在test_appwidget.xml文件中添加一个按钮

<Button
	android:id="@+id/widgetButtonId"
	android:layout_width="fill_parent"
	android:layout_height="wrap_content"
	android:text="click me?"
	/>


② 通过RemoteViews在TestAppWidgetProvider的onUpdate()方法中为Botton绑定监听器

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
		int[] appWidgetIds) {
	for (int i = 0; i < appWidgetIds.length; i++) {
		//这里TargetActivity为Intent跳转到的Activity,这个Activity类需要另外编写,在第三步创建
		Intent intent = new Intent(context,TargetActivity.class);
		PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
		RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.test_appwidget);
		//PendingIntent为事件触发是所要执行的PendingIntent
		remoteViews.setOnClickPendingIntent(R.id.widgetButtonId, pendingIntent);
		appWidgetManager.updateAppWidget(appWidgetIds[i], remoteViews);
	}
	super.onUpdate(context, appWidgetManager, appWidgetIds);
}


③ 创建一个TargetActivity用作Botton的跳转到的Activity

接收来自AppWidget中的广播消息:

在创建一个简单的App Widget的基本步骤基础之上进行一下操作:

1、 在AndroidManifest.xml文件中为TestAppWidgetProvider注册新的intent

<receiver android:name=".TestAppWidgetProvider">
	<intent-filter>
		<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
	</intent-filter>
	<intent-filter>
		<action android:name="com.test.UPDATE_APP_WIDGET"/>
	</intent-filter>
	<meta-data android:name="android.appwidget.provider"
		android:resource="@xml/test_appwidget_info" />
</receiver>


2、 在TestAppWidgetProvider中定义一个常量:

private static final String UPDATE_ACTION = "com.test.UPDATE_APP_WIDGET";


3、 在TestAppWidgetProvider的onUpdate()方法中使用getBroadcast()方法创建一个PendingIntent;并为AppWidget当中的控件注册监听器

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
		int[] appWidgetIds) {
	Intent intent = new Intent();
	intent.setAction(UPDATE_ACTION);
	PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0,
			intent, 0);
	RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
			R.layout.test_appwidget);
	remoteViews.setOnClickPendingIntent(R.id.widgetButtonId, pendingIntent);
	appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);
}


4、 在onReceive()方法中接收所需要的广播:

public void onReceive(Context context, Intent intent) {
	super.onReceive(context, intent);
	String action = intent.getAction();
	if (UPDATE_ACTION.equals(action)) {
		System.out.println(UPDATE_ACTION);
	}
}
如果需要改变App Widget中控件的状,可以在TestAppWidgetProvider的onReceive()方法中通过RemoteViews对象去改变:
@Override
public void onReceive(Context context, Intent intent) {
	String action = intent.getAction();
	if (UPDATE_ACTION.equals(action)) {
		RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
				R.layout.test_appwidget);
		remoteViews.setTextViewText(R.id.widgetTextId, "change");
		AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
		//区分:RemoteViews代表App Widget中的所有空间,而ComponentName代表整个App Widget对象
		ComponentName componentName = new ComponentName(context,ExampleAppWidgetProvider.class);
		appWidgetManager.updateAppWidget(componentName, remoteViews);
	} else {
		super.onReceive(context, intent);
	}
}
除了文章中有特别说明,均为IT宅原创文章,转载请以链接形式注明出处。
本文链接: http://www.itzhai.com/android-app-widget-desktop-components-to-use-appwidgetprovider-remoteviews.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
创建 Android 应用程序中的 App Widget,需要以下步骤: 1. 创建 App Widget Provider 类 ```java public class MyWidgetProvider extends AppWidgetProvider { @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { // 更新 App Widget RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout); views.setTextViewText(R.id.tv_widget, "Hello World!"); appWidgetManager.updateAppWidget(appWidgetIds, views); } } ``` 2. 声明 App Widget ProviderAndroidManifest.xml 文件中声明 App Widget Provider,如下所示: ```xml <receiver android:name=".MyWidgetProvider" android:label="@string/app_name"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/my_widget_info" /> </receiver> ``` 其中,MyWidgetProvider 是你的 App Widget Provider 类名,@string/app_name 是你应用的名称,@xml/my_widget_info 是你的 App Widget Provider 的相关信息,需要在 res/xml 目录下创建一个名为 my_widget_info.xml 的文件,并在该文件中指定你的 App Widget 的布局和其他属性。 3. 定义 App Widget 的布局 在 res/layout 目录下创建一个名为 widget_layout.xml 的文件,定义 App Widget 的布局,如下所示: ```xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/widget_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="10dp"> <TextView android:id="@+id/tv_widget" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="18sp" android:textColor="#000000" /> </RelativeLayout> ``` 4. 更新 App Widget 在 onUpdate() 方法中,更新 App Widget 的 UI。可以使用 RemoteViews 对象更新 App Widget 的 UI,如下所示: ```java @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { // 更新 App Widget RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout); views.setTextViewText(R.id.tv_widget, "Hello World!"); appWidgetManager.updateAppWidget(appWidgetIds, views); } ``` 5. 安装 App Widget 在应用的首次安装时,需要向用户请求授权,以便创建 App Widget。可以使用以下代码向用户请求授权: ```java // 请求授权 Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_BIND); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER, new ComponentName(context, MyWidgetProvider.class)); int REQUEST_PICK_APPWIDGET = 1; ((Activity) context).startActivityForResult(intent, REQUEST_PICK_APPWIDGET); ``` 6. 添加 App Widget桌面 可以使用以下代码将 App Widget 添加到桌面: ```java // 添加 App Widget Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds); context.sendBroadcast(intent); ``` 其中,appWidgetIds 是 App Widget 的 ID 数组,可以在 onUpdate() 方法中获取。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值