一、PendingIntent介绍
PendingIntent用于处理即将发生的事情。比如在通知Notification中用于跳转页面,但不是马上跳转。创建之后并不马上使用。PendingIntent用于包装Intent,在一个进程中创建PendingIntent,但是该进程并不会使用它,而是把它交给另外一个进程,当这个进程被触发某个事件时就会使用PendingIntent,这两个进程就相当于AppWidget和我们自己写的程序。
创建PendingIntent的方法有三个(都是静态方法):
1. 启动一个activity
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的作用
RemoteView表示View和主程序不在同一个进程当中。例如一个App Widget就是RemoteView,因为App Widget和主程序就不是在同一个进程当中的。
1. RemoteViews对象表示了一系列的View对象。
2. RemoteViews所表示的对象运行在另外的进程当中。所以就不能够像普通的View那样去操作。
三、在AppWidget当中使用控件
1.向AppWidget中添加ImageButton,res/layout/appwidget.xml
2.res/xml/appwidget_info.xml
3.为Button绑定监听器
由于AppWidget和应用程序运行在不同的进程当中(AppWidget当中的View运行在Home Screen进程当中),所以无法按照之前惯用的方法绑定监听器。
AppWidgetProviderTest.java
package com.android.activity; import android.app.PendingIntent; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.Context; import android.content.Intent; import android.widget.RemoteViews; public class AppWidgetProviderTest extends AppWidgetProvider{ /** * AppWIdgetManager对象用来管理widget对象 * appWidgetIds每次向桌面添加的widget都会有一个id */ @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) { for(int i = 0; i < appWidgetIds.length; i++){ System.out.println(appWidgetIds[i]); //创建一个Intent对象,跳转activity Intent intent = new Intent(context, OtherActivity.class); //创建一个PendingIntent PendingIntent pendingIntent = PendingIntent .getActivity(context, 0, intent, 0); //得到remoteViews代表了AppWIdget里面的所有控件 RemoteViews remoteViews = new RemoteViews( context.getPackageName(), R.layout.appwidget); //设置点击事件就执行,参数:指定被绑定控件的id;当事件发生时,哪个PendingIntent执行 remoteViews.setOnClickPendingIntent( R.id.widgetbutton, pendingIntent); //更新Appwidget,指定更新哪一个控件的id,要更新的remoteviews对象 appWidgetManager.updateAppWidget( appWidgetIds[i], remoteViews); } super.onUpdate(context, appWidgetManager, appWidgetIds); } @Override public void onDeleted(Context context, int[] appWidgetIds) { System.out.println("AppWidgetProvider --> onDeleted"); super.onDeleted(context, appWidgetIds); } @Override public void onDisabled(Context context) { System.out.println("AppWidgetProvider --> onDisabled"); super.onDisabled(context); } @Override public void onEnabled(Context context) { System.out.println("AppWidgetProvider --> onEnabled"); super.onEnabled(context); } }
运行结果: