桌面组件Appwidget的应用实例以及导入第三方jar包的问题解决

                      暑假第十九天,早上7点的时候打开eclipse发现自己昨天做的天气预报有错,很诡异,在eclipse的工程前面有一个小错号,但是却没有报什么地方有错,于是,自己用傻类吧唧的重新再建一个工程,重新导入第三方的jar包sax2r2.jar的包,注意就是这个包的路径出现了错误,由于我把sax2r2.jar放在桌面上,用完感觉到没什么用后就直接删了,然后重启一下eclipse后就发现了工程前面有错好,当时那个纠结加郁闷,于是上网上搜索了一下,再加上学长的提示,终于把这个问题解决了,
解决步骤如下:
               首先,以后 在导入jar包的时候最好把jar包放入到自己建的工程里,这样当再次使用的时候,自己导入的jar包就不会因为丢失而郁闷路径path的问题了,
              其次,如果不小心把jar包给删了,解决的方法如下:在自己的工程右键选择properties---Java Build Path ----Libraries----sax2r2.jar(选中导入的jar包)会出现错号,或者显示jar包miss丢失,如果出现这种情况,直接选中,然后Remove,然后再重新导入一下jar包(注意这次不要把它在从电脑中误删喽!!!),

导入jar步骤如下:在自己的工程右键选择properties---Java Build Path ----Libraries----Add External JARS--选择电脑中的jar包---然后同一个界面下的Order and Export 在自己导入的jar包前勾选,然后点击OK就可以了    


2,今天解决的第二个问题,在多个Xml文件进行布局调用多个Activity时候,由于导包错误,导致自己定义布局的mapview.XML找不到layout,既setContentView(R.layout.mapview);找不到在R.java文件中注册的id,解决方法是直接删除 import android.R;从新导入自己包中的R.这样问题就可以解决了。


3.今天学习的内容是app widget  其中两个重要的东西,

AppWidgetProviderInfo对象    为App widget提供元数据(布局、更新频率等等)
AppWidgetProvider定义App Widget的基本生命周期函数
PendingIntent 类似锦囊的意思 
创建方法有:1、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 表示一系列的View对象 表示对象运行在另外一个进程当中


4.注意AppWidget和主程序不在同一个进程当中,不能用普通的方法进行操作,但可以用一下方法,比如:RemoteView是中的一些方法,

好了废话不多说了,看看今天要实现的桌面组件AppWidget的过程

1.首先先看布局 一个简单的文本,图片、和按钮

<?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/app"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="暑假第二十天下午好!!!" 
        android:textColor="#FF6130"
        />

    <ImageView
        android:id="@+id/image"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:src="@drawable/a" />

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

</LinearLayout>

2.想要实现桌面组件,还需要在res的目录下建一个文件夹,里面包含一个XML文件,内容如下

<?xml version="1.0" encoding="UTF-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minHeight="80dp"
android:minWidth="300dp"
android:updatePeriodMillis="30000"
android:initialLayout="@layout/appwidget">

</appwidget-provider>

3.看看主活动里面的内容:

package com.wang.provider;

import com.wang.R;

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;

public class Appwidgetprovider extends AppWidgetProvider {
	// 常量字符串用于命名Action
	private static final String UPDATE_ACTION = "wang.UPDATE_APP_WIDGET";
	
	//调用自身的方法
	public void onDeleted(Context context, int[] appWidgetIds) {
	}

	@Override
	public void onDisabled(Context context) {
	}

	@Override
	public void onEnabled(Context context) {
	}

	@Override
	public void onReceive(Context context, Intent intent) {
         // 获取当前的意图动作
		String action = intent.getAction();
		
		if (UPDATE_ACTION.equals(action)) {
           //描述了一个视图层次结构,可以显示在另一个进程
			//创建一个新的RemoteViews对象将显示视图包含在指定的布局文件。
			RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
					R.layout.appwidget);
			//设置图片资源
			remoteViews.setImageViewResource(R.id.image, R.drawable.b);
			//设置文本内容
			remoteViews.setTextViewText(R.id.app, "今天都学到了什么???");
			//获取AppWidgetManager实例用于提供的上下文对象
			AppWidgetManager appWidgetManager = AppWidgetManager
					.getInstance(context);
			/*****ComponentName为一个特定的应用程序组件的标识符(活动、服务,
			 * 或ContentProvider BroadcastReceiver)可用。
			 * 两条信息,封装在这里,都必须确定一个组件:这个包(一个字符串),
			 *  它存在于,类(一个字符串)的名字里面的包
			***/
			ComponentName componentName = new ComponentName(context,
					AppWidgetProvider.class);
			/***设置RemoteViews用于所有实例AppWidget为所提供AppWidget提供者。  
			 * 调用这个方法既在一个ACTION_APPWIDGET_UPDATE广播、内外的处理程序。
			 * 这种方法只会工作,当调用从uid,拥有AppWidget提供者。更新appwidget**/
			appWidgetManager.updateAppWidget(componentName, remoteViews);

		} else {
			//实现接受上下文的的方法和意图
			super.onReceive(context, intent);

		}

	}

	@Override
	public void onUpdate(Context context, AppWidgetManager appWidgetManager,
			int[] appWidgetIds) {
		// for (int i = 0; i < appWidgetIds.length; i++) {
		//			
		// System.out.println(appWidgetIds[i]);
		// //创建一个intent的对象
		// Intent intent =new Intent(context,Target.class);
		// //创建一个pendingitent对象
		// PendingIntent pendingIntent=PendingIntent.getActivity(context, 0,
		// intent, 0);
		// RemoteViews remoteViews=new
		// RemoteViews(context.getPackageName(),R.layout.appwidget);
		// //为按钮绑定事件处理器
		// //,第一个参数用来指定被绑定的处理器的的ID
		// //第二个参数是用来指定当事件发生时候,哪一个pendingintent会被执行
		// remoteViews.setOnClickPendingIntent(R.id.button, pendingIntent);
		// ///g更新Appwidget
		// appWidgetManager.updateAppWidget(appWidgetIds[i], remoteViews);
		// }

		Intent intent = new Intent();
		// 为intent对象设置Action
		intent.setAction(UPDATE_ACTION);
		// 使用getBroadcast方法得到一个对象,当该对象执行时候,将发送一个广播
		PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0,
				intent, 0);
		//声明一个RemoteViews的对象
		RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
				R.layout.appwidget);
        //设置点击事件
		remoteViews.setOnClickPendingIntent(R.id.button, pendingIntent);
		// /g更新Appwidget
		appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);
	}

}

4.亲、今天不是添加的权限,但是也是不能忘记添加的receiver

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.wang"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="10" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".AppWidgetTestActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver android:name="Appwidgetprovider" >
            
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>
            
            <intent-filter>
                <action android:name="wang.UPDATE_APP_WIDGET" />
            </intent-filter>
            <!-- 元数据 -->
            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/appwidgettest" />
        </receiver>
    </application>

</manifest>

5.运行结果如下:首先长按桌面--->窗口小部件----->appwidgetTest---->结果,点击按钮切换图片和文本





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员Android

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值