您的位置:首页 > 移动开发

AppWidget,及其与广播的相关处理

2012-03-29 13:21 288 查看
1.什么叫AppWidget?既是手机桌面放置的控件,shortcuts是快捷方式

2.AppWidgetProviderInfo对象是为AppWiget提供元数据,包括布局更新频率等数据,被定义在xml文件中

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

在layout下新建一个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/tv"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:text="firstappwidget"

        android:background="#000000"/>

       <ImageView android:id="@+id/iv"

             android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:src="@drawable/a" />

    <Button android:id="@+id/btn"

        android:layout_width="200px"

        android:layout_height="50px"

        android:text="btn "  />

  </LinearLayout>

在清单中新加receiver

 <receiver android:name="ExampleAppWidget">

            <intent-filter>

               <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>

               </intent-filter>

               <intent-filter>

               <action android:name="cys.03.appwidget.UPDATE_WIDGET"/>

               </intent-filter>

               <meta-data android:name="android.appwidget.provider"

                            android:resource="@xml/example_appwidget_info"/>/

        </receiver>

两个intent-filter是等价的过滤器,任何一个满足条件就可以发送广播

meta-data,是为AppWidget 提供数据

主Activity与mainxml文件无关重要,src下新建一个ExampleWidget.java文件

package ntc.appwidget;

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.util.Log;

import android.widget.RemoteViews;

 

 

public class ExampleAppWidget extends AppWidgetProvider {

 private static final String UPDATE_ACTION="cys.03.appwidget.UPDATE_WIDGET";

 @Override

 public void onDeleted(Context context, int[] appWidgetIds) {//删除时调用这函数

  // TODO Auto-generated method stub

  super.onDeleted(context, appWidgetIds);

  

  Log.e("onDelete", "======");

 }

 @Override

 public void onDisabled(Context context) {//删除最后一个时候,调用这函数

  

  // TODO Auto-generated method stub

  super.onDisabled(context);

  Log.e("onDisabled", "======");

 }

 @Override

 public void onEnabled(Context context) {//第一次调用AppWiget时候调用这个函数

  // TODO Auto-generated method stub

  super.onEnabled(context);

  Log.e("onEnabled", "======");

 }

 @Override

 public void onReceive(Context context, Intent intent) {//接收广播时调用这函数

  // TODO Auto-generated method stub

  

  if(intent.getAction().equals(UPDATE_ACTION)){

   

   RemoteViews remoteviews=new RemoteViews(context.getPackageName(),R.layout .example_appwidget );

   

   remoteviews.setImageViewResource(R.id.iv, R.drawable.b);

   remoteviews.setTextViewText(R.id.tv, "Smile:"+")");

   

   AppWidgetManager appwidgetmanager=AppWidgetManager.getInstance(context);

   ComponentName compentname=new ComponentName(context,ExampleAppWidget.class);

   appwidgetmanager.updateAppWidget(compentname, remoteviews);

   

   

  }

  

  

  

  

  else{

  super.onReceive(context, intent);}//else 作用是当 没有发送广播时还可以调用这个方法,注意第二次以上点击button会促发else的事件

  Log.e("onReceive", "======");

 }

 @Override

 public void onUpdate(Context context, AppWidgetManager appWidgetManager,

   int[] appWidgetIds) {//调用AppWidget时调用这函数

  // TODO Auto-generated method stub

  super.onUpdate(context, appWidgetManager, appWidgetIds);

  Log.e("onUpdate", "======");

  Intent intent=new Intent();

  intent.setAction(UPDATE_ACTION);

  PendingIntent pendingIntent=PendingIntent.getBroadcast(context, 0, intent, 0);//获取广播

  RemoteViews remoteviews=new RemoteViews(context.getPackageName(),R.layout.example_appwidget);

  remoteviews.setOnClickPendingIntent(R.id.btn, pendingIntent);//发送广播

 appWidgetManager.updateAppWidget(appWidgetIds, remoteviews);

  

  

  

  

  

  

  

 }

  

  

//注,每个intent事件都是由receive方法执行的究竟执行哪个方法是依据intent的Action所决定的,当remoteviews发生变化时会执行receive方法

 //remoteviews是appwidget 的控件,ComponentName是整个appwidget

 

 

}

 

 

 

 

 

 

 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息