关闭

android开机自动唤醒屏幕、打开锁屏页并启动app

标签: android开机自启屏幕唤醒屏幕解锁
2674人阅读 评论(0) 收藏 举报
分类:
 最近有个需求要求app要开机自启动,就按照一般的套路去注册了一个静态广播接收器,代码如下:
     manifest文件:
<receiver android:name=".receiver.StartupReceiver">
 	<intent-filter>
             <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
</receiver>
     java文件:
public class StartupReceiver extends BroadcastReceiver {
         @Override
         public void onReceive(Context context, Intent intent) {
             ByLog.i(intent.getAction());
             //开机启动
             Intent mainIntent = new Intent(context, MainActivity.class);
             //在BroadcastReceiver中显示Activity,必须要设置FLAG_ACTIVITY_NEW_TASK标志
             mainIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
             context.startActivity(mainIntent);
         }
     }
     OK,运行然后重启。。。然而并没有作用。换了几个姿势重新重启。。。然而并没有作用。
     google了一下,应该是没有添加<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />的缘故,于是添加上这行代码继续测试。。。然而并没有作用!!!
     OK,继续google。但是google来google去得到的的结论都差不多,只要按照上面的套路来就可以接收到开机广播了。期间在stackoverflow一篇问答上看到有的说法是要加上
     <action android:name="android.intent.action.QUICKBOOT_POWERON" />,于是尝试了。。。然而并没有作用。
      然后,我想到了可能是权限的问题,可能自启动权限被系统禁用了,于是到应用管理里面找到自家的app,进入权限设置页,没有自启动这一选项啊。。。那可能就是手机的问题了,因为刚才用来测试的是国产机。。。可能有改了些什么系统代码(stackoverflow 有一篇问答上就有提到小米和htc使用了非常规或者自定义的开机广播action)。。。于是就换了一部机子测试,通过了!!!!
     冷静下来仔细想想,发现还有个解释不通的地方:第一部机子开机时留意到某些软件是可以开机自启的(启动后马上在通知栏里面出现了),也就是说我的app应该也可以在那部机子上开机自启的才对。于是抱着学习的心态去反编译了那些软件,结果发现它们不仅仅接受BOOT_COMPLETED广播,同时还接收了NEW_OUTGOING_CALL、PHONE_STATE、CONNECTIVITY_CHANGE,难怪。。。但我不能这么做啊,它那个只是在通知栏里面通知,我这是要启动app的。。。
      想不通啊,最后想来想去觉得最有可能还是设置里面某些选项禁掉了开机启动,于是在设置里面一项一项仔细的找,然后我看到了应用权限页面里有个设置单项权限的菜单,想着设置单项跟外面的一起列出来的应该是一样的权限选项才对(之前也是这么想的,所以就没点进去),但是点进去一看,里面竟然就有外面没列出的应用自动启动选项 !!!我顿时就忍不住爆粗了。。。把这个选项打开,测试,毫无悬念的通过了。。。
     开机自启这个是通过了,但是还有个问题就是开机之后一般都会停留在锁屏页且短时间内没有进行解锁操作屏幕会进入休眠状态,之后要手动操作进到系统才能看到打开的app,这个不能放着不管。于是又只能靠google了,花费了些时间,终于找到了解决方法(改源码那些解决方法我就不用想了,暂时做不到T_T),就是在app启动时,主动唤醒屏幕并解锁,代码如下:
//屏幕唤醒
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP
     | PowerManager.SCREEN_DIM_WAKE_LOCK, "StartupReceiver");//最后的参数是LogCat里用的Tag
