第一个Android项目

序言:这不是我第一次写的博客, 因为写的不好我都删了。不过想想, 保留一些青雉的印记也好

 

项目内容:

实现Android终端与公司产品对接,就是个显示数据的过程,考虑到公司代码是由C语言开发的, 因此想到使用NDK来进行开发。

实现功能:

1.关于4G探针设备的配置

2.导入默认名单, 并提示

3.实时显示上报数据(基本的包括手机IMSI号, 归属地, 上报时间)

4.根据信号强度做了个定位扫描界面

 

项目创建

        简单的, 通过Android Studio来创建的, 直接创建选中include c++即可, 需要注意的是,在cpp文件夹中添加cpp文件是需要在CMakeLists.txt中申明的, 头文件不需要。

        调用, 以线程形式开启的, 这里我没有用Services, 因为我是连四大组件是啥都不知道就开始上手的QAQ。 为了保持线程的运行,我的主activity一直是保持不被销毁的状态。活动定义为single Top的方式, 在用intent的跳回主页面时我都会添加标志位intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 在清空栈顶后,主activity不会被重新创建, 只会调用一个叫newIntent放法,这样子就不会重复创建activity, 也保证作为业务的通信线程不被重复创立。

        先说一下UI方面的布局, 个人比较relative布局的, 随意吗, 控件随便拉。但后来发现有个严重的问题, 屏幕适配!老是会有一些超出布局范围的控件。 后来就网上找, 找到了一个百分比布局的方式。 这个项目之后的绝大部分布局都是基于此方法进行的。后来学过fragment可以模块化封装, 如果结合这个可能更好点。

        再说下首页面数据显示部分吧, 这部分我可能弄得有些冗余, (有更好的介意可以Q我)我是采用ScrollView嵌套LinearLayout再嵌套表格的方式来显示数据的, 表格添加可以参考https://blog.csdn.net/kulianshuqimei/article/details/78890006, 这里我把它封装成setEditAdd函数,具体等完写完博客上传GitHub请各位看官细看。数据以滚动的形式刷新, 后来发现数据量太大, 会影响用户体验, 就是卡顿现象(因为全是线程控制UI, 所以你只会觉得卡, 尤其是在定位功能和首页面数据显示功能切换的时候会出现), 先后做出两次优化1.固定显示500条数据, 超过这个范围的数据会被踢掉2.剔除重复的数据, 只保留最新的更新时间和捕获次数。两个方案各有优劣吧, 如果只是一个实例的话我更倾向于优化1, 不过需求吗总会越来越多,而且性能跟不上, 为了需求只能忍痛割爱了(主要不舍得之前写了那么长的代码。。。)。

       C++线程, 采用TCP方式通信,为了保持数据实时, 这个线程是不会中断的(针对阻塞的方式想起来还没解决QAQ, 想来应该是发个消息然后我赶紧断掉, 不过现在设备都被拆了重装了很尴尬)。对接的时候是根据公司的网关协议进行的,主要是因为公司设备代码都是用C写的, 要是用java整我指不定什么时候能对接好, 定义了各种结构体就不说了, 还要整个加密方法和归属地算法(迫切希望有大咖可以指导下我)。简要说下表头把, 帧 + 类型码 + 版本号 + 序列号 + 报文长度 + 数据体(里面还会有类似的类型码加数据长度加数据的嵌套, 这部分需要加密)。 然后就是一些配置操作, 这部分用户与数据交互是通过标志位的方式实现的。 我事先会把一些标志位通过文件存储方式保存, 例如SINGER_APP_CONNECTED      0。这边其实应该利用xml文件来保存是更好的, 没怎么用过, 还需研究一番。

       数据库!关于数据库方面的问题还是挺多的, 最主要的问题就是sqlite ReadOnly的问题。因为我是通过数据库存储的方式来实现, 不可避免的需要在用户界面调用这些数据。 相同代码之间调用还好, 可以利用的机制避免同时使用, 但java和c++代码之间调用就会有些问题了, 在这里我还是通过标志位的方式来避免的, 大部分逻辑的实现我都是放在线程中执行的, 通过标志位进行阻塞能极大的减少readonly的出现, 不过偶尔的情况下仍会抛出异常, 不过我使用getReadableDatabases方法仍然会报出此类异常也是日常懵逼。不过好在数据的读取或者显示方面到没有什么异常, 也是一憾。 

       测试过程主要是通过大量数据来填充的, 其实随便一侧就有问题了, 在我造假了发送数据之后, 通信线程异常(又是什么问题!!)原来是作为客户端的设备设置了等待超时问题, 由于我是在数据库插入操作结束之后再进行recv操作的就这零点几秒的延时就造成了一个严重的bug, 我们公司的代码还真是够严谨的啊。无奈我只能选择批量插入数据, 这样子,展示给用户的数据又造成了延时(本身就是隔个一秒读一下数据库), 最近在看一些Android进程间通信的一些方式, 希望能有作用。

 

      一些补充:

--1:assets中的文件可以通过文件IO的方式写入手机内, data/data/+你的包名/+文件名,写到这个路径下就行了

--2:数据库中文乱码,String name = new String(val, "utf-8");

--3:语音功能,TTS,由于部分国产手机语音被改过了这里使用

startActivity(new Intent("com.android.settings.TTS_SETTINGS"));来重新配置语音, 我这里用的是讯飞引擎

--4:资源文件分类管理

Builder.grandle修改

sourceSets {

main {

res.srcDirs =

[

'src/main/res/layout/activityView',

'src/main/res/layout',  //不可省略, res下的相关文件自己创建

'src/main/res'

]

}

}

--5:设置屏幕旋转问题setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

赠言:代码写的烂不要紧, 先实现了再说, 后续慢慢重构, 有的玩的累

附上刚刚上传的GitHub地址https://github.com/hyx123/android_ndk, 哎命名是个问题不要介意

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值