现在很多公司都开始做智能硬件产品,主要是在Android开发板上面开发应用app,尤其这两年物联网越来越火,这方面的需求越来越多,目前公司也是做智能公交站台的,需要开发的app实现开机自启动,异常崩溃重新启动,版本升级静默安装并自动打开,定时开关机,感觉都要跟Android系统打交道,查了很多资料,开发的时候也遇到很多坑,终于整合完成了,现在连夜分享出去,希望能够帮到大家:

首先把实现这些功所要用到的权限全部加入清单文件中:

android:name="android.permission.SYSTEM_ALERT_WINDOW" />android:name="android.permission.WRITE_EXTERNAL_STORAGE" />android:name="android.permission.RECEIVE_BOOT_COMPLETED" />android:name="android.permission.GET_TASKS" />android:name="android.permission.ACCESS_NETWORK_STATE" />android:name="android.permission.INTERNET" />android:name="android.permission.READ_EXTERNAL_STORAGE" />android:name="android.permission.READ_FRAME_BUFFER" />android:name="android.permission.RECEIVE_BOOT_COMPLETED" />android:name="android.permission.REBOOT" />android:name="android.permission.MODIFY_PHONE_STATE" />android:name="android.permission.DEVICE_POWER" />android:name="android.permission.SHUTDOWN" />android:name="android.permission.READ_FRAME_BUFFER" />android:name="android.permission.WRITE_MEDIA_STORAGE" />android:name="android.permission.WRITE_EXTERNAL_STORAGE" />android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />android:name="android.permission.CHANGE_NETWORK_STATE" />android:name="android.permission.ACCESS_WIFI_STATE" />android:name="android.permission.CHANGE_WIFI_STATE" />android:name="android.permission.ACCESS_NETWORK_STATE" />android:name="android.permission.SERIAL_PORT" />android:name="android.permission.WRITE_SETTINGS" />android:name="android.permission.WRITE_SECURE_SETTINGS" />android:name="android.permission.INSTALL_PACKAGES" />android:name="android.permission.INSTALL_LOCATION_PROVIDER" />
android:name="android.permission.DELETE_PACKAGES" />
android :name= "android.permission.READ_MEDIA_STORAGE" /> android :name= "android.permission.SET_TIME" /> android :name= "android.permission.STATUS_BAR" /> android :name= "android.permission.ACCESS_FINE_LOCATION" /> android :name= "android.permission.ACCESS_CACHE_FILESYSTEM" /> android :name= "android.permission.DELETE_CACHE_FILES" /> android :name= "android.permission.MODIFY_SOUND_SETTINGS" /> android :name= "android.permission.MODIFY_AUDIO_SETTINGS" />

1,开机自启动:开启一个广播监控就好了

/** * 我们通过广播来启动Activity的时候如果不设置intentFLAG_ACTIVITY_NEW_TASK属性,就会报这个异常: * android.util.AndroidRuntimeException: * Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. * 就是说在activity上下文之外调用startActivity需要FLAG_ACTIVITY_NEW_TASK属性。 * * @author Administrator */public class BootCompletedReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        //UpdateActivity.class是程序启动的主Activity        Intent intent1 = new Intent(context, UpdateActivity.class);        intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);        context.startActivity(intent1);    }}还要在清单文件中注册广播:
android:name=".receiver.BootCompletedReceiver">            android:name="android.intent.action.BOOT_COMPLETED" />        android:name="android.intent.category.HOME" />    

2,app崩溃自启动:在程序入口Application中实现。

不过有些异常崩溃,但是进程并没有杀死,这种请款就没效果了,可以参考兄弟博客(看门狗的实现):https://blog.csdn.net/yunmenggyy/article/details/50320469

public class BaseApplication extends Application {    public static Context mContext;    public static Context getContext() {        return mContext;    }    @Override    public void onCreate() {        super.onCreate();        //获取全局上下文        mContext = getApplicationContext();        //程序崩溃异常捕获并自动重启        Thread.setDefaultUncaughtExceptionHandler(restartHandler);    }    private Thread.UncaughtExceptionHandler restartHandler = new Thread.UncaughtExceptionHandler() {        @Override        public void uncaughtException(Thread t, Throwable e) {                        Intent intent = new Intent(mContext, UpdateActivity.class);            //重启应用,得使用PendingIntent            PendingIntent restartIntent = PendingIntent.getActivity(mContext, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);                        AlarmManager mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);            mAlarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + 2000,                    restartIntent); // 2秒钟后重启应用            //退出程序            android.os.Process.killProcess(android.os.Process.myPid());  //结束当前进程        }    };}

3,apk实现静默安装和自动打开,这个需要系统签名,不过做智能硬件开发都会有系统签名的,也很简单,这里就不说了:

xmlns:android="http://schemas.android.com/apk/res/android"    android:sharedUserId="android:sharedUserId="android.uid.system"">

需要的权限

    
   
   
   
   

方法:

/** * 说明: * * android.os.Process.killProcess(android.os.Process.myPid());如果不加,最后不会提示完成、打开。 * * intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);如果不加,最后安装完成,点打开,无法打开新版本应用。 */private void installAPK() {    //apkPath是程序从服务器上面下载的安装包存储位置     String apkPath = Environment.getExternalStorageDirectory().getPath().toString() + File.separator + "test.apk";    Intent intent = new Intent(Intent.ACTION_VIEW);    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);    intent.setDataAndType(Uri.fromFile(new File(apkPath)), "application/vnd.android.package-archive");    startActivity(intent);    android.os.Process.killProcess(android.os.Process.myPid());}

4,实现自动开关机功能见博客:https://blog.csdn.net/qq_29586601/article/details/69257481

只有关机功能,开机功能没有实现不过Android开发板可以通过电源管理实现自动开机。


总结:这几个功能基本都要用到系统签名,上面有很多权限都是需要系统签名才有效的,很多会报错,提示就是要系统签名才能使用,这个不影响程序的开发,不签名也可以运行程序,这种报错可以忽略。

有不当之处请给与提示。目前这些功能全部整合到公司项目中。



更多相关文章

  1. Android应用程序窗口(Activity)的测量(Measure)、布局(Layout)和绘制(Dr
  2. 【Android 系统开发】Android JNI 之 JNIEnv 解析
  3. android 蓝牙4.0广播功能应用
  4. Android系统启动流程 -- bootloader
  5. Android应用程序组成部分
  6. Android去除系统自带动画的两种方法
  7. 使用Java代码在应用层获取Android系统属性
  8. 【Android】win10操作系统下Android开发环境配置
  9. adb shell 命令查看android 应用程序 创建的 sqlite 数据库

随机推荐

  1. android Rect的使用
  2. 【Android代码片段之三】TabActivity实现
  3. Android(安卓)百度地图-实现POI的搜索(搜
  4. android O 手机关机流程与时间
  5. Layout inflation is the term used with
  6. Android之键盘点击事件
  7. android Manifest merger failed : Attri
  8. Android(安卓)去掉窗口标题和程序全屏
  9. [Android]关于filed 遍历资源文件的排序
  10. android GPS JAVA 获取GPS功能是否禁用