app安装,充电 通知

This commit is contained in:
renhaoting 2025-12-30 15:36:09 +08:00
parent 5630c02394
commit 8a442dbd54
7 changed files with 114 additions and 10 deletions

View File

@ -87,6 +87,26 @@
</intent-filter> </intent-filter>
</receiver> </receiver>
<receiver
android:name="com.remax.notification.newUtil.events.AppInstallReceiver"
android:enabled="true"
android:exported="false">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_ADDED" />
<action android:name="android.intent.action.PACKAGE_REPLACED" />
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<data android:scheme="package" />
</intent-filter>
</receiver>
<receiver android:name="com.remax.notification.newUtil.events.PowerConnectionReceiver"
android:enabled="true"
android:exported="false">
<intent-filter>
<action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
</intent-filter>
</receiver>
</application> </application>

View File

@ -1,17 +1,17 @@
package com.gamedog.vididin.main package com.gamedog.vididin.main
import android.app.Activity import android.app.Activity
import android.content.BroadcastReceiver
import android.content.Intent import android.content.Intent
import android.content.IntentFilter import android.content.IntentFilter
import com.ama.core.common.util.asSafe
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentManager.FragmentLifecycleCallbacks
import androidx.viewpager2.widget.ViewPager2
import android.view.LayoutInflater import android.view.LayoutInflater
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.activity.viewModels import androidx.activity.viewModels
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentManager.FragmentLifecycleCallbacks
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.viewpager2.widget.ViewPager2
import com.ama.core.architecture.appBase.AppViewsActivity import com.ama.core.architecture.appBase.AppViewsActivity
import com.ama.core.architecture.appBase.OnFragmentBackgroundListener import com.ama.core.architecture.appBase.OnFragmentBackgroundListener
import com.ama.core.architecture.ext.toast import com.ama.core.architecture.ext.toast
@ -20,8 +20,8 @@ import com.ama.core.architecture.util.SpUtil
import com.ama.core.architecture.util.bindViewPager2 import com.ama.core.architecture.util.bindViewPager2
import com.ama.core.architecture.util.setCommonNavigator import com.ama.core.architecture.util.setCommonNavigator
import com.ama.core.architecture.util.setDataOrAdapter import com.ama.core.architecture.util.setDataOrAdapter
import com.ama.core.common.util.asSafe
import com.blankj.utilcode.util.ActivityUtils import com.blankj.utilcode.util.ActivityUtils
import com.vididin.real.money.game.R
import com.gamedog.vididin.VidiConst import com.gamedog.vididin.VidiConst
import com.gamedog.vididin.VididinEvents import com.gamedog.vididin.VididinEvents
import com.gamedog.vididin.adapter.MainTabsAdapter import com.gamedog.vididin.adapter.MainTabsAdapter
@ -40,19 +40,21 @@ import com.remax.notification.builder.LANDING_NOTIFICATION_TITLE
import com.remax.notification.check.NotificationCheckController import com.remax.notification.check.NotificationCheckController
import com.remax.notification.config.PushContent import com.remax.notification.config.PushContent
import com.remax.notification.controller.NotificationLandingController import com.remax.notification.controller.NotificationLandingController
import com.remax.notification.newUtil.events.AppInstallReceiver
import com.remax.notification.newUtil.events.PowerConnectionReceiver
import com.remax.notification.service.NotificationKeepAliveServiceManager import com.remax.notification.service.NotificationKeepAliveServiceManager
import com.vididin.real.money.game.R
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlin.getValue
import com.vididin.real.money.game.databinding.ActivityMainBinding as ViewBinding
import com.gamedog.vididin.main.MainUiState as UiState import com.gamedog.vididin.main.MainUiState as UiState
import com.gamedog.vididin.main.MainViewModel as ViewModel import com.gamedog.vididin.main.MainViewModel as ViewModel
import com.vididin.real.money.game.databinding.ActivityMainBinding as ViewBinding
@AndroidEntryPoint @AndroidEntryPoint
class MainActivity : AppViewsActivity<ViewBinding, UiState, ViewModel>(), OnTabStyleListener { class MainActivity : AppViewsActivity<ViewBinding, UiState, ViewModel>(), OnTabStyleListener {
private lateinit var mAppInstallReceiver: AppInstallReceiver
private lateinit var mPowerReceiver: BroadcastReceiver
private lateinit var activityLauncher: ActivityLauncher private lateinit var activityLauncher: ActivityLauncher
override val mViewModel: ViewModel by viewModels() override val mViewModel: ViewModel by viewModels()
private lateinit var navigatorAdapter: MainTabsAdapter private lateinit var navigatorAdapter: MainTabsAdapter
@ -91,6 +93,7 @@ class MainActivity : AppViewsActivity<ViewBinding, UiState, ViewModel>(), OnTabS
mDateChangeReceiver = DateChangeReceiver() mDateChangeReceiver = DateChangeReceiver()
val filter = IntentFilter(Intent.ACTION_DATE_CHANGED) val filter = IntentFilter(Intent.ACTION_DATE_CHANGED)
registerReceiver(mDateChangeReceiver, filter) registerReceiver(mDateChangeReceiver, filter)
registerReceivers()
onBackPressedDispatcher.addCallback(this@MainActivity) { onBackPressedDispatcher.addCallback(this@MainActivity) {
if (mViewModel.canBack) { if (mViewModel.canBack) {
@ -153,6 +156,7 @@ class MainActivity : AppViewsActivity<ViewBinding, UiState, ViewModel>(), OnTabS
override fun onDestroy() { override fun onDestroy() {
super.onDestroy() super.onDestroy()
unregisterReceiver(mDateChangeReceiver) unregisterReceiver(mDateChangeReceiver)
unregisterReceivers()
} }
override fun onTabIsDarkFont(isDarkFont: Boolean) { override fun onTabIsDarkFont(isDarkFont: Boolean) {
@ -282,6 +286,29 @@ class MainActivity : AppViewsActivity<ViewBinding, UiState, ViewModel>(), OnTabS
} }
} }
private fun registerReceivers() {
mPowerReceiver = PowerConnectionReceiver()
val filter1 = IntentFilter().apply {
addAction(Intent.ACTION_POWER_CONNECTED)
addAction(Intent.ACTION_POWER_DISCONNECTED)
}
registerReceiver(mPowerReceiver, filter1)
mAppInstallReceiver = AppInstallReceiver()
val filter2 = IntentFilter().apply {
addAction(Intent.ACTION_PACKAGE_ADDED)
addAction(Intent.ACTION_PACKAGE_REPLACED)
addAction(Intent.ACTION_PACKAGE_REMOVED)
addDataScheme("package")
}
registerReceiver(mAppInstallReceiver, filter2)
}
private fun unregisterReceivers() {
unregisterReceiver(mPowerReceiver)
unregisterReceiver(mAppInstallReceiver)
}
companion object { companion object {

View File

@ -55,6 +55,7 @@
android:enabled="true" android:enabled="true"
android:exported="false" android:exported="false"
android:foregroundServiceType="specialUse" /> android:foregroundServiceType="specialUse" />
</application> </application>
</manifest> </manifest>

View File

@ -49,6 +49,8 @@ class NotificationCheckController private constructor() {
UNLOCK("local_push"), // 解锁通知 UNLOCK("local_push"), // 解锁通知
BACKGROUND("local_push"), // app后台 - for withdraw BACKGROUND("local_push"), // app后台 - for withdraw
FIXTIMEPOINT("fix_time_point_push"), // 每日固定时间点 "9:10""12:10""13:10""19:10""21:00""22:30""23:30" FIXTIMEPOINT("fix_time_point_push"), // 每日固定时间点 "9:10""12:10""13:10""19:10""21:00""22:30""23:30"
APPINSTALL("app_install"),
CHARGE("charge"),
KEEPALIVE("local_push"), // 保活通知(无间隔限制) KEEPALIVE("local_push"), // 保活通知(无间隔限制)
FCM("firebase_push"), // FCM 推送通知(无间隔限制) FCM("firebase_push"), // FCM 推送通知(无间隔限制)
RESIDENT("top_notification") // 常驻(无间隔限制) RESIDENT("top_notification") // 常驻(无间隔限制)

View File

@ -0,0 +1,22 @@
package com.remax.notification.newUtil.events
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import com.remax.notification.check.NotificationCheckController
import com.remax.notification.timing.NotificationTimingController
class AppInstallReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
when (intent?.action) {
Intent.ACTION_PACKAGE_ADDED, Intent.ACTION_PACKAGE_REPLACED, Intent.ACTION_PACKAGE_REMOVED -> {
NotificationTimingController.getInstance()
.triggerNotificationIfAllowed(NotificationCheckController.NotificationType.APPINSTALL)
}
}
}
}

View File

@ -0,0 +1,22 @@
package com.remax.notification.newUtil.events
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import com.remax.notification.check.NotificationCheckController
import com.remax.notification.timing.NotificationTimingController
class PowerConnectionReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
when (intent.action) {
Intent.ACTION_POWER_CONNECTED -> {
NotificationTimingController.getInstance()
.triggerNotificationIfAllowed(NotificationCheckController.NotificationType.CHARGE)
}
Intent.ACTION_POWER_DISCONNECTED -> {
NotificationTimingController.getInstance()
.triggerNotificationIfAllowed(NotificationCheckController.NotificationType.CHARGE)
}
}
}
}

View File

@ -279,6 +279,8 @@ class NotificationTimingController private constructor() : LifecycleObserver {
NotificationCheckController.NotificationType.FCM -> "FCM推送通知" NotificationCheckController.NotificationType.FCM -> "FCM推送通知"
NotificationCheckController.NotificationType.RESIDENT -> "常驻通知" NotificationCheckController.NotificationType.RESIDENT -> "常驻通知"
NotificationCheckController.NotificationType.FIXTIMEPOINT -> "固定时间点通知" NotificationCheckController.NotificationType.FIXTIMEPOINT -> "固定时间点通知"
NotificationCheckController.NotificationType.APPINSTALL -> "APP安装卸载"
NotificationCheckController.NotificationType.CHARGE -> "手机充电"
} }
DataReportManager.reportData("Notific_Pull", mapOf("topic" to "localPush")) DataReportManager.reportData("Notific_Pull", mapOf("topic" to "localPush"))
@ -331,6 +333,14 @@ class NotificationTimingController private constructor() : LifecycleObserver {
NotificationCheckController.NotificationType.FIXTIMEPOINT -> { NotificationCheckController.NotificationType.FIXTIMEPOINT -> {
showNotifyRandom() showNotifyRandom()
} }
NotificationCheckController.NotificationType.APPINSTALL -> {
showNotifyRandom()
}
NotificationCheckController.NotificationType.CHARGE -> {
showNotifyRandom()
}
} }