android示例之AppWidget(2)

来源:互联网 发布:记录键盘输入的软件 编辑:程序博客网 时间:2024/05/16 12:06

今天要介绍的是AppWidget的交互使用,今天要达成的效果图是:点击AppWidget上的按钮,可以启动另一个Activity。


需要注意的是:

1、PendingIntent表示一个挂起的Intent,在事件没有触发前就已经交个另一个线程。

2、RemoteViews表示桌面上所有的AppWidget的View。

要完成上面的效果,要在AppWidget的RemoteViews中定义一个Button,并为这个Button绑定监听器。

需要注意的是:为这个Button绑定监听器不是使用之前的setOnClickListener,而是使用setOnClickPendingIntent方法。

实现步骤和上一篇文章基本相同,主要的实现功能的代码在onUpdate方法中。

example_appwidget_info.xml

<?xml version="1.0" encoding="utf-8"?><appwidget-providerxmlns:android="http://schemas.android.com/apk/res/android"android:minWidth="294dp"android:minHeight="72dp"android:updatePeriodMillis="86400000"android:initialLayout="@layout/example_appwidget"></appwidget-provider>

example_appwidget.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical" >    <TextView        android:id="@+id/appwidget"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="firstAppWidget"        android:background="#000000"/>    <Button         android:id="@+id/button"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="test"/></LinearLayout>

ExampleAppWidgetProvider.java

public class ExampleAppWidgetProvider extends AppWidgetProvider {@Overridepublic void onDeleted(Context context, int[] appWidgetIds) {super.onDeleted(context, appWidgetIds);}@Overridepublic void onDisabled(Context context) {super.onDisabled(context);}@Overridepublic void onEnabled(Context context) {super.onEnabled(context);}@Overridepublic void onReceive(Context context, Intent intent) {super.onReceive(context, intent);}@Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {super.onUpdate(context, appWidgetManager, appWidgetIds);for(int i=0;i<appWidgetIds.length;i++){//新建一个Intent,表示从当前启动TargetActivityIntent intent=new Intent(context,TargetActivity.class);//启动一个PendingIntent,表示对Intent的封装,挂起PendingIntent pendingIntent=PendingIntent.getActivity(context, 0, intent, 0);//表示得到所有的远程ViewRemoteViews remoteViews=new RemoteViews(context.getPackageName(),R.layout.example_appwidget);/** * 设置哪个View和PendingIntent绑定 * 第一个参数表示监听的View的Id * 第二个参数表示触发的PendingIntent */remoteViews.setOnClickPendingIntent(R.id.button, pendingIntent);//由appWidget管理器执行更新操作appWidgetManager.updateAppWidget(appWidgetIds[i], remoteViews);}}}

TargetActivity.java

public class TargetActivity extends Activity {private TextView text;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);text=(TextView)findViewById(R.id.text);text.setText("TargetActivity");}}

被启动的Activity很简单,就是显示一句话。

最后别忘了在Manifest中对receiver和Activity进行注册

        <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>        <activity android:name=".TargetActivity" android:label="@string/app_name"/>

整个项目的结构图:


0 0
原创粉丝点击