安卓IOT(物联网)开发禁忌

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(数据发送)
复制代码

RS232接口定义

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.未完 ,待续……

猜你喜欢

转载自juejin.im/post/7054443887909142536