2011.10.19(3)——— android 一个便签的Widget例子
参考:
http://blog.csdn.net/silenceburn/article/details/6093074
写一个widget的大致流程:
1. AppWidgetProvider 的实现
2. widget外观布局定义文件
3. 新增widget时的配置Activity的实现(可选)
4. widget 参数配置文件
5. 修改AndroidManifest.xml
3是可选的 例如http://www.cnblogs.com/TerryBlog/archive/2010/07/29/1788319.html就没有Activity界面
首先 搭一个Widget的框架
1、AppWidgetProvider 的实现
package com.lp.love;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
public class LoveNote extends AppWidgetProvider{
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
// TODO Auto-generated method stub
super.onDeleted(context, appWidgetIds);
System.out.println("onDeleted");
}
@Override
public void onDisabled(Context context) {
// TODO Auto-generated method stub
super.onDisabled(context);
System.out.println("onDisabled");
}
@Override
public void onEnabled(Context context) {
// TODO Auto-generated method stub
super.onEnabled(context);
System.out.println("onEnabled");
}
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
super.onReceive(context, intent);
System.out.println("onReceive");
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
// TODO Auto-generated method stub
super.onUpdate(context, appWidgetManager, appWidgetIds);
System.out.println("onUpdate");
}
}
2. widget外观布局定义文件
这个就是在桌面你的widget的样子 我们的是一张图片
<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/sketchy_paper_008"
android:clickable="true"/>
3、新增widget时的配置Activity的实现(可选)
package com.lp.love;
import android.app.Activity;
import android.appwidget.AppWidgetManager;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.ImageButton;
/**
* 该activity在系统新增widget时 被调用
*
* @author lp
* lipeng88213@126.com
* http://lipeng88213.iteye.com/
* 2011-10-19
* 下午05:35:48
*/
public class ShowActivity extends Activity{
private int mAppWidgetId;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.show);
System.out.println("Activity");
Intent intent = getIntent();
Bundle extras = intent.getExtras();
//得到widget传过来的id 每一个widget就有一个id 都不相同
if (extras != null) {
mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
}
System.out.println(mAppWidgetId);
// If they gave us an intent without the widget id, just bail.
if (mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {
finish();
}
//最后我们必须返回一个RESULT_OK的Intent,并结束当前Activity,系统才会认为配置成功,在桌面上放置这个widget{
Intent resultValue = new Intent();
resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
mAppWidgetId);
setResult(RESULT_OK, resultValue);
finish();
//}
}
}
4. widget 参数配置文件
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="72dp" android:minHeight="72dp"
android:updatePeriodMillis="86400000" android:initialLayout="@layout/img"
android:configure="com.lp.love.ShowActivity">
</appwidget-provider>
minWidth minHeight 用来指定widget的大小,如果我们只占用一个格子,也就是俗称的1X1,
那么72dp的长宽是android平台推荐的一个最佳实践值。
initialLayout 参数关联了我们编写好的 layout 文件,指定widget的样子
configure 参数关联了我们编写好的配置用Activity 当然这个也是可选的
updatePeriodMills 指定widget的刷新周期,
5、修改清单文件
声明一个receiver,过滤 android.appwidget.action.APPWIDGET_UPDATE ,
并且用metadata关联到我们自己编写的 appWidgetProvider 实现。
声明一个activity关联到我们的配置类 ShowActivity,过滤 android.appwidget.action.APPWIDGET_CONFIGURE。
最后修改一下应用图标,此图标会出现在系统的新增widget列表中。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.lp.love"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="7" />
<application android:icon="@drawable/sketchy_paper_008" android:label="@string/app_name">
<receiver android:name=".LoveNote">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/widget_lovenote" />
</receiver>
<activity android:name=".ShowActivity">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
</intent-filter>
</activity>
</application>
</manifest>
好了 上面的 就是一个基本的Widget了 [/size]
下面 我们来增加功能 使其具有便签的功能
主要更改了Activity
ShowActivity.java
package com.lp.love;
import android.app.Activity;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.RemoteViews;
/**
* 该activity在系统新增widget时 被调用
*
* @author lp
* lipeng88213@126.com
* http://lipeng88213.iteye.com/
* 2011-10-19
* 下午05:35:48
*/
public class ShowActivity extends Activity implements OnClickListener{
private int mAppWidgetId;
private ImageButton btn_msg;
private ImageButton btn_pc;
private ImageButton btn_email;
private ImageButton btn_home;
private EditText et;
private final String mPerfName = "com.lp.love";
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.show);
System.out.println("Activity");
Intent intent = getIntent();
Bundle extras = intent.getExtras();
//得到widget传过来的id 每一个widget就有一个id 都不相同
if (extras != null) {
mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
}
System.out.println(mAppWidgetId);
// If they gave us an intent without the widget id, just bail.
if (mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {
finish();
}
btn_msg = (ImageButton)findViewById(R.id.btn_msg);
btn_pc = (ImageButton)findViewById(R.id.btn_pc);
btn_email = (ImageButton)findViewById(R.id.btn_email);
btn_home = (ImageButton)findViewById(R.id.btn_home);
btn_msg.setOnClickListener(this);
btn_pc.setOnClickListener(this);
btn_email.setOnClickListener(this);
btn_home.setOnClickListener(this);
et = (EditText)findViewById(R.id.msg);
}
@Override
public void onClick(View v) {
//桌面显示的图标 这个是默认的
int iconId = R.drawable.sketchy_paper_008;
switch(v.getId()){
case R.id.btn_msg:
iconId = R.drawable.sketchy_paper_003;
break;
case R.id.btn_pc:
iconId = R.drawable.sketchy_paper_004;
break;
case R.id.btn_email:
iconId = R.drawable.sketchy_paper_007;
break;
case R.id.btn_home:
iconId = R.drawable.sketchy_paper_011;
break;
}
String msg = et.getText().toString();
//保存消息{
SharedPreferences.Editor prefs = this.getSharedPreferences(mPerfName, 0).edit();
prefs.putString("note" + mAppWidgetId, msg);
prefs.commit();
//}
//处理桌面widget的点击事件{
//获取 RemoteViews 关联到我们的widget,设置widget的imageSrc为新的图片,
RemoteViews views = new RemoteViews(this.getPackageName(), R.layout.img);
views.setImageViewResource(R.id.img, iconId);
//当被点击的时候 就相当于要修改 所以我们需要建一个修改的Activity
Intent intent = new Intent(this, LoveNoteEdit.class);
/**
* 注意这里我们使用intent.setAction(mPerfName + mAppWidgetId);为每个widget赋予了独一无二的Action。
否则获得的pendingIntent实际是同一个实例,仅extraData不同,根据创建pendingIntent方法的不同,
extraData可能会被覆盖或者只初始化一次不再改变(getActivity的最后一个参数flags决定)。
这样我们在pendingIntent中就只能得到第一个新增的widget的Id,或者最后一次新增的widget的Id,
这显然不是我们希望看到的。
*/
intent.setAction(mPerfName + mAppWidgetId);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,mAppWidgetId);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
intent, 0);
views.setOnClickPendingIntent(R.id.img, pendingIntent);
//设置完成后需要获取AppWidgetManager,对指定的widget进行更新,才能使设置生效。
AppWidgetManager appWidgetManager = AppWidgetManager
.getInstance(this);
appWidgetManager.updateAppWidget(mAppWidgetId, views);
//}
//最后我们必须返回一个RESULT_OK的Intent,并结束当前Activity,系统才会认为配置成功,在桌面上放置这个widget{
Intent resultValue = new Intent();
resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
mAppWidgetId);
setResult(RESULT_OK, resultValue);
finish();
//}
}
}
然后 新增了一个Edit的Activity
package com.lp.love;
import android.app.Activity;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.RemoteViews;
/**
* 修改
*
* @author lp
* lipeng88213@126.com
* http://lipeng88213.iteye.com/
* 2011-10-19
* 下午06:27:15
*/
public class LoveNoteEdit extends Activity implements OnClickListener{
private int mAppWidgetId;
private ImageButton btn_msg;
private ImageButton btn_pc;
private ImageButton btn_email;
private ImageButton btn_home;
private EditText et;
private final String mPerfName = "com.lp.love";
private SharedPreferences mPref;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.show);
System.out.println("Activity");
Intent t = getIntent();
System.out.println(t.getAction());
mAppWidgetId = t.getExtras().getInt(
AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
mPref = getSharedPreferences(mPerfName, 0);
String noteContent = mPref.getString("note" + mAppWidgetId, "");
btn_msg = (ImageButton)findViewById(R.id.btn_msg);
btn_pc = (ImageButton)findViewById(R.id.btn_pc);
btn_email = (ImageButton)findViewById(R.id.btn_email);
btn_home = (ImageButton)findViewById(R.id.btn_home);
btn_msg.setOnClickListener(this);
btn_pc.setOnClickListener(this);
btn_email.setOnClickListener(this);
btn_home.setOnClickListener(this);
et = (EditText)findViewById(R.id.msg);
et.setText(noteContent);
}
@Override
public void onClick(View v) {
//桌面显示的图标 这个是默认的
int iconId = R.drawable.sketchy_paper_008;
switch(v.getId()){
case R.id.btn_msg:
iconId = R.drawable.sketchy_paper_003;
break;
case R.id.btn_pc:
iconId = R.drawable.sketchy_paper_004;
break;
case R.id.btn_email:
iconId = R.drawable.sketchy_paper_007;
break;
case R.id.btn_home:
iconId = R.drawable.sketchy_paper_011;
break;
}
String msg = et.getText().toString();
//保存消息{
SharedPreferences.Editor prefs = mPref.edit();
prefs.putString("note" + mAppWidgetId, msg);
prefs.commit();
//}
//处理桌面widget的点击事件{
RemoteViews views = new RemoteViews(this.getPackageName(), R.layout.img);
views.setImageViewResource(R.id.img, iconId);
//设置完成后需要获取AppWidgetManager,对指定的widget进行更新,才能使设置生效。
AppWidgetManager appWidgetManager = AppWidgetManager
.getInstance(this);
appWidgetManager.updateAppWidget(mAppWidgetId, views);
//}
this.finish();
}
}
PendingIntent: 参考http://yinter.iteye.com/blog/803839
http://www.7dot9.com/2011/04/android-pendingintent%E7%9A%84%E4%B8%80%E4%BA%9B%E5%B0%8F%E8%BF%B7%E6%83%91/
RemoteViews:参考:
http://www.android123.com.cn/androidkaifa/320.html
AppWidgetManager: 参考:http://www.cnblogs.com/TerryBlog/archive/2010/07/29/1788319.html
分享到:
相关推荐
计算机视觉大作业——三维重建.zip计算机视觉大作业——三维重建.zip计算机视觉大作业——三维重建.zip计算机视觉大作业——三维重建.zip计算机视觉大作业——三维重建.zip计算机视觉大作业——三维重建.zip计算机...
基于因子分析的我国A股上市...争力评价——以医药企业为例_张澳.caj
▕ ▕ ▕—————————————————————————————————————— ▕ ▕——[13.27MB] 【NPSWF32调试版本_11.1.102.55_debug】 ▕ ▕ ▕——[856 B] flashplayer.xpt ▕ ▕ ▕——[3.90MB...
1,安装说明.txt ——————————安装手册 2,jdk-170.tar.gz ——————————JDK1.7deb包 3,switch_java.sh -------------------------java其它版本切换 4,check_java.sh———————————版本...
python项目——Word助手.zip python项目——Word助手.zip python项目——Word助手.zip python项目——Word助手.zip python项目——Word助手.zip python项目——Word助手.zip python项目——Word助手.zip python项目...
5. 几条直线,一头黄牛,一弯新月,一轮圆月,一只猫,一个月亮,一只鸭子,一个苹果,一只鸟,一个杏子,一栋楼房,一扇门,一颗枣,一双鞋子,一个西瓜,一件衣服,一个桃,一瓶墨水,一块手表,一把雨伞,一朵花...
python项目——RCQ读者书库.zip python项目——RCQ读者书库.zip python项目——RCQ读者书库.zip python项目——RCQ读者书库.zip python项目——RCQ读者书库.zip python项目——RCQ读者书库.zip python项目——RCQ...
微信小程序——新闻客户端(截图+源码).zip 微信小程序——新闻客户端(截图+源码).zip 微信小程序——新闻客户端(截图+源码).zip 微信小程序——新闻客户端(截图+源码).zip 微信小程序——新闻客户端(截图+...
录音软件MP3——Cooolsoft MP3 Sound Recorder2.88汉化版.exe录音软件MP3——Cooolsoft MP3 Sound Recorder2.88汉化版.exe录音软件MP3——Cooolsoft MP3 Sound Recorder2.88汉化版.exe录音软件MP3——Cooolsoft MP3 ...
Android support.v7包
Android中文翻译组——Android中文API合集(4).chm
【标题】与【描述】提及的是关于小学语文学习中的一个重要组成部分——歇后语。歇后语是中国传统文化中的一种独特语言现象,它结合了形象生动的比喻和巧妙的谐音,通常用于表达幽默、讽刺或者寓意深刻的观点。这些歇...
1.深入了解Android蓝牙Bluetooth——《基础篇》 2.深入了解Android蓝牙Bluetooth——《进级篇》 2.深入了解Android蓝牙Bluetooth——《总结篇》 欢迎入群 QQ交流群 :232203809 微信公众号:终端研发部。加入我们...
应用层包过滤防火墙 一个简单的应用层包过滤防火墙实现 Qt/SQLite/NetFilter 编译过程可使用QtCreator编译,也可使用命令行 sudo qmake && make 来编译。 运行则执行 sudo ./firewall 即可。
使用Axure设计三级联动选择器(如省市区选择器)时,可以利用中继器的数据存储和动态交互功能来实现。...———————————————— 原文链接:https://blog.csdn.net/u010709330/article/details/143576305
java毕业设计——基于java的动力节点系统的设计与实现(源码+数据库).zip java毕业设计——基于java的动力节点系统的设计与实现(源码+数据库).zip java毕业设计——基于java的动力节点系统的设计与实现(源码+数据库)....
每行记录了一个文件或一个条目的SHA-256散列值,这个散列值是对文件内容进行SHA-256哈希计算的结果。这使得系统能够验证APK内的每个文件是否被篡改,因为任何文件的更改都将导致散列值的改变。 2. CERT.SF(签名...
App后台开发运维和架构实践》通过阐述移动互联网中 App 后台开发的特点,梳理了 App 后台开发中会遇到的各个技术点,给出了生产环境常用软件的实战运维经验总结,剖析了常见 App 后台技术架构设计,为读者呈现一幅...
基于IntraWeb的数据表格的多选实现 既可以单条操作,也可以多选操作。 delphi源代码。 BS开发Web网站开发,不需要安装服务器,Apache和IIS都不需要,自带企业级服务器。...————————————————
Android提供了一个内置的`DatePickerDialog`类,用于创建日期选择对话框。首先,你需要创建一个`DatePickerDialog.OnDateSetListener`接口的实现,这个接口定义了当用户在日期选择器中设定日期后应执行的方法。例如...