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

使用AppWidget进行广播更新

2013-09-06 21:42 423 查看


 



 



 

 

 



 

 

 

 

 

使用AppWidget进行广播
 
android.appwidget包中定义的类:
1、        AppWidgetProvider:定义了AppWidget的基本操作,需要通过子类进行设置;
2、        AppWidgetProviderInfo:AppWidget组件的元数据提供者,例如:组件的大小、更新的时间等;
3、        AppWidgetHostView:创建AppWidget的View显示,些为真正的View,与之对应的还有一个RemoteView;
4、        AppWidgetHost:监听AppWidget的服务以及创建AppWidgetHostView
5、        AppWidgetManager:用于更新相应的AppWidget。
 
将本程序安装后,按Home键回到手机桌面,长按桌面后出现上下文对话框,此时选择“窗口小部件”,接着找到我们安装的程序,
我这里的程序名称为“桌面显示组件”,这样在我们的手机桌面上就出现了程序的快捷方式,我们一按此快捷方式就可以进行更新了。
 
  本列子说明了如何进行按钮的更新,但是一般不会对按钮进行更新,本列子只为说明更新的方法。
 

 

在res/drawable-hdpi下加入一张名为button和一张名为button2的图片以供使用。
 
 
 
定义一个继承AppWidgetProvider的类MyAppWidget,代码如下:
 
package com.li.appwidget;
 
import android.annotation.SuppressLint;
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.widget.RemoteViews;
 
@SuppressLint("ParserError")
public class MyAppWidget extends AppWidgetProvider {
 
  @Override
  public void onReceive(Context context, Intent intent) {
    if("com.li.action.MYAPPWIDGET_UPDATE".equals(intent.getAction())){
       RemoteViews remote = new RemoteViews(context.getPackageName(),
            R.layout.liyewen_appwidget);
       remote.setImageViewResource(R.id.img, R.drawable.button2);
       remote.setTextViewText(R.id.but, "按钮被更新了");  //更新按钮上的文字
       AppWidgetManager appWidgetManager = AppWidgetManager
            .getInstance(context);
       ComponentName componentName = new ComponentName(
            context,MyAppWidget.class);
       appWidgetManager.updateAppWidget(componentName, remote);
     }
     else{
       super.onReceive(context, intent);
    }
  }
 
  @Override
  public void onUpdate(Context context, AppWidgetManager appWidgetManager,
       int[] appWidgetIds) {
       Intent intent = new Intent();
       intent.setAction("com.li.action.MYAPPWIDGET_UPDATE");
       PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0,
            intent, PendingIntent.FLAG_UPDATE_CURRENT);
       RemoteViews remote = new RemoteViews(context.getPackageName(),
            R.layout.liyewen_appwidget);
       remote.setOnClickPendingIntent(R.id.but, pendingIntent);
       appWidgetManager.updateAppWidget(appWidgetIds, remote);
     }
}
 
 
 
 
 
 
 
在res下新建xml文件夹,并在xml下新建一个资源配置文件liyewen_appwidget.xml,
此文件用于读取AppWidgetProvider的配置信息,代码如下:
 
<appwidget-provider
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:minHeight="80dp"
    android:minWidth="300dp"
    android:updatePeriodMillis="6000"
    android:initialLayout="@layout/liyewen_appwidget">
 
 
</appwidget-provider>
 
 
 
 
 
 
在layout文件夹中新建布局文件liyewen_appwidget.xml
此布局文件用于以后桌面组件的显示,代码如下:
 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center_horizontal">
  <ImageView
      android:id="@+id/img"
      android:layout_width="160dp"
      android:layout_height="40dp"
      android:src="@drawable/button"/>
  <Button
      android:id="@+id/but"
      android:layout_width="160dp"
      android:layout_height="40dp"
      android:background="#00000000"
      android:text="按我更新按钮"
      android:textColor="#ffffff"/>
</RelativeLayout >
 
 
 
 
 
 
 
修改AndroidManifest.xml文件,将之前在res/xml文件夹中配置的文件定义在广播之中。
增加的部分为:
 
<receiver android:name=".MyAppWidget">
            <intent-filter >
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
            </intent-filter>
            <intent-filter >
                <action android:name="com.li.action.MYAPPWIDGET_UPDATE"/>
            </intent-filter>
            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/liyewen_appwidget"/>
</receiver>
 
 
 
 
整个AndroidManifest.xml文件为(我用的SDK是最新的,所以AndroidManifest.xml文件会有些不同):
 
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.li.appwidget"
    android:versionCode="1"
    android:versionName="1.0" >
 
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="15" />
 
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MyAppWidgetDemo"
            android:label="@string/title_activity_my_app_widget_demo" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver android:name=".MyAppWidget">
            <intent-filter >
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
            </intent-filter>
            <intent-filter >
                <action android:name="com.li.action.MYAPPWIDGET_UPDATE"/>
            </intent-filter>
            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/liyewen_appwidget"/>
        </receiver>
    </application>
</manifest>
 
 
 
 
 
主Activity(MyAppWidgetDemo.java)的代码如下:
 
 
package com.li.appwidget;
 
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.support.v4.app.NavUtils;
 
public class MyAppWidgetDemo extends Activity {
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
 
}
 
 
 
主布局文件main.xml不用做任何修改
 
 

 

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