Android入门之App Widget(2)

本章节将涉及到两个类,PendingIntent和RemoteViews。

PendingIntent:

PendingIntent类是封装了Intent,表示将一个封装了的Intent从一个对象传给另外一个对象,当另一个对象收到某个事件之后,触发Intent执行。假如这个另一个对象收到PendingIntent而没有对对应的时间去触发它,它将不会执行。(好比:甲写了一条妙计给乙,叫乙遇到困难的时候拿出来用,当乙真遇到了困难的时候,这条妙计可派上用场,当乙不会遇到困难的时候,这条妙计将不会派上用场,PendingIntent就相当于这条妙计)。

创建PendingIntent的三种方法:

1、public static PendingIntent getActivity(Context context, int requestCode,
            Intent intent, int flags)

2、public static PendingIntent getBroadcast(Context context, int requestCode,
            Intent intent, int flags)


3、public static PendingIntent getService(Context context, int requestCode,
            Intent intent, int flags)

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

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

接着上一个例子,为App Widget中添加button,在example_appwidget.xml文件里面添加:

<Button
    Android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="测试按钮"
    android:id="@+id/button"
/>

为Button绑定处理器:
注意:由于App Widget和我们的应用程序运行在不同的进程当中(App Widget当中的View运行在HomeScreen进程当中),所以无法按照之前惯用的方法绑定监听器。
RemoteViews.setOnClickPendingIntent(int viewId, PendingIntent pendingIntent)

例子:在android入门之App Widget(二) 为App widget添加一个Button,实现功能,当点击Button时,将跳转到另外一个Activity里面去。

在res/layout中添加三个xml文件:

分别为:

example_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:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="firstWidgetText"
    android:id="@+id/widgetTextld"
    android:background="#0000FF"
    />
<Button
 android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="测试按钮"
    android:id="@+id/button"
/>
</LinearLayout>

othermain.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:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/other"
    />
</LinearLayout>

main.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:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello"
    />
</LinearLayout>

在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>

在androidManifest.xml文件application节点之间添加如下代码:

<activity android:name=".OtherActivity"/><!-- 註冊 OtherActivity-->

<receiver android:name=".AppWidgetProviderTest">
   <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"></meta-data>
  </receiver>

配置文件就配置到这里就可以了。下面是java代码:

新建一个AppWidgetProviderTest类继承AppWidgetProvider类,内容如下:

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 {

// 接收广播事件
 @Override
 public void onReceive(Context context, Intent intent) {
  System.out.println("onReceive");
  super.onReceive(context, intent);
 }

// 当App widget被删除时,会调用该方法
 @Override
 public void onDeleted(Context context, int[] appWidgetIds) {
  System.out.println("onDeleted");
  super.onDeleted(context, appWidgetIds);
 }

// 当一个App widget得实例第一次被创建时,会调用该方法
 @Override
 public void onEnabled(Context context) {
  System.out.println("onEnabled");
  super.onEnabled(context);
 }

// 当最后一个App widget实例被删除后,会调用该方法
 @Override
 public void onDisabled(Context context) {
  System.out.println("onDisabled");
  super.onDisabled(context);
 }

// 在到达指定的更新时间之后或者当用户桌面添加App widget时会调用该方法
 @Override
 public void onUpdate(Context context, AppWidgetManager appWidgetManager,
   int[] appWidgetIds) {
  System.out.println("onUpdate");

for (int i = 0; i < appWidgetIds.length; i++) {
   System.out.println(appWidgetIds[i]);
   // 创建一个Intent对象
   Intent intent = new Intent(context, OtherActivity.class);
   // 创建一个PendingIntent
   PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
     intent, 0);
   RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
     R.layout.example_appwidget);
   // 为按钮绑定时间处理器
   remoteViews.setOnClickPendingIntent(R.id.button, pendingIntent);
   appWidgetManager.updateAppWidget(appWidgetIds[i], remoteViews);
  }
  super.onUpdate(context, appWidgetManager, appWidgetIds);
 }
}

再创建一个Activity类,名字为:OtherActivity.java,这个activity什么都不做,

import android.app.Activity;
import android.os.Bundle;

public class OtherActivity extends Activity {
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.othermain);
    }
}

到这里,系统就可以运行了,创建了一个App Widget。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwgzyw.html