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. 如何监听锁屏,息屏,亮屏,自动点亮屏,一直保持亮屏

感谢阅读:

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

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

相关推荐
Sugobet40 分钟前
【安卓][Mac/Windows】永久理论免费 无限ip代理池 - 适合临时快速作战
android·tcp/ip·macos·网络安全·渗透测试·ip代理池·接入点
fatiaozhang95275 小时前
创维智能融合终端SK-M424_S905L3芯片_2+8G_安卓9_线刷固件包
android·电视盒子·刷机固件·机顶盒刷机
来来走走5 小时前
Flutter开发 了解Scaffold
android·开发语言·flutter
AlbertZein5 小时前
HarmonyOS5 源码分析 —— ‘状态管理’如何管理的(1)?
架构·harmonyos
你的人类朋友7 小时前
❤️‍🔥对过度设计的反思
程序员·架构·设计
哆啦A梦的口袋呀7 小时前
Android 底层实现基础
android
闻道且行之7 小时前
Android Studio下载及安装配置
android·ide·android studio
alexhilton7 小时前
初探Compose中的着色器RuntimeShader
android·kotlin·android jetpack
小墙程序员7 小时前
kotlin元编程(二)使用 Kotlin 来生成源代码
android·kotlin·android studio
小墙程序员8 小时前
kotlin元编程(一)一文理解 Kotlin 反射
android·kotlin·android studio