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

让创意展翅翱翔,让广告店引领你的声音。

一、前言

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

二、监听开机自启设置APP

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

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

  1. 注册相关权限,接受开解结束权限,和相关网络权限(后面介绍为什么)
ini 复制代码
<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" />
  1. 注册开机启动静态广播,
ini 复制代码
<receiver
    android:name="com.wx.xxxx.xxxxx.BootReceiver"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>
  1. 处理监听到开机广播,第一次,从一个App开机自启动,接收到开机广播跳转到另一个广告App,需要从自己Activity界面执行,所以要先打开自己的包内的Activity,然后手动执行再从自己包内执行跳转到其他广告app.也可在该界面配置相关设置,启动哪个广告app.
kotlin 复制代码
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用于跳转。

scss 复制代码
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)
    }
  }
  1. 为啥前面要注册网络权限? 广告APP每次进去先进去拉取广告数据,然后展示广告。但是有些比较老版本Android 6.0,或者Android 7.0的机器,如果按照上面做法,后面每次开机启动,打开监听开机自启设置APP,再打开广告App,可能存在,广告App在拉取网络数据时候,系统开机完,但是网络wifi或者有线网络还没有连接成功。有个时间差,大概5到6秒,广告app那边就展示不出来,只能等到下一次轮训才行,或者监听到网络连接成功才发送请求?所以在监听开机自启设置APP等到网络连接成功后再启动到广告app. 如下:
kotlin 复制代码
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)
                }
            // 网络连接成功
              }
        }
    }
}
  1. 配置监听前台运行服务BootService如下:打开广告屏App后启动让其处于前台服务,注意结合通知栏开启前台服务,让其在里面,定时检测广告App是否位于前台,如果在后台,将其打开:监听代码:
kotlin 复制代码
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. 监听息屏,亮屏广告,需要注册权限
ini 复制代码
<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
  1. 动态注册广播,添加如下action:
    Intent.ACTION_SCREEN_OFF:锁屏
    Intent.ACTION_SCREEN_ON: 亮屏
    Intent.ACTION_POWER_CONNECTED:插上外部电源
scss 复制代码
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)
  1. 接受锁屏监听广告:
kotlin 复制代码
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_RECENTS
context.startActivity(intent)
   }
   Intent.ACTION_POWER_CONNECTED->
}
   }
}
  1. 注意锁屏界面:最好把锁屏锁在的Activity 启动模式设置成:
ini 复制代码
android:launchMode="singleInstance"

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

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

  1. 需要添加权限
ini 复制代码
<uses-permission android:name="android.permission.WAKE_LOCK"/>
  1. 在你的Activity或者Service中,获取PowerManager服务:
ini 复制代码
val pm = getSystemService(POWER_SERVICE) as PowerManager
  1. 然后使用使用WakeLock来触发实现亮屏。
css 复制代码
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

css 复制代码
val wakeLock: WakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "MyApp::MyWakelockTag")
wakeLock.acquire() // 持续保持屏幕唤醒直到release()被调用
  1. 当不再需要保持屏幕唤醒时,你应该释放WakeLock 5. 当想一直保持亮屏不锁屏时候:需要添加如下代码,典型应用是播放视频的时候。
scss 复制代码
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

五、总结

本文重点介绍了:

  1. 如何监听开机启动
  2. 如何从一个app打开另一个app
  3. 如何监听一个app是否在前台后台,
  4. 如何监听锁屏,息屏,亮屏,自动点亮屏,一直保持亮屏

感谢阅读:

欢迎用你发财的小手 关注,点赞、收藏

这里你会学到不一样的东西

相关推荐
pq113_62 分钟前
OrangePi Zero 3学习笔记(Android篇)4 - eudev编译(获取libudev.so)
android·笔记·学习
慧一居士7 分钟前
Docker Compose 的详细使用总结、常用命令及配置示例
容器·架构
杰克逊的日记22 分钟前
运维体系架构规划
运维·架构
Microsoft Word2 小时前
Hadoop架构再探讨
大数据·hadoop·架构
互联网搬砖老肖2 小时前
Web 架构之数据读写分离
前端·架构·web
Pasregret4 小时前
云原生 MySQL 架构:从容器化到 Serverless
mysql·云原生·架构
白总Server4 小时前
微软系统 红帽系统 网络故障排查:ping、traceroute、netstat
linux·运维·服务器·microsoft·中间件·架构·github
鸿蒙布道师4 小时前
鸿蒙NEXT开发动画案例3
android·ios·华为·harmonyos·鸿蒙系统·arkui·huawei
鸿蒙布道师4 小时前
AI原生手机:三大技术阵营的终极对决与未来展望
android·人工智能·ios·华为·智能手机·ai-native·hauwei
每次的天空4 小时前
移动应用开发:自定义 View 处理大量数据的性能与交互优化方案
android·java·学习·交互