桌面组件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包(注意这次不要把它在从电脑中误删喽!!!),
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对象 表示对象运行在另外一个进程当中
2.想要实现桌面组件,还需要在res的目录下建一个文件夹,里面包含一个XML文件,内容如下
3.看看主活动里面的内容:
4.亲、今天不是添加的权限,但是也是不能忘记添加的receiver
5.运行结果如下:首先长按桌面--->窗口小部件----->appwidgetTest---->结果,点击按钮切换图片和文本
解决步骤如下:
首先,以后 在导入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就可以了
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---->结果,点击按钮切换图片和文本
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!