近期在开发过程中遇到几个问题,应用B在初始化的时候,需要通过Android板子的芯片加密验证,但是现在加密芯片不稳定,有时候能够初始化通过,有时候整个应用会直接崩溃掉,出现“程序已经停止运行“的Dialog,需要人为的点击确定,然后去打开应用。这是问题一;问题二:程序在跑的过程中,有时也会遇到因为加密芯片不稳定而造成的程序崩溃。问题三:加密芯片在初始化的过程中,不会崩溃掉,这种情况下应用没办法正常工作;但是现在我们的板子是需要挂在公交车上面,进行视频采集的,因为这种场景下是无屏幕,无声音,人是不可能进行操作。因此,必须要有一种实现方式,务必确保程序能够始终运行在后台。说的更加直白一点就是必须要有一个守护的进程,对其进行守护,那要实现这个功能,最简单的想法就是:做一个守护的APP,开启监听开机广播,然后在广播中启动一个服务,在该服务中将查看当前运行的进程,如果发现B应用还未启动,那么我们通过隐士意图的方式启动应用B。
此外,这里还有一个关键性的问题!我们的应用在崩溃的时候,android的系统会提示”运行停止“,这个时候,我们的应用进程还在后台,只有当我们点击确定的时候,这个进程才被回收掉。那么,怎么解决这个问题呢?我们需要自定义一个异常CrashHandler继承自UncaughtExceptionHandler,并Thread.setDefaultUncaughtExceptionHandler()方法将异常处理类设置到线程上。在异常的处理上,我们直接干掉这个进程,这样我们的看门狗就可以发现了。这个可以解决问题一以及问题二。但是问题三没得到解决,本来想着在遇到情况三时,直接自己杀结束自己进程,但是现在由于芯片以及库的原因不允许这么干。所以怎么办?这里我想到了给看门狗发消息的方式。我们在进入程序的时候使用AIDL技术给看门狗发一条消息msg1,在初始化成功以后,会给看门狗再发一条消息msg2。这样,当看门狗收不到消息msg2的时候就该重启这个应用B了(注意使用AIDL文件务必确保他所在的包路径一样!!!)。下面是看门狗的Manifest文件
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.vechicledog"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.reconova.vechicledog.activity.MainActivity"
android:label="@string/app_name"
android:theme="@android:style/Theme.NoDisplay">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 看门狗服务 -->
<service android:name="com.reconova.vechicledog.service.VechicleDogService" >
<intent-filter>
<action android:name="com.reconova.VECHICLE_DOG_SERVICE" />
</intent-filter>
</service>
<!-- 开机监听 -->
<receiver android:name="com.reconova.vechic