- 浏览: 282698 次
- 性别:
- 来自: 济南
文章分类
最新评论
本文原创, 转载请注明出处:http://blog.csdn.net/qinjuning
上上周五的下午,也就是2012.09.07,终于向主管提出了辞职,也下定决心准备返回武汉工作,原因当然
有很多,在此也不讲这“数不清理还乱的”事儿了,让各位笑话了。
最近,工作倒挺清闲,俗话说“人太闲了,就容易奇思乱想” ,这不我也觉得天马行空了。于是心里一直在
嘀咕着,该做点什么有意义的事情出来,开发一些App第一个浮现在我脑海里。可我脑子不好使,没有很好地
创意。每次和朋友同事聊天,“有想法,其他都是浮云”总是会从我的嘴里蹦出来,可我只能空口说白话,插科
打诨。呵呵,我也希望自己能多点创新的点子,说不定那天我也去创业了呢? 额,话说大了。还是拉回现实吧。
我只能想啊想,思啊思,偶然间联想到博客中之前对应用程序中相关信息的一系列总结,索性横下一条心,先
做个简易的任务管理器吧,所谓“麻雀虽小,五脏俱全”。希望也能在逐步完善这个任务管理器的时候,能够从中
汲取更多关于编码、设计以及效率的问题,自己也会随着这个小东西的完善而逐渐变得强大的。
差不多占用了周末时间以及晚上(我可没加班)时间,做出来了这个雏形,马马虎虎而已。废话不多说了,见
下文。
主要知识来源:
1、
<<Android中获取应用程序(包)的信息-----PackageManager的使用(一)>>
2、<<Android中获取应用程序(包)的大小-----PackageManager的使用(二)>>
3、<<Android中获取正在运行的服务-------ActivityManager.RunningServiceInfo的使用>>
4、关于制作底部导航的相关博文如下:
功能说明:
1、分类列出系统已安装程序的信息:icon(修正app icon大小)、lable、size
2、能卸载第三方应用程序
3、更新系统安装程序信息,例如:卸载、安装程序后。
4、查看、停止正在运行的Service
简单点来说,就是把我上面列出的4条单独地个体整理成一个有机的整体,整体才是有生命、充满活力的。
功能简单,程序当然也很简单。 先上图:
工程逻辑图如下:
伪设计说明
使用继承体系
由于我们用于呈现分类的已安装程序的Activity在界面以及功能上大体一致,因此我们将这部分共性(界面等)
抽取出来形成一个抽象父类(BaseActivity),基本上所有功能都由这个抽象父类完成了,子类仅仅提供数据对象。
UML图:
设计缺点
然而,随着后期新功能的加入以及优化,这种在TabActivity中添加Activity的功能已经不能满足需要,甚至
现有设计本身就是欠缺地,只能在后续中重构改善设计。
缺点主要有二:
1、效率比较低下 ---- 需要同时管理多个Activity的生命周期
2、造成了数据之间的过度耦合以及代码冗余 ---- 添加新功能时,发现数据交互之间比较繁杂,例如:添加
一个对ACTION_PACKAGE_XXX的BroadcastReceiver时,需要注册多次,数据交互之间也不很麻烦。
后续优化
计划参考Android2.3 Settings中应用程序功能的实现,采用TabHost.TabContentFactory类为TabActivity提供
视图,在性能上继续优化我们的这个小东西 。
BaseActivity的部分源码如下:
/** @author http://http://blog.csdn.net/qinjuning*/ public abstract class BaseActivity extends Activity implements OnItemClickListener{ private static String TAG = "BaseActivity"; protected ListView mListView = null; protected TextView mTvAppCount = null ; private static PackageManager mPackageManager; protected static List<AppInfo> mAllAppInfoList = new ArrayList<AppInfo>() ; protected static List<AppInfo> mSystemAppInfoList = new ArrayList<AppInfo>(); protected static List<AppInfo> mThirdAppInfoList = new ArrayList<AppInfo>(); protected static List<AppInfo> mSDCardAppInfoList = new ArrayList<AppInfo>(); protected AppInfoAdapter mAppInfoAdapter = null ; //适配器 private PakcageStateChangeReceiver mPackageReceiver = new PakcageStateChangeReceiver(); private static Context mContext ; /** We had loaded the application info*/ private static boolean mHasLoadered = false ; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mContext = this ; mPackageManager = this.getApplicationContext().getPackageManager(); if(!mHasLoadered) { mHasLoadered = true ; // we have load the application loadAppInfoList(); } initUI(R.layout.browse_app_list); IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_PACKAGE_CHANGED); filter.addAction(Intent.ACTION_PACKAGE_ADDED); filter.addAction(Intent.ACTION_PACKAGE_REMOVED); filter.addDataScheme("package"); //Attention registerReceiver(mPackageReceiver , filter); } /**设置UI*/ protected void initUI(int resId) { setContentView(resId); mListView = (ListView) findViewById(R.id.listviewApp); mListView.setAdapter(makeAppInfoAdapter()); mListView.setOnItemClickListener(this); mTvAppCount = (TextView)findViewById(R.id.app_type_count); setAppCountView(); } //构建一个BaseAdapter适配器对象,为ListView提供数据 protected BaseAdapter makeAppInfoAdapter() { mAppInfoAdapter = new AppInfoAdapter(this , getAppInfoList()); return mAppInfoAdapter ; } //返回该应用程序适合的容器 protected abstract List<AppInfo> getAppInfoList(); //查询系统应用程序信息并填充到我们的集合中 private static void loadAppInfoList() { // 查询所有已经安装的应用程序 List<ApplicationInfo> listApplications = mPackageManager .getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES); Slog.v(TAG, "initAppInfoList:: listApplications Size # " + listApplications.size()); Collections.sort(listApplications, new ApplicationInfo.DisplayNameComparator(mPackageManager));// 排序 for(ApplicationInfo applicationInfo : listApplications ) { //构建一个我们的AppInfo Model类 AppInfo appInfo = makeAppInfo(applicationInfo); //获得应用程序大小...信息 try { Utility.queryPacakgeSize(applicationInfo.packageName, mPackageManager , appInfo); } catch(Exception ex) { ex.printStackTrace(); } fillListByFlag(applicationInfo.flags , appInfo); } } // 构造一个AppInfo Model对象 ,并赋值 private static AppInfo makeAppInfo(ApplicationInfo applicationInfo) { ... } //根据Flag标记分别添加至我们的集合中 private static void fillListByFlag(int flags , AppInfo appInfo) { //所有程序 mAllAppInfoList.add(appInfo); //系统内置程序 if((flags & ApplicationInfo.FLAG_SYSTEM) != 0 ) { mSystemAppInfoList.add(appInfo); appInfo.isSystem = true ; } //本来是系统程序,被用户手动更新后,该系统程序也成为第三方应用程序了 else if ((flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0){ mThirdAppInfoList.add(appInfo); } //第三方应用程序 else if ((flags & ApplicationInfo.FLAG_SYSTEM) == 0) { mThirdAppInfoList.add(appInfo); } //安装在SD卡中的程序 if ((flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) { mSDCardAppInfoList.add(appInfo); } } private class PakcageStateChangeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); Slog.v(TAG, "onReceive Action --" + action); if(Intent.ACTION_PACKAGE_CHANGED.equals(action) || Intent.ACTION_PACKAGE_ADDED.equals(action)|| Intent.ACTION_PACKAGE_REMOVED.equals(action)) { String pkgName = intent.getData().getSchemeSpecificPart() ; boolean replacing = intent.getBooleanExtra(Intent.EXTRA_REPLACING, false); Slog.v(TAG, "pkgName --" + pkgName + " replacing : " + replacing); if(!Intent.ACTION_PACKAGE_CHANGED.equals(action)) { if(Intent.ACTION_PACKAGE_REMOVED.equals(action)) { if(!replacing) //Removed { removeAppInfo(pkgName) ; } else { //We will receiver the ACTION_PACKAGE_ADDED later , // do something there. } } else // ACTION_PACKAGE_ADDED { if(!replacing) // 安装了新的应用程序 { addAppInfo(pkgName) ; } else //更新了应用程序 { updateAppInfo(pkgName); } } } } } } }
其他代码就不在贴了,大家有兴趣的自行研究咯。
分享永远是咱移动互联网的精神, 本次雏形版下载地址,
http://download.csdn.net/detail/qinjuning/4572769
希望大家能提供宝贵意见。 Over ~~~~
发表评论
-
unity基础开发----物体位移和旋转实用代码
2013-11-21 22:46 1271using UnityEngine; using Syst ... -
Android中View绘制优化之一---- 优化布局层次
2012-09-04 23:00 1083... -
Android中View绘制优化二一---- 使用<include />标签复用布局文件
2012-09-08 13:54 1067... -
Android中View绘制优化之三---- 优化View
2012-09-13 21:00 1089... -
Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(上)
2012-10-10 18:14 1179... -
Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(下)
2012-10-17 20:05 876... -
Android中文件选择器的实现
2012-11-30 08:59 1183... -
【编译原理】使用Lex将C/C++文件输出为HTML文件
2012-07-20 09:37 108508年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大 ... -
【编译原理】正则表达式
2012-07-21 21:49 232508年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大 ... -
【OpenCV】访问Mat图像中每个像素的值
2012-07-22 07:10 1183今天百度搜资料还搜到了自己的。。。《访问图像中每个像素的值 ... -
【编译原理】用Yacc做语法分析
2012-07-23 05:47 180308年9月入学,12年7月毕 ... -
【UML】UML几种图的绘制
2012-07-24 09:49 99308年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大 ... -
【OpenCV】邻域滤波:方框、高斯、中值、双边滤波
2012-07-26 10:52 1466邻域滤波(卷积) 邻域算子值利用给定像素 ... -
【数据结构】排序算法:希尔、归并、快速、堆排序
2012-07-28 06:15 103408年9月入学,12年7月毕 ... -
【OpenCV】角点检测:Harris角点及Shi-Tomasi角点检测
2012-07-31 13:25 1552角点 特征检测与匹配 ... -
【UML】案例分析:机场运作系统
2012-08-01 17:22 314808年9月入学,12年7月毕 ... -
【OpenCV】边缘检测:Sobel、拉普拉斯算子
2012-08-04 13:41 1559边缘 边缘(edge)是指图像局部强度变化最显著的部分。主要 ... -
【OpenCV】Canny 边缘检测
2012-08-08 10:17 2002Canny 边缘检测算法 1986 ... -
【UML】案例分析:新型超市购物自助系统
2012-08-19 01:13 130008年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大 ... -
【数据结构】二叉树、AVL树
2012-08-21 00:30 110308年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大 ...
相关推荐
《兰陵县长城镇总体规划说明书》是对兰陵县长城镇未来发展规划的详尽阐述,旨在指导城镇的建设和发展。这份规划说明书的编写始于2014年,涵盖了2013年至2030年的长远规划,旨在为城镇的经济、社会、环境等多方面发展...
兰菱张力控制器说明书 规格型号sc 2h 从原厂说明书复制
兰陵邮件搜捕是邮件列表搜索、管理、群发工具 集合。上网冲浪时看到页面有邮件地址,只需将 链接拖到兰陵软件窗口即可。如果页面地址较多 也可将页面复制到剪贴板上,软件会自动提取电 邮。导出邮件地址后形成一行一...
【常州兰陵Z型电动执行机构使用说明书】 Z型电动执行机构是一种专为阀门操作设计的多回转电动装置,适用于各种需要直线运动的阀门,如闸阀、截止阀、隔膜阀等。该设备的主要功能是实现阀门的远程控制、集中控制和...
山东苍山县兰陵铁矿为新发现的超大型隐伏沉积变质型铁矿,对该区的钻孔资料进行分析可知:矿区垂向存在矿化富集带及无矿带;平均品位沿垂向变化不大,走向上中部存在矿化富集现象;沿走向,矿体厚度品位变化无规律性,沿...
《兰陵县长城镇总体规划》是指导兰陵县长城镇未来发展的蓝图,旨在通过对城镇的系统性规划,推动经济、社会、环境的和谐发展。该规划详细阐述了城镇的发展目标、空间布局、土地利用等方面的关键内容。 一、城镇发展...
解答题则更加注重学生综合运用知识解决问题的能力,以及对数学概念的深入理解和灵活应用。 试题内容丰富多样,从集合论、逻辑关系到方程求解,再到概率论、函数性质,以及组合计数、统计学的线性相关性、回归分析、...
这份2021届山东省临沂市兰山区、兰陵县高一下学期期中考试的数学试题涵盖了多个数学知识点,主要涉及平面几何、立体几何、复数、向量、三角形性质、条件判断以及解析几何等多个方面。以下是这些知识点的详细说明: ...
这份文档是山东省临沂市兰陵县2021-2022学年高二上学期期中考试的数学试卷,包含选择题和非选择题两大部分,总分为150分,考试时间为120分钟。试卷结构严谨,要求学生在答题前正确填写个人信息,并严格按照指定方式...
这份资料是兰陵县2016-2017学年七年级数学期末试题,包含选择题、填空题和解答题,旨在检测学生对初一数学基础知识的掌握程度。以下是部分知识点的详细说明: 1. 实数比较:题干中涉及到实数的比较,如1, 1-根号2, ...
张潮的比喻“少年读书如隙中窥月,中年读书如庭中望月,老年读书如台上玩月”,形象地说明了阅读体验随人生阶段而变化的现象。这启示我们,在文学教学中应当重视学生阅读的阶段性特点,以适合其年龄和认知发展水平的...
兰陵免费Email发送机是基于Internet上标准邮件服务器的专业Email大批量发送程序,专为网络营销及电子商务人士服务。软件内置高效快速的SMTP服务器,从而不需要其他SMTP服务器中转,即可将邮件直接发送到每个收件人...
山东省临沂市兰陵县2020-2021学年高二下学期期中教学质量检测数学试题 Word版含答案.docx
很抱歉,但根据您提供的信息,这个文件内容是关于山东省临沂市兰陵县2018届九年级语文第二次模拟考试的试题及答案,包括了语文考试中的各种题型,如选择题、填空题、阅读理解等。知识点主要涵盖语文基础知识,如汉字...
这份文档是兰陵县2016-2017学年第一学期九年级英语期末考试的精选试题及答案,主要考察学生的英语语言综合运用能力,包括语法、词汇、句型理解和交际应用等方面。试题设计严谨,旨在检测学生对英语基础知识的掌握...
而“孝”的评判标准则进一步强调,孝不仅仅是口头上的尊敬,它还包括了对父母的实际照顾以及对家族延续的责任。这种标准,实际上是对个体道德行为的一种全面要求,它要求人们在行为上体现出孝的实质,而不仅仅是形式...
2. 互联网时代群众工作机制的创新:兰陵县的“兰陵首发”平台创新地将互联网技术应用于基层社会治理中,实现在线上的一网通办、群众诉求交办、问题解决和信息共享。 3. 群众工作的重要性:兰陵县的实践证明了群众...
本资源为“山东省临沂市兰陵县 高二数学上学期期末考试试题(扫描版) 试题.doc”,是一份针对高二学生的数学期末考试试卷,来源于2019-2020学年。这份文档可能是以扫描的形式存在,意味着它可能包含了实际纸质试卷的...
山东省临沂市兰陵县作为教育体系的重要组成部分,其县级中学教育在地区人才培养中扮演着关键角色。尤其是在中考这一关键节点之前,兰陵县届九年级的语文上学期第一次月考试,不仅是对学生语文知识的检核,更是对他们...