- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们正在开发一个在前台服务中运行 MQTT 的应用程序。问题出在小米红米 Note 7 上,在我们终止应用程序后,该服务被终止,但在其他品牌上它工作正常。我没有在 Oppo 和 Vivo 上测试该应用程序,但当我搜索时它们也有问题。在服务的 onCreate
方法中,我调用了 startForeground(NOTIFICATION_ID, notification)
,我在 list 中的服务声明如下
<service
android:name=".service.mqtt.MqttService"
android:enabled="true"
android:exported="false"
android:foregroundServiceType="location" />
我还将 foregroundServiceType
更改为 connectedDevice|dataSync|mediaPlayback
并添加 android:stopWithTask="false"
并返回 START_STICKY
在服务的 onStartCommand
方法中,但仍然不起作用。
最佳答案
终于找到答案了here
private static final Intent[] POWERMANAGER_INTENTS = {
new Intent().setComponent(new ComponentName("com.miui.securitycenter", "com.miui.permcenter.autostart.AutoStartManagementActivity")),
new Intent().setComponent(new ComponentName("com.letv.android.letvsafe", "com.letv.android.letvsafe.AutobootManageActivity")),
new Intent().setComponent(new ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.startupmgr.ui.StartupNormalAppListActivity")),
new Intent().setComponent(new ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.optimize.process.ProtectActivity")),
new Intent().setComponent(new ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.appcontrol.activity.StartupAppControlActivity")),
new Intent().setComponent(new ComponentName("com.coloros.safecenter", "com.coloros.safecenter.permission.startup.StartupAppListActivity")),
new Intent().setComponent(new ComponentName("com.coloros.safecenter", "com.coloros.safecenter.startupapp.StartupAppListActivity")),
new Intent().setComponent(new ComponentName("com.oppo.safe", "com.oppo.safe.permission.startup.StartupAppListActivity")),
new Intent().setComponent(new ComponentName("com.iqoo.secure", "com.iqoo.secure.ui.phoneoptimize.AddWhiteListActivity")),
new Intent().setComponent(new ComponentName("com.iqoo.secure", "com.iqoo.secure.ui.phoneoptimize.BgStartUpManager")),
new Intent().setComponent(new ComponentName("com.vivo.permissionmanager", "com.vivo.permissionmanager.activity.BgStartUpManagerActivity")),
new Intent().setComponent(new ComponentName("com.samsung.android.lool", "com.samsung.android.sm.ui.battery.BatteryActivity")),
new Intent().setComponent(new ComponentName("com.htc.pitroad", "com.htc.pitroad.landingpage.activity.LandingPageActivity")),
new Intent().setComponent(new ComponentName("com.asus.mobilemanager", "com.asus.mobilemanager.MainActivity"))
};
for (Intent intent : POWERMANAGER_INTENTS)
if (getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY) != null) {
// show dialog to ask user action
break;
}
编辑:检查用户是否启用自动启动也存在问题。据我搜索,目前没有可用的解决方案。所以我自己设计了一个解决方案。我创建了一个工作程序,它将每 25 分钟在首选项中节省系统时间。每次打开应用程序时,我都会检查首选项,如果距保存时间超过 30 分钟,则意味着工作人员无法完成工作,因此可能用户上次没有启用自动启动,必须再次提示。
class BackgroundCheckWorker(val appContext: Context, val workerParams: WorkerParameters) :
Worker(appContext, workerParams), KoinComponent {
override fun doWork(): Result {
val pref = appContext.getSharedPreferences(PermissionHandler.AUTO_START_PREF, Context.MODE_PRIVATE)
val editor = pref.edit()
editor.putString(AUTO_START_PREF_KEY, Calendar.getInstance().time.toString())
editor.apply()
return Result.success()
}
}
在启动中我调用这个函数:
fun requestUnrestrictedBackgroundService(context: Activity): Boolean {
val pref = context.getSharedPreferences(AUTO_START_PREF, Context.MODE_PRIVATE)
var updated = false
val lastUpdate = pref.getString(AUTO_START_PREF_KEY, "")
updated = if (lastUpdate == null || lastUpdate == "") {
val editor = pref.edit()
editor.putString(AUTO_START_PREF_KEY, Calendar.getInstance().time.toString())
editor.apply()
false
} else lastUpdate != "" &&
DateUtil.minAgo(lastUpdate) <= 30
if (!updated) {
for (intent in POWERMANAGER_INTENTS)
if (context.packageManager.resolveActivity(
intent,
PackageManager.MATCH_DEFAULT_ONLY
) != null
) {
val dialog = AlertDialog.Builder(context)
dialog.setMessage("On this device you must allow us to run services in background")
.setPositiveButton("Yes") { paramDialogInterface, paramInt ->
val editor = pref.edit()
editor.putString(AUTO_START_PREF_KEY, Calendar.getInstance().time.toString())
editor.apply()
context.startActivityForResult(intent, 1234)
}
.setNegativeButton("Cancel") { paramDialogInterface, paramInt -> context.finish() }
dialog.show()
return false
}
}
return true
}
关于android - 小米和 Oppo 的后台服务受到限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59442078/
我看到很多关于检测黑暗模式的问题,比如 this one在堆栈溢出上访问了许多媒体博客,如 How to know when you’re using dark mode programmatical
我有一个非常奇怪的问题。我正在从画廊中挑选一张图片,该代码在诺基亚 6、一加 X 等所有设备上都能正常工作。当它 来到小米设备图像未设置ImageView . 谁能帮我解决这个问题? 我必须选择多个图
我研究 Android 应用程序的开发。遇到了某个问题,为了解决这个问题我已经拥有了几乎所有的资源。问题是这样的:在一些制造商小米、魅族、华为的设备上(发现甚至在一些三星和华硕设备上的信息)其固件安装
我使用 Theme.SplashScreen 实现了 Android 12 的新启动画面。但它不适用于具有 force dark 模式的 Xiaomi MIUI 设备。android:forceDar
小米 Redmi Note 3,当您从后台清除应用程序时,任何使用代码创建的自定义服务将被禁用,问题不会发生在三星和其他手机上,但会发生在类似的手机上。 最佳答案 您需要将您的应用程序添加到“ pro
小米官方信息显示,除小米电视 1 代、小米盒子 1 代、部分定制电视外,MIUI for TV 3.0已更新至所有小米电视及小米盒子。 ▲MIUI for TV 3.0 | 图源:小米 小米
我正在尝试代理来自 Android One 手机 - 小米 a1 的流量。我安装了证书,在设置中随处允许使用这些证书,在 Charles 本身中为指定域启用了 SSL 代理。 但每次流量开始通过 Ch
我看到下一行出现奇怪的崩溃: java.lang.NoSuchMethodError: org.apache.commons.lang3.builder.EqualsBuilder.a 是的,我使用
我正在使用前台服务来跟踪用户的位置,但它在 OPPO VIVO 和 XIOAMI MIUI 等少数设备上停止。 读完一些文章后,我尝试了一些事情,比如对于OPPO1:打开启动管理器2:关闭后台卡住、异
使用 redmi note 4 通过 appium 进行移动自动化测试。每次执行测试时,它都会要求通过 USB 安装此应用程序并记住我的选择单选按钮。我在开发者选项中启用了以下选项: USB Debu
我是一名优秀的程序员,十分优秀!