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

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

 

 


}

 

 

 

 

 

 

 

 

 

 

 

阅读更多
换一批

没有更多推荐了,返回首页