wl.acquire();
//屏幕解锁
KeyguardManager km= (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
KeyguardManager.KeyguardLock kl = km.newKeyguardLock("StartupReceiver");//参数是LogCat里用的Tag
kl.disableKeyguard();
到此,开机自启的这块需求就算是完成了。最后附上完整的代码:
 manifest文件:
记得要添加权限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver android:name=".receiver.StartupReceiver">
     <intent-filter>
          <action android:name="android.intent.action.BOOT_COMPLETED" />
          <action android:name="android.intent.action.QUICKBOOT_POWERON" />
     </intent-filter>
</receiver>
     java文件:
 public class StartupReceiver extends BroadcastReceiver {
         @Override
         public void onReceive(Context context, Intent intent) {
             ByLog.i(intent.getAction());

              //开机后一般会停留在锁屏页面且短时间内没有进行解锁操作屏幕会进入休眠状态,此时就需要先唤醒屏幕和解锁屏幕
              //屏幕唤醒
              PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
              PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP
                 | PowerManager.SCREEN_DIM_WAKE_LOCK, "StartupReceiver");//最后的参数是LogCat里用的Tag
              wl.acquire();

              //屏幕解锁
              KeyguardManager km= (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
              KeyguardManager.KeyguardLock kl = km.newKeyguardLock("StartupReceiver");//参数是LogCat里用的Tag
              kl.disableKeyguard();

             //开机启动
             Intent mainIntent = new Intent(context, MainActivity.class);
             //在BroadcastReceiver中显示Activity,必须要设置FLAG_ACTIVITY_NEW_TASK标志
             mainIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
             context.startActivity(mainIntent);
         }
     }
     
在解决开机自启的问题时发现了一篇文章,觉得里面提到的自启动失败的原因总结的很好,后面的adb发送广播更是省下了很多操作,节约了很多时间,在这里摘录(略有修改)一下以防以后找不到:
     2、自启动失败的原因
     接收不到BOOT_COMPLETED广播可能的原因
          (1)、BOOT_COMPLETED对应的action和uses-permission("android.permission.RECEIVE_BOOT_COMPLETED" )没有一起添加
          (2)、应用安装到了sd卡内,安装在sd卡内的应用是收不到BOOT_COMPLETED广播的,可以在manifest节点下添加android:installLocation="internalOnly"来指定只能安装在手机内存里面,也可以监听开机加载sd卡的广播,可惜有的手机是没有sd卡的。。。
          (3)、系统开启了Fast Boot模式,这种模式下系统启动并不会发送BOOT_COMPLETED广播
          (4)、应用程序安装后重来没有启动过,这种情况下应用程序接收不到任何广播,包括BOOT_COMPLETED、ACTION_PACKAGE_ADDED、CONNECTIVITY_ACTION等等。
          Android3.1之后,系统为了加强了安全性控制,应用程序安装后或是(设置)应用管理中被强制关闭后处于stopped状态,在这种状态下接收不到任何广播,除非广播带有FLAG_INCLUDE_STOPPED_PACKAGES标志,而默认所有系统广播都是FLAG_EXCLUDE_STOPPED_PACKAGES的,所以就没法通过系统广播自启动了。所以Android3.1之后
          (1)、应用程序无法在安装后自己启动
          (2)、没有ui的程序必须通过其他应用激活才能启动,如它的Activity、Service、Content Provider被其他应用调用。
          存在一种例外,就是应用程序被adb push you.apk /system/app/下是会自动启动的,不处于stopped状态。


     具体说明见:
     3、adb发送BOOT_COMPLETED
     我们可以通过 adb shell am broadcast -a android.intent.action.BOOT_COMPLETED命令发送BOOT_COMPLETED广播,而不用重启测试机或模拟器来测试BOOT_COMPLETED广播(用真机测过,还是会重启的,所以推荐后面的指定报名命令),以下命令可以更精确的发送到某个package,如下:
     adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -c android.intent.category.HOME -n package_name/class_name
1
0
查看评论

通过adb操作安卓亮屏解锁打开app

由于持续集成进行每日测试,但是手机会自动关屏并锁定,所以需要远程控制亮屏解锁打开app。 可以adb进行如下操作,将命令保存到bat文件给CI平台调用。 亮屏 adb shell inputkeyevent 26 keyevent 26表示点击power 解锁 adb shell in...
  • feigoliu
  • feigoliu
  • 2016-01-12 16:57
  • 7144

通过推送消息控制Android系统锁屏、唤醒

最近一年以来,博主一直在搞密室逃脱方面的东西。涉及到的技术很杂,不少也很冷门。 前段时间有这样一个有意思的需求:要求服务器在达到一定要求时唤醒一台待机的投影仪自动进行播放,并且在不同的条件下播放不同的影片。 博主考察了一下市场发现现在市面上有这样几种投影仪: 普通投影仪,需要接一台电脑,在电...
  • jinciyulang
  • jinciyulang
  • 2016-01-19 11:06
  • 3360

android 屏幕保持唤醒 不锁屏

Android的PowerManager和PowerManager.WakeLock用法简析 之前的一个社区PDA项目在采集使用者坐标这个功能的时候,需要保持屏幕常亮,面对未涉及过的东西,网络是最好的学习工具,便去找相关的资料,发现原来可以使用PowerManager.WakeLock来实现要求的...
  • dong101692
  • dong101692
  • 2014-04-01 11:17
  • 1128

android之开机跳过锁屏界面自启动应用

最近做了个开机跳过锁屏界面直接启动应用的程序,做下总结 1、首先开机自启动,不用多说,只需要写个broadcastreceiver接收开启启动完成的广播即可Intent.ACTION_BOOT_COMPLETED public class BootCompletedReceiver exten...
  • wangsfine
  • wangsfine
  • 2016-04-20 10:27
  • 2059

ANDROID应用中怎样使屏幕不自动锁定

在ANDROID应用中,为了使应用一直保持屏幕不自动锁定的状态,我们需要用到所谓的Wake Lock。 为了使用Wake Lock,我们首先需要在AndroidManifest.xml配置文件里面增加如下的权限以使我们能够在代码中使用WakeLock类。 然后在代码中我们需要通过
  • snowolf_538
  • snowolf_538
  • 2011-07-21 21:56
  • 3421

android锁屏唤醒并解锁屏幕

1、这个方法是实现锁屏状态下唤醒手机,亮屏并解锁屏幕: public static void wakeUpAndUnlock(Context context){ //屏锁管理器 KeyguardManager km= (KeyguardManager) context.getSy...
  • bsmmaoshenbo
  • bsmmaoshenbo
  • 2016-05-28 17:01
  • 4838

Android 设置秒开全屏启动屏

1. 添加主题 @drawable/splash true true true true true true @android:color/transparent ...
  • u012319317
  • u012319317
  • 2017-05-03 12:42
  • 632

android 唤醒/解锁屏幕使用示例

转载http://blog.sina.com.cn/s/blog_44df6aa50101416m.html解锁、唤醒屏幕用到KeyguardManager,KeyguardLock,PowerManager,PowerManager.WakeLock所需权限:<uses-permission...
  • zouchengxufei
  • zouchengxufei
  • 2015-10-12 23:26
  • 2172

android锁屏状态下, 新消息唤醒屏幕,并跳转到指定页面

最近在做一个项目,有个功能,就和QQ电话差不多,我这边手机锁屏状态,当QQ电话过来时,立刻唤醒屏幕,并显示QQ来电界面,我的是当设备端有事件发生时通知app端弹出界面,实时显示设备端信息。 最核心的代码就是新消息的推送通知处理,这里不过多陈述,就是app绑定服务 ,在服务里开启一条线程,实时监测 ...
  • yang1159
  • yang1159
  • 2016-08-22 15:44
  • 7259

android 唤醒锁定屏幕和锁屏状态下点亮屏幕,并弹出闹钟提示信息

锁屏状态下点亮屏幕,并弹出闹钟提示信息,可以在锁屏界面上取消闹钟;使用广播接收闹钟定时: 下面是例子里的核心代码如下 android 设置定时闹钟(包括提醒一次和循环提醒): Intent intent = new Int...
  • qq_27623391
  • qq_27623391
  • 2016-04-25 17:34
  • 2443
    个人资料
    • 访问:2647次
    • 积分:39
    • 等级:
    • 排名:千里之外
    • 原创:1篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档