1.全局静态实例应避免
//全局静态实例可能会导致异常的空指针现象,就算调用前判空也不行,【基本数据类型可以】
2.线程须使用线程池控制
//须创建可控的线程池进行统一管理,不加节制的开线程可能导致设备异常退出,却查不到报错日志
public ScheduledThreadPoolExecutor scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(10,
new BasicThreadFactory.Builder().namingPattern("轮询").daemon(false).build());
//定时循环任务注意使用【相对时间】防止系统时间修改循环失效
3.数据库推荐GreenDao,避免OrmLite
//如果使用Greendao注意,如同时使用kotlin ,applay须再kotlin前面,数据库实体使用java文件
apply plugin: 'org.greenrobot.greendao'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
//GreenDao使用注意:数据实例自增长id 为Long 类型(大写包装类),
//须注意加入数据库升级控制,保证设备远程升级数据不丢失
//请勿滥用数据库,全局属性配置唯一性(设备设置信息)的建议直接KV存储,
##4.广播须注意有效性和时机
<!-- 开机广播须有android:exported="true"以保证其有效性,注意权限, -->
<receiver android:name=".receiver.BootCompleteReceiver" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.MEDIA_MOUNTED" />
<action android:name="android.intent.action.MEDIA_EJECT" />
<data android:scheme="file" />
</intent-filter>
</receiver>
<!-- 安装包广播须避免使用,开机过程中会出现加载情况,导致开机黑屏或者系统启动不起来 -->
<!-- <receiver-->
<!-- android:name=".receiver.AppInstallReceiver"-->
<!-- android:label="@string/app_name">-->
<!-- <intent-filter>-->
<!-- <action android:name="android.intent.action.PACKAGE_ADDED" />-->
<!-- <action android:name="android.intent.action.PACKAGE_REPLACED" />-->
<!-- <action android:name="android.intent.action.PACKAGE_REMOVED" />-->
<!-- <data android:scheme="package" />-->
<!-- </intent-filter>-->
<!-- </receiver>
5.避免设置应用为桌面应用(同广播时机影响)
//尤其是应用需要调用相机或读卡器等固件的情况下,设为桌面应用会导致设备启动失败
6.如应用首页为相机预览页面,须添加引导页
//开机自启动广播后启动应用(IOT多数都是自启),如果应用直接调用相机仍由可能调用相机失败,建议添加引导页等待两秒后再进入相机预览页面
##7.注意串口通信接线方式
//安卓设备和pc通信,直接串口转RS-232即可,未必需要转485,接线设备端 RXD TXD GND(地线)
//USB转RS-232的须接入 2-TXD(数据库发送) 3-RXD(数据接收) 5-GND(地线)
//设备端须注意和PC端对应关系 PC TXD(数据发送)→设备RXD PC RXD→ 设备TXD(数据发送)
8.远程升级和大文件下载须做断点续传
//iot设备网络状况复杂多变,对于较大文件建议全部采用断点续传,否则会导致反复的下载失败,尤其大量设备连接服务器的情况下,由于负载均衡的控制,会出现中断连接稍后恢复情况
9.屏幕适配酌情使用
//在手机端非做不可的屏幕适配可酌情考虑是否使用,因为这次是横屏下次或许就是竖屏长条屏了,而iot设备一般无手动下滑逻辑,数据过多的话最多是viewPager页面切换
##10.日志报错和上传 && 数据库上传 && 远程升级 不能漏
//这三个功能是重中之重,务必不能遗漏,一旦发生问题我们可以依赖的就是这三项功能
//可酌情添加【U盘升级】,【一键导出日志&数据库到U盘】,【热修复功能】
//如果有外网环境可添加【bugly异常捕捉】,没有就做好本地捕捉重启
##11.有外网可添加【bugly异常捕捉】,没有就做本地捕捉重启
//可以同步都使用,注意MyExceptionHandle的uncaughtException()中AlarmManager一秒定时重启,最后一定要再次把异常抛出来mDefaultHandler.uncaughtException(thread, ex);以便bugly可以捕捉到
Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandle(
this, LocalPathUtils
.getProgramErrorFile()));
CrashReport.initCrashReport(getApplicationContext(), "adae432406", false);
12.软件狗注意按时喂狗,管理员操作情况下须关闭软件狗
//软件狗主要处理设备异常退出却没能正常启动(非直接的代码异常),通过软件狗定期检查,直接重启系统
//密码进入设置页面的明确的是管理员的操作的则关闭软件狗,退出管理页面后重新开启软件狗
##13.【自动校时】功能务必添加和注意
//iot设备由于生产环节的不可预知性,可能时区错乱,时间意外丢失等问题,,所以需要根据协议返回时间(返回头)调整设备时间,检查时差超过3分钟则调整,注意设置时候的时区设置
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
String times =simpleDateFormat.format(date);
14.网络变化监听建议使用NetworkCallback()
//使用监听而不再使用之前的注册广播是因为其有 更好的性能和更快速响应
ConnectivityManager connectivityManager = (ConnectivityManager) context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
connectivityManager.requestNetwork(new NetworkRequest.Builder().build(), new ConnectivityManager.NetworkCallback(){
@Override
public void onAvailable(Network network) {
super.onAvailable(network);
Log.d("feisher","网络连接可用:::");
int networkType = NetworkUtils.getNetworkType(App.instants);
EventBus.getDefault().post(new NetworkType(networkType,true));
}
@Override
public void onLost(Network network) {
super.onLost(network);
Log.d("feisher","网络丢失:::");
int networkType = NetworkUtils.getNetworkType(App.instants);
EventBus.getDefault().post(new NetworkType(networkType,false));
}
});
##15.须考虑协议数据异常和硬件故障
//协议返回异常数据 or 硬件故障 都是不可避免的,,所以一定要做好异常捕捉和日志记录,并且做好程序的兼容恢复,一定不能出现页面卡死现象
16.gradle构建方式优化
allprojects {
repositories {
// google()
// jcenter()
//替代上面两个,实现高效下载依赖库,用国内镜像,项目依赖库可以更快速的加载
maven { url 'https://maven.aliyun.com/repository/google' }
maven { url 'https://maven.aliyun.com/repository/jcenter' }
maven { url "https://jitpack.io" }
}
}
17.稳定第一,请勿过分追新(kotlin可用–理解的前提下)
//新技术固然好,但是在iot设备上稳定第一,不用考虑组件化,插件化,mvp解耦……等,iot设备职能单一,不会有过于复杂的职能,过分追求组件插件和解耦反倒会使得代码凌乱不易维护
18.闪屏和主页需要显示必要的信息
//硬件编号SN + IP + 软件版本 ,,必须在页面上显示出关键信息,以便出现问题后可以快速查到对应的设备和软件分支,
//页面需要有网络状态显示(联网,断网,网络类型)
19.未完 ,待续……
今天的文章安卓IOT(物联网)开发禁忌分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/14350.html