2011.10.19(3)——— android 一个便签的Widget例子

2011.10.19(3)——— android 一个便签的Widget例子

参考:[url]http://blog.csdn.net/silenceburn/article/details/6093074[/url]

[size=large]写一个widget的大致流程:[/size]

1. AppWidgetProvider 的实现 

2. widget外观布局定义文件

3. 新增widget时的配置Activity的实现(可选)

4. widget 参数配置文件

5. 修改AndroidManifest.xml


[size=large]3是可选的 例如[/size][url]http://www.cnblogs.com/TerryBlog/archive/2010/07/29/1788319.html[/url][size=large]就没有Activity界面[/size]


[size=large]首先 搭一个Widget的框架[/size]

[size=large]1、AppWidgetProvider 的实现[/size]
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");
}

}


[size=large]2. widget外观布局定义文件
这个就是在桌面你的widget的样子 我们的是一张图片[/size]
<?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"/>


[size=large]3、新增widget时的配置Activity的实现(可选)[/size]

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();
//}
}

}



[size=large]4. widget 参数配置文件 [/size]

<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>


[size=large]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列表中。[/size]

<?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]


[size=large]
下面 我们来增加功能 使其具有便签的功能

主要更改了Activity


ShowActivity.java[/size]


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();
//}
}

}


[size=large]然后 新增了一个Edit的Activity[/size]

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();
}

}



[size=large]PendingIntent: 参考[/size][url]http://yinter.iteye.com/blog/803839[/url]
[url]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/[/url]
[size=large]RemoteViews:参考:[/size]
[url]http://www.android123.com.cn/androidkaifa/320.html[/url]
[size=large]AppWidgetManager: 参考:[/size][url]http://www.cnblogs.com/TerryBlog/archive/2010/07/29/1788319.html[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值