兰林任务管理应用程序雏形版以及概要说明

Oracle EBS与SAP数据数据切换至迁移华为MetaERP分析 Oracle EBS到华为MetaERP的数据迁移可采用“表对表复制”思路,因其模块化设计下数据模型标准化、边界清晰。核心业务对象存储在结构明确的主表中,与MetaERP模型兼容度高,便于直接映射。而SAP到MetaERP的迁移则因SAP高度优化的复杂表结构(如簇表/池表)、数据分散冗余、深度依赖配置等特点,无法简单复制,必须采用基于业务对象的迁移方法,通过视图/BAPI提取数据并进行深度转换。两种迁移的本质差异源于源系统的数据模型设计理念不同。 阅读详情

                                                                   

                                                                             本文原创, 转载请注明出处:http://blog.youkuaiyun.com/qinjuning




    

         上上周五的下午,也就是2012.09.07,终于向主管提出了辞职,也下定决心准备返回武汉工作,原因当然

  有很多, 在此也不讲这“数不清理还乱的”事儿了,让各位笑话了。

  

         最近,工作倒挺清闲,俗话说“人太闲了,就容易奇思乱想” ,这不我也觉得天马行空了。于是心里一直在

   嘀咕着,该做点什么有意义的事情出来,开发一些App第一个浮现在我脑海里。可我脑子不好使,没有很好地

   创意。每次和朋友同事聊天,“有想法,其他都是浮云”总是会从我的嘴里蹦出来,可我只能空口说白话,插科

   打诨。呵呵,我也希望自己能多点创新的点子,说不定那天我也去创业了呢? 额,话说大了。还是拉回现实吧。



        我只能想啊想,思啊思,偶然间联想到博客中之前对应用程序中相关信息的一系列总结,索性横下一条心,先

   做个简易的任务管理器吧,所谓“麻雀虽小,五脏俱全”。希望也能在逐步完善这个任务管理器的时候,能够从中

   汲取更多关于编码、设计以及效率的问题,自己也会随着这个小东西的完善而逐渐变得强大的。



         差不多占用了周末时间以及晚上(我可没加班)时间,做出来了这个雏形,马马虎虎而已。废话不多说了,见

  下文。



   主要知识来源:


        1、 <<Android中获取应用程序(包)的信息-----PackageManager的使用(一)>>
        2、<<Android中获取应用程序(包)的大小-----PackageManager的使用(二)>>
        3、<<Android中获取正在运行的服务-------ActivityManager.RunningServiceInfo的使用>>

        4、关于制作底部导航的相关博文如下:

                             <<新浪微博布局学习——妙用TabHost>>

                                    <<android底部菜单栏demo (仿网易客户端)>>


功能说明:


             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.youkuaiyun.com/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.youkuaiyun.com/detail/qinjuning/4572769

  


    希望大家能提供宝贵意见。   Over ~~~~







   
【Claude】组织级认证限制报错已解决(4 种) 报错被禁用的是什么谁能解除应急方案整个 Console 组织Anthropic 支持换账户 / 订阅凭证API key 认证方式你的组织管理员用订阅/login订阅 OAuth 登录你的组织管理员用 API keyRoutines 功能你的组织所有者手动计划任务替代共同排查模式/status确认当前凭证;检查环境变量;看清报错消息里命名的是什么(key?组织访问?),对症清除;管理员层面的限制,找管理员解锁。 阅读详情

相关推荐

UR5双臂Gazebo仿真(Python)

近来在Gazebo上搭了一个ur5双臂仿真平台。 差不多就是以下这样。 使用rostopic list查看一下话题,如下 显然,采用/left_arm_controller/follow_joint_trajectory/goal和/right_arm_controller/follow_joint_trajectory/goal两个话题来控制双臂的运动。 现在的问题是,如何保证双臂运动的一致性,即如何能保证双臂能同时接受到以上两个消息。 思路一:设置/left_arm_controlle

qq_42823342的博客 2233

Android 监听应用程序安装,监听Android应用程序安装卸载的代码

