方案一

通过setComponentEnabledSetting方式,禁止掉应用的监听开机启动的广播组件。

代码如下:

getContext().getPackageManager().setComponentEnabledSetting(                new ComponentName("包名", "组件名"),                PackageManager.COMPONENT_ENABLED_STATE_DISABLED,                PackageManager.DONT_KILL_APP);

缺点:

  1. 让组件不能再使用,除非设置成COMPONENT_ENABLED_STATE_ENABLED。
  2. 系统开关机仍然有效,但应用被卸载此属性会失效。

方案二

通过forceStopPackage方式,将应用stop掉。应用被stop后,stopped属性变为true,如果应用没再被使用,开机启动时即使接收了开机广播应用也不会自启动。

代码如下:

private void setPackageForceStop(String pkg) {try {Method method = Class.forName("android.app.ActivityManager").getMethod("forceStopPackage", String.class);if (mActivityManager == null) {mActivityManager = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);}method.invoke(mActivityManager, pkg);} catch (Exception e) {e.printStackTrace();}}

缺点:

  • 如果该应用是系统应用,每次开机启动stopped属性会被置为false,即该应用能开机自启。
  • 同样的,如果该应用被卸载后重装也会导致stopped属性会被置为false,即该应用能开机自启。
  • 应用被stop后然后被使用,stopped属性会被置为false,即该应用能开机自启。

方案三

通过拦截应用的开机广播,不让应用接收到开机广播。因开机广播是全局的、无序的广播,暂时没有办法做到拦截应用的开机广播(系统端能做到,但这是应用层的业务,显然系统端不会做这样不合理的处理)。

方案四

通过禁止应用的开机广播权限,不让应用接收到开机广播。此想法应该是,暂时没法拦截应用的开机广播,就想法禁止应用的开机广播权限。总之,就是不想让应用接收到开机广播,但目前没有好的办法去禁止应用的开机广播权限。

总结

方案一和方案二是一般应用的实现方式,但两者都有一些小缺点,并且两者的实现都不能保证应用开机后不自启。所以,无论采用方案一和方案二,目前能想到的最好方式还是,管理应用自启动的APK自己开机自启后,stop掉被限制开机自启的应用,然后,如果此管理APK不必要,可以kill掉自己。

备注

  • 查看应用的stopped属性:dumpsys package com.tcl.tvweishi | grep stop
  • shell命令stop掉应用:am force-stop com.tcl.tvweishi

更多相关文章

  1. 自定义Dialog的几种实现方式
  2. android退出应用程序解决方案
  3. android R文件生成错误
  4. Android简单明了的使用属性动画ObjectAnimator 旋转 平移 渐变
  5. Android(安卓)文件下载三种基本方式
  6. Android(安卓)RecycerView 中根据图片大小自适应控件大小的实现
  7. Android动画播放的常用方式
  8. Android(安卓)ListView拖动时背景颜色会变成黑色 的解决办法
  9. Android(安卓)Studio Error:Connection timed out: connect.解决

随机推荐

  1. Android:FlexboxLayout你值得拥有的流布
  2. Kivy A to Z -- Android apk的生成过程
  3. android中widgets的简单实现
  4. Android中文API(134) —— Account
  5. 【转】Android(安卓)动画框架详解,第 1 部
  6. Android 跨线程更新 UI
  7. Android(安卓)开发学习笔记
  8. 【Android翻译】关于Activity的onSaveIns
  9. Android Service总结04 之被绑定的服务 -
  10. Android虚拟键盘弹出时挡住EditText解决