关于appwidget的基础知识,请自行度娘。
学习appwidget几天了,将自己手机上的四叶草控件给仿制了一个,拖出来给有需要的朋友分享,
(注意:代码没有做过兼容性测试,测试机子是联想a789,分辨率:480*800。)
效果图如下:
初始界面 设置界面 设置后的界面
点击中间那个按钮,即可进入设置界面。O(∩_∩)O~
我的开发环境是eclipse,考略到贴出所有代码的话文字篇幅可能过大,,所以,决定只贴出部分核心代码,详细的大家直接下载源码去看好了:
图片资源我是自己PS画出来的,直接做成了透明效果,,这样就省去敲代码了。。。
程序有3个java文件:activityctrl.java,mainactivity,quicklinklist.java
activityctrl.java:用于判断appwidget是否已经进行过设置,,如果已经进行过设置则直接运行app,否则,进入配置界面;
mainactivity.java:继承appwidgetprovider,负责更新、设置appwidget;
quicklinklist.java:提供动态配置appwidget的类。
mainactivity.java代码:
public class MainActivity extends AppWidgetProvider {
private AppWidgetManager appWidgetManager = null;
public static Context context = null;
private int[] appWidgetIDs = null;
public static int[] ctrl_ID = new int[] { R.id.IB_UpBtn_Left,
R.id.IB_UpBtn_Right, R.id.IB_DownBtn_Left, R.id.IB_DownBtn_Right,
R.id.IB_Btn_Center };
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
// TODO Auto-generated method stub
this.appWidgetManager = appWidgetManager;
this.appWidgetIDs = appWidgetIds;
this.context = context;
msgThread.start();
// 获得view
RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
R.layout.activity_main);
String tmp = null;
//循环加载图标
for (int z = 0; z < 4; z++) {
//z代表四个按钮控件
SharedPreferences sf = context.getSharedPreferences(
String.valueOf(z), Activity.MODE_PRIVATE);
tmp = sf.getString("PackName", "");
try {
如果包名不为空,设置图标
if (tmp != "") {
PackageInfo packinfo = context.getPackageManager()
.getPackageInfo(tmp, 0);
//设置图标
remoteViews.setImageViewBitmap(ctrl_ID[z], quicklinklist
.DrawableToBitmap(packinfo.applicationInfo
.loadIcon(context.getPackageManager())));
}
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
Toast.makeText(context, "什么也没找到!!!", Toast.LENGTH_SHORT).show();
}
}
// 获得创建的appwidget
ComponentName componentName = new ComponentName(context,
MainActivity.class);
// 更新视图
appWidgetManager.updateAppWidget(componentName, remoteViews);
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
switch (msg.what) {
case 1:
int n = appWidgetIDs.length;
int j = 0;
for (int i = 0; i < n; i++) {
j = appWidgetIDs[i];
RemoteViews views = new RemoteViews(
context.getPackageName(), R.layout.activity_main);
for (int z = 0; z < ctrl_ID.length; z++) {
Intent intent = new Intent(context, activityctrl.class);
// intent.setAction(MSG_ID[z]);
intent.putExtra("pos", z);
// intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
// j);
/*PendingIntent.getBroadcast(context,requestCode,intent,flags)
*
参数说明:context----->上下文
requestCode----->响应码,可用于区分多个PendingIntent实例
intent----->希望执行的动作
flags----->标记
*/
PendingIntent pi = PendingIntent.getActivity(context,
z, intent, 0);
// PendingIntent pi =
// PendingIntent.getActivity(context,z, intent,
// PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(ctrl_ID[z], pi);
}
appWidgetManager.updateAppWidget(j, views);
}
break;
}
super.handleMessage(msg);
}
};
Thread msgThread = new Thread() {
@Override
public void run() {
Message msg = new Message();
msg.what = 1;
handler.sendMessage(msg);
};
};
}
activityctrl.java代码:
public class activityctrl extends Activity {
int cur_position = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
cur_position = (Integer) getIntent().getSerializableExtra("pos");
String packname = this.getPackName(cur_position);
if (packname != "" && cur_position <= 3) {
try {
Intent intent = getPackageManager().getLaunchIntentForPackage(
packname);
startActivity(intent);
this.finish();
} catch (Exception e) {
Toast.makeText(this, "不能独立运行程序或者程序已经卸载!", Toast.LENGTH_SHORT)
.show();
}
} else {
Intent intent = new Intent(activityctrl.this, quicklinklist.class);
intent.putExtra("pos", cur_position);
startActivity(intent);
}
this.finish();
}
public String getPackName(int position) {
SharedPreferences sf = getSharedPreferences(String.valueOf(position),
Activity.MODE_PRIVATE);
return sf.getString("PackName", "");
}
}
quicklinklist.java代码:
public class quicklinklist extends Activity {
private ListView LV_quickLink = null;
private ImageView IV_ItemView = null;
private static Context context = null;
private int cur_position = 0;
private List<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>();
private List<HashMap<String, Object>> appdata = new ArrayList<HashMap<String, Object>>();
List<PackageInfo> pckman = null;
private View g_itemsView = null;
Button btn_over = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
cur_position = (Integer) getIntent().getSerializableExtra("pos");
this.context = this;
setContentView(R.layout.quicklinklist);
btn_over = (Button) this.findViewById(R.id.btn_over);
btn_over.setOnClickListener(new android.view.View.OnClickListener() {
@Override
public void onClick(View view) {
// TODO Auto-generated method stub
quicklinklist.this.finish();
}
});
// setTheme(android.R.style.Theme_NoTitleBar);
pckman = (List<PackageInfo>) getPackageManager()
.getInstalledPackages(0);
LV_quickLink = (ListView) findViewById(R.id.LV_quickLink);
String[] menu_name_list = context.getResources().getStringArray(
R.array.menulist_name);
// data.clear();
String tmp = null;
for (int i = 0; i < menu_name_list.length; i++) {
HashMap<String, Object> hash = new HashMap<String, Object>();
SharedPreferences sf = context.getSharedPreferences(
String.valueOf(i), Activity.MODE_PRIVATE);
tmp = sf.getString("PackName", "");
try {
if (tmp != "") {
PackageInfo packinfo = context.getPackageManager()
.getPackageInfo(tmp, 0);
hash.put("icon", DrawableToBitmap(packinfo.applicationInfo
.loadIcon(context.getPackageManager())));
} else {
hash.put("icon", BitmapFactory.decodeResource(
getResources(), R.drawable.ic_launcher));
}
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
Toast.makeText(context, "什么也没找到!!!", Toast.LENGTH_SHORT).show();
}
hash.put("name", menu_name_list[i]);
data.add(hash);
}
SimpleAdapter sa = new SimpleAdapter(this, data,
R.layout.listitems_list, new String[] { "name", "icon" },
new int[] { R.id.TV_MenuName_list, R.id.IV_AppIcon_list });
sa.setViewBinder(new ViewBinder() {
@Override
public boolean setViewValue(View view, Object data,
String textRepresentation) {
// TODO Auto-generated method stub
if (view instanceof ImageView) {
ImageView iv = (ImageView) view;
iv.setImageBitmap((Bitmap) data);
return true;
} else {
return false;
}
}
});
LV_quickLink.setAdapter(sa);
final Handler handler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
int count = pckman.size();
appdata.clear();
for (int i = 0; i < count; i++) {
PackageInfo packinfo = pckman.get(i);
HashMap<String, Object> hash = new HashMap<String, Object>();
hash.put(
"appname",
packinfo.applicationInfo.loadLabel(
getPackageManager()).toString());
hash.put("icon", packinfo.applicationInfo
.loadIcon(getPackageManager()));
hash.put("packname",
packinfo.applicationInfo.packageName.toString());
appdata.add(hash);
}
final SimpleAdapter sa = new SimpleAdapter(context,
appdata, R.layout.listitems, new String[] {
"appname", "icon" }, new int[] {
R.id.TV_MenuName, R.id.IV_AppIcon });
sa.setViewBinder(new ViewBinder() {
@Override
public boolean setViewValue(View view, Object data,
String textRepresentation) {
// TODO Auto-generated method stub
if (view instanceof ImageView) {
ImageView iv = (ImageView) view;
iv.setImageDrawable((Drawable) data);
return true;
} else {
return false;
}
}
});
new AlertDialog.Builder(context).setTitle("选择程序")
.setAdapter(sa, new OnClickListener() {
@Override
public void onClick(DialogInterface dlg, int which) {
// TODO Auto-generated method stub
Bitmap img = DrawableToBitmap((Drawable) appdata
.get(which).get("icon"));
savePackName(appdata.get(which).get("packname")
.toString());
// 获取远程view
RemoteViews remoteViews = new RemoteViews(
MainActivity.context.getPackageName(),
R.layout.activity_main);
// 设置图标
remoteViews.setImageViewBitmap(
MainActivity.ctrl_ID[cur_position], img);
// 获取appwidgetmanager实例
AppWidgetManager appWidgetManager = AppWidgetManager
.getInstance(MainActivity.context);
// 获得所有appwidget
ComponentName componentName = new ComponentName(
context, MainActivity.class);
// 更新appwidget
appWidgetManager.updateAppWidget(componentName,
remoteViews);
IV_ItemView = (ImageView) g_itemsView
.findViewById(R.id.IV_AppIcon_list);
IV_ItemView.setImageBitmap(img);
// quicklinklist.this.finish();
}
}).show();
break;
}
};
};
LV_quickLink.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterview, View view,
int position, long id) {
// TODO Auto-generated method stub
g_itemsView = view;
cur_position = position;
new Thread() {
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
Message msg = new Message();
msg = handler.obtainMessage();
msg.what = 0;
msg.sendToTarget();
}
}.start();
}
});
}
public void savePackName(String PackName) {
SharedPreferences sf = getSharedPreferences(
String.valueOf(cur_position), Activity.MODE_PRIVATE);
SharedPreferences.Editor sf_editor = sf.edit();
sf_editor.putString("PackName", PackName);
sf_editor.commit();
}
public String getPackName(int position) {
SharedPreferences sf = getSharedPreferences(String.valueOf(position),
Activity.MODE_PRIVATE);
return sf.getString("PackName", "");
}
public static Bitmap DrawableToBitmap(Drawable drawable) {
// int w = drawable.getIntrinsicWidth();
// int h = drawable.getIntrinsicHeight();
// 转成特定大小,以达到美观效果
int w = 62;
int h = 62;
// 取drawable颜色格式
Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Config.ARGB_8888
: Config.RGB_565;
// 创建位图
Bitmap img = Bitmap.createBitmap(w, h, config);
// 创建基于位图的画布
Canvas canvas = new Canvas(img);
// 设置大小
drawable.setBounds(0, 0, w, h);
// 画到画布上去
drawable.draw(canvas);
// 返回位图
return img;
}
}
代码如有不对的地方,还望大家指正。
O(∩_∩)O~
源码:http://download.youkuaiyun.com/detail/flydream3618/7549535
By ——flydream3618