
让创意展翅翱翔,让广告店引领你的声音。
一、前言
在Android 广告屏设备开发中,大部分广告厂商开放式设计,广告的内容是单独的APP,只有很少一部分直接把Launcher做成广告屏app,所以,常常设计到开机自动启动APP,如果广告屏是触摸屏,被人玩耍,当游客走后,需要从不在广告屏界面,返回,或者在其他应用程序下自动切换到广告屏界面,有时候还可能涉及到锁屏到亮屏的处理。
二、监听开机自启设置APP
设计该APP的目的是:让这个APP 只监听开机,监听到后打开广告app,该App可定义设置界面,配置打开那个广告app。该App可以设置成带有前台服务的,让其在后台每隔多少秒自动检测配置的那个广告app是否在前台,如果没有让其切换到前台。这样可以让不同的广告App,无需将开机启动相关监听集成在自己里面,只需要安装开机自启设置APP然后配置好就行。
注:广告设备一般不会像手机rom被修改过,安全权限那么严格,需要用户同意才能。
- 注册相关权限,接受开解结束权限,和相关网络权限(后面介绍为什么)
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" />
- 注册开机启动静态广播,
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>
- 处理监听到开机广播,第一次,从一个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)
}
}
- 为啥前面要注册网络权限? 广告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)
}
// 网络连接成功
}
}
}
}
- 配置监听前台运行服务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, 无需担心权限,自家系统权限都能直接给到。无需担心。
- 监听息屏,亮屏广告,需要注册权限
ini
<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
- 动态注册广播,添加如下
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)
- 接受锁屏监听广告:
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->
}
}
}
- 注意锁屏界面:最好把锁屏锁在的Activity 启动模式设置成:
ini
android:launchMode="singleInstance"
四、android 锁屏后自动亮屏或者一直保持亮屏
在Android中,想要在息屏后再自动亮屏:
- 需要添加权限
ini
<uses-permission android:name="android.permission.WAKE_LOCK"/>
- 在你的Activity或者Service中,获取PowerManager服务:
ini
val pm = getSystemService(POWER_SERVICE) as PowerManager
- 然后使用使用WakeLock来触发实现亮屏。
css
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
css
val wakeLock: WakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "MyApp::MyWakelockTag")
wakeLock.acquire() // 持续保持屏幕唤醒直到release()被调用
- 当不再需要保持屏幕唤醒时,你应该释放
WakeLock
5. 当想一直保持亮屏不锁屏时候:需要添加如下代码,典型应用是播放视频的时候。
scss
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
五、总结
本文重点介绍了:
- 如何监听开机启动
- 如何从一个app打开另一个app
- 如何监听一个app是否在前台后台,
- 如何监听锁屏,息屏,亮屏,自动点亮屏,一直保持亮屏