需要通过receiver来监听;在AndroidManifest.xml文件中注册的receiver中必须加上才可以;intent.getData().getSchemeSpecificPart()得到的是包名。public class RegisterReceiver extends BroadcastReceiver {private final static String TAG = "Re...

weixin_42696271的博客 338

《深入浅出图神经网络:GNN原理解析》学习笔记

期末考完了,该上道了 目录一、图的概述1.基本概念2.图的存储和遍历3.应用分类二、神经网络基础1.机器学习2.神经网络三、卷积神经网络(CNN)1.卷积与池化2.卷积神经网络四、表示学习1.意义2.自编码器五、图信号处理与图卷积神经网络1.矩阵计算前置知识2.图信号与图的拉普拉斯矩阵3.图傅里叶变换4.图滤波器(Graph Filter)5.图卷积神经网络(GCN) 一、图的概述 1.基本概念 1.顶点(Vertex)表示研究的对象,边(Edge)表示两个对象之间特定的研究关系 2.图为顶点和边的集合.

且视他人之疑目如盏盏鬼火,大胆地去走你的夜路 2047

URI 中的 getSchemeSpecificPart() 方法

首先是因为碰到一个坑: final Uri data = intent.getData(); if (data != null &amp;&amp; CallUtil.SCHEME_TEL.equals(data.getScheme())) { String number = data.getSchemeSpecificPart(); if (!TextUtils.isEm...

xia236326的博客 3190

大彩串口屏+LUA避坑指南:从Flash读写到控件状态配置的5个常见问题

本文针对大彩串口屏的LUA脚本开发,深度剖析了Flash数据存储与控件状态配置中的5个常见陷阱。重点讲解了如何通过标志位安全初始化Flash、正确处理多字节数据转换,以及如何精准配置按钮与文本控件的状态与事件响应,帮助开发者提升开发效率与代码可靠性。

weixin_27945229的博客 241

QT使用openssl实现RSA加解密

使用openssl生成公私钥,随后用QT对相应的信息进行RSA加解密

weixin_42098322的博客 3867

Qt应用开发(安卓篇)——安卓广播机制

在Android的开发中,我们的程序需要得到网络状态变化、电池状态、屏幕状态、电池、系统启动完成、U盘等外设接入状态、apk安装等这些信息,除了主动去找到这些节点的信息,还可以通过安卓的广播机制被动去得到。广播(Broadcast)- 用于发送广播,广播接收器(BroadcastReceiver)- 用于接收广播,关心内容(Intent)-用于保存广播相关信息的媒介。广播是一种广泛运用的在应用程序之间传输信息的机制。而接收器是对发送出来的广播进行过滤接受并响应的一类组件。

波塞冬的博客 902

目前固态激光雷达在机器人领域的应用难点汇总

固态激光雷达在机器人领域面临性能与成本的双重挑战:探测性能上,动态范围不足(60-80dB)导致高/低反射物体识别困难,近距盲区(30-50cm)与长距精度(±3cm)矛盾突出;结构上视场角与点云密度难以平衡,多雷达拼接又带来同步误差。成本方面,核心元件(SPAD/OPA芯片)良率低(<50%)、校准工序复杂,单机成本超200美元。环境适应性上,粉尘附着、振动偏移(±2°)和光衰(1万小时衰减15%)制约可靠性。

start_up_go的博客 481

系统的intent携参跳转内置应用,如何拦截进自己App并获取参数

配置清单文件:获取参数:跳转测试:

csdn_lg_one的博客 357

手把手教你学PCIE--PCIe架构详解 - 物理层结构

在前一篇文章中,我们对PCIe与其他总线协议进行了对比分析。本文将深入探讨PCIe的物理层结构,这是PCIe协议的核心组成部分之一。物理层负责实际的电气信号传输,理解其工作原理对于设计和调试PCIe系统至关重要。PCIe的物理层是协议栈的最底层,负责将数据从链路层转换为电信号进行传输,并在接收端将电信号还原为数据。差分信号传输:通过一对差分信号线实现高速、低噪声的数据传输。时钟恢复:从数据流中提取时钟信号以同步收发双方。均衡与预加重:补偿信号在传输过程中的损耗,提高链路可靠性。

MHD0815的博客 362

机器人中的数值优化(二十一)—— 伴随灵敏度分析、线性方程组求解器的分类和特点、优化软件

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,下半部分介绍带约束的优化,中间会穿插一些路径规划方面的应用实例

慕羽★的博客 4205

android中的Package安装、卸载、更新替换流程

android系统在安装,删除,替换,清除数据等与应用相关的动作时,会发出对应的Broadcast,上层的应用通过注册相应的广播事件来做相应的处理。1,ACTION_PACKAGE_ADDED----------当有新的包安装成功的时候,系统会发出此广播。2,ACTION_PACKAGE_REMOVED-----当有包被卸载的时候,系统会发出此广播。3,ACTION_PACKAGE_REPLACED----当有包被更新的时候,系统会发出此广播。上面两种广播的用法,很多朋友也已经很熟悉,通过。

yzwfeng的专栏 2879

Jetson AGX Orin平台Jetpack5升级Jetpack6,自研载板USB不工作问题调试

1. 问题描述将AGX Orin工业的新板放到定制的载板上当在ubuntu 22和Jetpack 6.1上使用SDKManager刷机时,lsusb为空,并且在引导时没有发现/注册xusb设备。USB C端口正常打开并供电,但似乎没有数据传输。在Ubuntu 18 Jetpack 5.1.4 SDKManager上同样刷机之后,usb C集线器在引导时被正确地发现,显示在lsusb中,并识别/挂载外部驱动器。

jzwjzw19900922的博客 1509

Android通过广播获取其他应用安装,更新,卸载状态。

在我们在应用中推广其他应用或者需要监听广告推广apk安装状态时很有可能会用到获取应用安装状态的需求,那么如何实现呢?如下: 1.写一个广播继承BroadcastReceiver public class PackageReceiver extends BroadcastReceiver { @Override public void onReceive(Context co...

小小9575的博客 2850

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

android 安装卸载应用提醒_监听Android应用程序安装卸载的代码

需要通过receiver来监听;在AndroidManifest.xml文件中注册的receiver中必须加上才可以;intent.getData().getSchemeSpecificPart()得到的是包名。public class RegisterReceiver extends BroadcastReceiver {private final static String TAG = "Re...

weixin_30095869的博客 232

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Android 监听应用的安装与卸载的广播

import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.text.TextUtils; import android.widget.

打渔还是晒网 —— stone 1万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

android中的Package替换流程

android系统在安装,删除,替换,清除数据等与应用相关的动作时,会发出对应的Broadcast,上层的应用通过注册相应的广播事件来做相应的处理。 1,ACTION_PACKAGE_ADDED 当有新的包安装成功的时候,系统会发出此广播 2,ACTION_PACKAGE_REMOVED 当有包被卸载的时候,系统会发出此广播 上面两种广播的用法,很多朋友也已经很熟悉,通过intent.g...

欢迎关注微信公众号:DroidMind 2916

APK的更新、安装、隐藏、解除隐藏

一、用户安装的apk发生更新 public void registerReceiver(Context context) { Slog.d("PMSdddd", "systemReady1"); IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_PACKAGE_ADDED); filter.addAction(Intent.ACTION_PACK

xiaokangss的博客 2437

安卓广播接收者监听软件卸载与安装_Android 监听apk安装替换卸载广播的实现代码...

首先是要获取应用的安装状态,通过广播的形式以下是和应用程序相关的Broadcast ActionACTION_PACKAGE_ADDED 一个新应用包已经安装在设备上,数据包括包名(最新安装的包程序不能接收到这个广播)ACTION_PACKAGE_REPLACED 一个新版本的应用安装到设备,替换之前已经存在的版本ACTION_PACKAGE_CHANGED 一个已存在的应用程序包已经改变,包括包...

weixin_29185167的博客 338

Android 监听程序的安装、卸载、替换

package text.project.com.myaction; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; import android.widget.Toast; /**

qq_28641023的博客 477

android应用程序安装后自动打开

GetBroadcast.registerReceiver(getApplicationContext());//注册广播,用于监听应用是否安装完成 //安装apk Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(new File(fileURL)), "applicati

lrch1988的专栏 3603

android常见面试题与我自己的回答 (二)

1,android:process 解决访问SharedPreferences,不在同一进程 private SharedPreferencesDB(Context cxt) { this.context = cxt; Context context; try { context = cxt.createPackageContext(cxt.getPackageName(),

crazychen的专栏 2602

解析Intent.getdata()得到的uri为String型的filePath

public String getRealPathFromURI(Uri contentUri) { String[] proj = {MediaStore.Audio.Media.DATA}; Cursor cursor = managedQuery(contentUri, proj, null, null, null); int column_index = curso...

daimengs的博客 8841

Android 监听apk安装替换卸载广播

【Android】Android 监听apk安装替换卸载广播 首先是要获取应用的安装状态,通过广播的形式 以下是和应用程序相关的Broadcast Action ACTION_PACKAGE_ADDED 一个新应用包已经安装在设备上,数据包括包名(最新安装的包程序不能接收到这个广播) ACTION_PACKAGE_REPLACED 一个新版本的应用安装到设备,替换之前已经存在的

成长的味道 1938

Android中获取应用程序(包)的信息-----PackageManager的使用(一)

转载请注明出处:http://blog.csdn.net/qinjuning                 本节内容是如何获取Android系统中应用程序的信息,主要包括packagename、label、icon、占用大小等。具体分为两个  部分,计划如下:             第一部分: 获取应用程序的packagename、label、icon等 ;

qinjuning、lets go 21万+

Android中内容观察者的使用---- ContentObserver类详解

转载请注明出处:http://blog.csdn.net/qinjuning                             前言: 工作中,需要开启一个线程大量的查询某个数据库值发送了变化,导致的开销很大,后来在老大的指点下,利用了      ContentObserver完美的解决了该问题,感到很兴奋,做完之后自己也对ContentObserver做下总结。

qinjuning、lets go 13万+
上一篇: Android中View绘制优化之三---- 优化View
下一篇: Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(上)
qinjuning
博客等级 码龄18年 5288粉丝 43原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值