Android监听开机自启,是否在前后台,锁屏界面,息屏后自动亮屏,一直保持亮屏


2092181-20200723102731518-163247306.jpg

一、前言

在Android 广告屏设备开发中,大部分广告厂商开放式设计,广告的内容是单独的APP,只有很少一部分直接把Launcher做成广告屏app,所以,常常设计到开机自动启动APP,如果广告屏是触摸屏,被人玩耍,当游客走后,需要从不在广告屏界面,返回,或者在其他应用程序下自动切换到广告屏界面,有时候还可能涉及到锁屏到亮屏的处理。

二、监听开机自启设置APP


设计该APP的目的是:让这个APP 只监听开机,监听到后打开广告app,该App可定义设置界面,配置打开那个广告app。该App可以设置成带有前台服务的,让其在后台每隔多少秒自动检测配置的那个广告app是否在前台,如果没有让其切换到前台。这样可以让不同的广告App,无需将开机启动相关监听集成在自己里面,只需要安装开机自启设置APP然后配置好就行。

注:广告设备一般不会像手机rom被修改过,安全权限那么严格,需要用户同意才能。

  1. 注册相关权限,接受开机结束权限,和相关网络权限(后面介绍为什么)

<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /><uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

2.  注册开机启动静态广播,

<receiver    android:name="com.wx.xxxx.xxxxx.BootReceiver"    android:exported="true">    <intent-filter>        <action android:name="android.intent.action.BOOT_COMPLETED" />    </intent-filter></receiver>

3.  处理监听到开机广播,第一次,从一个App开机自启动,接收到开机广播跳转到另一个广告App,需要从自己Activity界面执行,所以要先打开自己的包内的Activity,然后手动执行再从自己包内执行跳转到其他广告app.也可在该界面配置相关设置,启动哪个广告app.

class BootReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {            intent?.action?.run {                when (this) {                    Intent.ACTION_BOOT_COMPLETED -> {                          val intent = Intent(context, MainActivity:java.class)                        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)                        context.startActivity(intent)                                                               }
                    else -> {
                    }                }            }          }}

打开另一个应用启动,直接拿到桌面Launcher点击的Intent用于跳转。

