一、前言
在Android 广告屏设备开发中,大部分广告厂商开放式设计,广告的内容是单独的APP,只有很少一部分直接把Launcher做成广告屏app,所以,常常设计到开机自动启动APP,如果广告屏是触摸屏,被人玩耍,当游客走后,需要从不在广告屏界面,返回,或者在其他应用程序下自动切换到广告屏界面,有时候还可能涉及到锁屏到亮屏的处理。
二、监听开机自启设置APP
设计该APP的目的是:让这个APP 只监听开机,监听到后打开广告app,该App可定义设置界面,配置打开那个广告app。该App可以设置成带有前台服务的,让其在后台每隔多少秒自动检测配置的那个广告app是否在前台,如果没有让其切换到前台。这样可以让不同的广告App,无需将开机启动相关监听集成在自己里面,只需要安装开机自启设置APP然后配置好就行。
注:广告设备一般不会像手机rom被修改过,安全权限那么严格,需要用户同意才能。
注册相关权限,接受开机结束权限,和相关网络权限(后面介绍为什么)
<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, 无需担心权限,自家系统权限都能直接给到。无需担心。
监听息屏,亮屏广告,需要注册权限
<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中,想要在息屏后再自动亮屏:
需要添加权限
<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_LOCK
或SCREEN_BRIGHT_WAKE_LOCK
代替PARTIAL_WAKE_LOCK
val wakeLock: WakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "MyApp::MyWakelockTag")wakeLock.acquire() // 持续保持屏幕唤醒直到release()被调用
4. 当不再需要保持屏幕唤醒时,你应该释放WakeLock
5. 当想一直保持亮屏不锁屏时候:需要添加如下代码,典型应用是播放视频的时候。
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
五、总结
本文重点介绍了:
如何监听开机启动
如何从一个app打开另一个app
如何监听一个app是否在前台后台,
如何监听锁屏,息屏,亮屏,自动点亮屏,一直保持亮屏
作者:Wgllss链接:https://juejin.cn/post/7494083990069444648
关注我获取更多知识或者投稿