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>
</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>

View File

@ -1,17 +1,17 @@
package com.gamedog.vididin.main
import android.app.Activity
import android.content.BroadcastReceiver
import android.content.Intent
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 androidx.activity.addCallback
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.viewpager2.widget.ViewPager2
import com.ama.core.architecture.appBase.AppViewsActivity
import com.ama.core.architecture.appBase.OnFragmentBackgroundListener
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.setCommonNavigator
import com.ama.core.architecture.util.setDataOrAdapter
import com.ama.core.common.util.asSafe
import com.blankj.utilcode.util.ActivityUtils
import com.vididin.real.money.game.R
import com.gamedog.vididin.VidiConst
import com.gamedog.vididin.VididinEvents
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.config.PushContent
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.vididin.real.money.game.R
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.MainViewModel as ViewModel
import com.vididin.real.money.game.databinding.ActivityMainBinding as ViewBinding
@AndroidEntryPoint
class MainActivity : AppViewsActivity<ViewBinding, UiState, ViewModel>(), OnTabStyleListener {
private lateinit var mAppInstallReceiver: AppInstallReceiver
private lateinit var mPowerReceiver: BroadcastReceiver
private lateinit var activityLauncher: ActivityLauncher
override val mViewModel: ViewModel by viewModels()
private lateinit var navigatorAdapter: MainTabsAdapter
@ -91,6 +93,7 @@ class MainActivity : AppViewsActivity<ViewBinding, UiState, ViewModel>(), OnTabS
mDateChangeReceiver = DateChangeReceiver()
val filter = IntentFilter(Intent.ACTION_DATE_CHANGED)
registerReceiver(mDateChangeReceiver, filter)
registerReceivers()
onBackPressedDispatcher.addCallback(this@MainActivity) {
if (mViewModel.canBack) {
@ -153,6 +156,7 @@ class MainActivity : AppViewsActivity<ViewBinding, UiState, ViewModel>(), OnTabS
override fun onDestroy() {
super.onDestroy()
unregisterReceiver(mDateChangeReceiver)
unregisterReceivers()
}
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 {

View File

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

View File

@ -49,6 +49,8 @@ class NotificationCheckController private constructor() {
UNLOCK("local_push"), // 解锁通知
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"
APPINSTALL("app_install"),
CHARGE("charge"),
KEEPALIVE("local_push"), // 保活通知(无间隔限制)
FCM("firebase_push"), // FCM 推送通知(无间隔限制)
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.RESIDENT -> "常驻通知"
NotificationCheckController.NotificationType.FIXTIMEPOINT -> "固定时间点通知"
NotificationCheckController.NotificationType.APPINSTALL -> "APP安装卸载"
NotificationCheckController.NotificationType.CHARGE -> "手机充电"
}
DataReportManager.reportData("Notific_Pull", mapOf("topic" to "localPush"))
@ -331,6 +333,14 @@ class NotificationTimingController private constructor() : LifecycleObserver {
NotificationCheckController.NotificationType.FIXTIMEPOINT -> {
showNotifyRandom()
}
NotificationCheckController.NotificationType.APPINSTALL -> {
showNotifyRandom()
}
NotificationCheckController.NotificationType.CHARGE -> {
showNotifyRandom()
}
}