当前位置: 首页 > 知识库问答 >
问题:

华为设备杀死我的前台服务,即使有DontKillMyApp.com的解决方案

法和安
2023-03-14

它是用一个简单的前台服务实现的。

最近几个月,我在华为设备上随机收到用户报告的服务停止错误。首先,我认为这是某种罕见的/新的碰撞在较新的机器人上,但没有任何错误日志在织物上。

我在一台新的华为设备上尝试了它,让我最惊讶的是,这种现象确实存在。华为设备(带有EMUI)确实在几分钟后杀死了前台服务。

我知道https://dontkillmyapp.com/,这是一个很好的网站来获取关于这个问题的信息。

我已经尝试过他们的解决方案--基本上是在我的服务中添加一个带有特定标签的wakelock,这样华为的EMUI就不会杀死它。

我已经用下面的方式尝试过了,但是我的华为测试设备在几分钟后仍然会杀死我的前台服务。

 private void acquireLock() {

    if (wakeLock == null) {
        PowerManager mgr = (PowerManager) getSystemService(Context.POWER_SERVICE);
        if (mgr != null) {

            if (Build.MANUFACTURER.toLowerCase().equals("huawei")) {
                lockTag = "LocationManagerService";
            }

            wakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, lockTag);

            Log.i("MY_TAG", "tag:" + lockTag);
        }
    }
    if (wakeLock != null && !wakeLock.isHeld()) {
        wakeLock.acquire();
        //also tried with: wakeLock.acquire(1000*60*60*72); 3 days wakelock just in case.
        Log.i("MY_TAG", "wakeLock acquired!");
    }
}

@Override
public void onCreate() {
    acquireLock();
}

如果可以请帮忙,

亚当

共有1个答案

鲁淇
2023-03-14

我有一个类似的问题几个月前,我花了很多时间寻找解决方案,最后我找到了这个(我不知道是否对你有效,但它是帮助我)。

我在自己开发的一个应用程序中实现了一个每分钟恢复用户位置的服务,这个位置保存在设备的sqlite数据库中。我需要应用程序工作总是没有中断。

在测试阶段,我发现一些设备中断了我的代码的执行(就像您的例子一样)。

@SuppressLint({"NewApi", "BatteryLife"})
private void checkOptimization() {
    String packageName = getApplicationContext().getPackageName();
    PowerManager pm = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE);
    if (pm != null) {
        if (!pm.isIgnoringBatteryOptimizations(packageName)) {
                Intent intent = new Intent();
                intent.setAction(ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
                intent.setData(Uri.parse("package:" + ctx.getPackageName()));
                ctx.startActivity(intent);
        } else {
            new initialize().execute();
        }
    }
}
android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS  
 类似资料:
  • 我开发了一个名为MultiCountdown Timer的Android应用程序,在这个应用程序中,我们可以同时启动多个计时器。该应用程序在后台运行,使用前台服务,以便连续运行,并覆盖Android的打瞌睡模式。 这是我在manifest.xml中的活动。 我就是这样称呼我的警报活动的。 这是我在创建中的警报活动 4)使用Don't KillmyApp解决方案在Wake Lock中使用Locati

  • 问题内容: 如何杀死linux中最后一个生成的后台任务? 例: 问题答案: bash中有一个特殊的变量: $!扩展为在后台执行的最后一个进程的PID。

  • 我的线程基本上是一些动作的循环。 我在循环中设置了一些检查,基本上检查布尔值是否仍然为真。布尔值在启动服务时设置为true,在停止服务时设置为false。更具体地说,我在我的服务类的ondestory()方法中将布尔值设置为false。 示例: 问题在于,当系统停止服务时,不会调用方法。那么,当服务不再运行时,如何正确地停止线程?

  • 问题内容: 不管我做什么,如果没有立即使用其他PID弹出另一个实例,我似乎都无法杀死Redis -我检查以确保自己正在杀死父进程,并且确实如此。有什么建议么??我已经尝试过重启机器。 问题答案: 弄清楚了!原来当我尝试了这样的SO帖子提供的第二个答案的时候,我做了然后跑了,当我实际上应该跑的时候。我不知道为什么这很重要。

  • 从操作系统概念 5.8.2使用显示器的餐饮哲学家解决方案 接下来,我们通过对用餐哲学家问题提出一个无死锁的解决方案来说明监控概念。这个解决方案施加了一个限制,即哲学家只有在筷子都可用的情况下才能拿起筷子。为了给这个解决方案编码,我们需要区分我们可能找到哲学家的三种状态。为此,我们引入以下数据结构: 哲学家只有当她的两个邻居不吃饭时,我才能设置变量