findViewById<View>(R.id.btn_start).setOnClickListener {    val intent = packageManager.getLaunchIntentForPackage("com.xxxx.xxxx")    if (intent != null) {//可能没有安装        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)        startActivity(intent)    }  }

4.  为啥前面要注册网络权限? 广告APP每次进去先进去拉取广告数据,然后展示广告。但是有些比较老版本Android 6.0,或者Android 7.0的机器,如果按照上面做法,后面每次开机启动,打开监听开机自启设置APP,再打开广告App,可能存在,广告App在拉取网络数据时候,系统开机完,但是网络wifi或者有线网络还没有连接成功。有个时间差,大概5到6秒,广告app那边就展示不出来,只能等到下一次轮训才行,或者监听到网络连接成功才发送请求?所以在监听开机自启设置APP等到网络连接成功后再启动到广告app. 如下:

val intentFilter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)registerReceiver(receiver, intentFilter)override fun onDestroy() {    super.onDestroy()    unregisterReceiver(receiver)}inner class NewWorkCheckReceiver : BroadcastReceiver() {    override fun onReceive(context: Context, intent: Intent?) {        intent?.action?.takeIf {            ConnectivityManager.CONNECTIVITY_ACTION == it        }?.let {            val connectivityManager: ConnectivityManager = context!!.getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager            val networkInfo = connectivityManager.getActiveNetworkInfo()            if (networkInfo != null && networkInfo.isConnected()) {                val intent = packageManager.getLaunchIntentForPackage("com.xxxx.xxxx")                if (intent != null) {                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)                    startActivity(intent)                }            // 网络连接成功              }        }    }}

配置监听前台运行服务BootService如下:打开广告屏App后启动让其处于前台服务,注意结合通知栏开启前台服务,让其在里面,定时检测广告App是否位于前台,如果在后台,将其打开:监听代码:

fun isBackground(context: Context): Boolean {    val activityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager    val appProcesses = activityManager.runningAppProcesses    for (appProcess in appProcesses) {        if (appProcess.processName == context.getPackageName()) {            return if (appProcess.importance == RunningAppProcessInfo.IMPORTANCE_BACKGROUND) {                Log.i("后台", appProcess.processName)                true            } else {                Log.i("前台", appProcess.processName)                false            }        }    }    return false}

三、锁屏广告,锁屏APP


锁屏广告页其实就是一个activity,该页面可以自定义相关界面,动画,视频等,如锁屏歌词界面。
注意:如果手机锁屏歌词等,一般需要打开通知,后台弹出,在其他应用上显示权限。
如果是系统app,开发系统锁屏App, 无需担心权限,自家系统权限都能直接给到。无需担心。

  1. 监听息屏,亮屏广告,需要注册权限

<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>

2.  动态注册广播,添加如下action:
Intent.ACTION_SCREEN_OFF:锁屏
Intent.ACTION_SCREEN_ON: 亮屏
Intent.ACTION_POWER_CONNECTED:插上外部电源

private val intentFilter by lazy {    val actions = arrayOf(  Intent.ACTION_SCREEN_OFF, Intent.ACTION_SCREEN_ON, Intent.ACTION_POWER_CONNECTED)    IntentFilter().apply {        actions.forEach { action ->            takeUnless {                it.hasAction(action)            }?.addAction(action)        }    }context.registerReceiver(XXXXXXReceiver(), intentFilter)

3.  接受锁屏监听广告:

private inner class XXXXXXReceiver : BroadcastReceiver() {   override fun onReceive(context: Context, intent: Intent?) {when (intent?.action ?: "") {   Intent.ACTION_SCREEN_OFF->{   //锁屏 开相关界面   }   Intent.ACTION_SCREEN_ON-> {   //亮屏     ```val intent = Intent(context, LockerActivity::class.java))intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTScontext.startActivity(intent)   }   Intent.ACTION_POWER_CONNECTED->}   }}

4.  注意锁屏界面:最好把锁屏锁在的Activity 启动模式设置成:

android:launchMode="singleInstance"

四、android 锁屏后自动亮屏或者一直保持亮屏


在Android中,想要在息屏后再自动亮屏:

  1. 需要添加权限

<uses-permission android:name="android.permission.WAKE_LOCK"/>

2.  在你的Activity或者Service中,获取PowerManager服务:

val pm = getSystemService(POWER_SERVICE) as PowerManager

3.  然后使用使用WakeLock来触发实现亮屏。

val wakeLock: WakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyApp::MyWakelockTag")wakeLock.acquire(10 * 60 * 1000L /*10 minutes*/) // 保持屏幕唤醒10分钟

如果你想让屏幕持续亮着直到用户明确地关闭它(如:通过按下电源键),你可以使用SCREEN_DIM_WAKE_LOCKSCREEN_BRIGHT_WAKE_LOCK代替PARTIAL_WAKE_LOCK

val wakeLock: WakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "MyApp::MyWakelockTag")wakeLock.acquire() // 持续保持屏幕唤醒直到release()被调用

4.  当不再需要保持屏幕唤醒时,你应该释放WakeLock5.  当想一直保持亮屏不锁屏时候:需要添加如下代码,典型应用是播放视频的时候。

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

五、总结


本文重点介绍了:

  1. 如何监听开机启动

  2. 如何从一个app打开另一个app

  3. 如何监听一个app是否在前台后台,

  4. 如何监听锁屏,息屏,亮屏,自动点亮屏,一直保持亮屏

作者:Wgllss链接:https://juejin.cn/post/7494083990069444648

关注我获取更多知识或者投稿

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值